1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 // This software is distributed WITHOUT ANY WARRANTY; without even
6 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7 // PURPOSE. See the above copyright notice for more information.
8 //
9 // Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
10 // Copyright 2014 UT-Battelle, LLC.
11 // Copyright 2014 Los Alamos National Security.
12 //
13 // Under the terms of Contract DE-NA0003525 with NTESS,
14 // the U.S. Government retains certain rights in this software.
15 //
16 // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
17 // Laboratory (LANL), the U.S. Government retains certain rights in
18 // this software.
19 //============================================================================
20
21 #ifndef LOAD_SHADERS
22 #define LOAD_SHADERS
23
24 #if defined(__APPLE__)
25 #include <GLUT/glut.h>
26 #else
27 #include <GL/glut.h>
28 #endif
29
30 namespace shaders
31 {
make_fragment_shader_code()32 static std::string const& make_fragment_shader_code()
33 {
34 static std::string const data = "#version 120\n"
35 "void main(void)"
36 "{"
37 " gl_FragColor = gl_Color;"
38 "}";
39
40 return data;
41 }
42
make_vertex_shader_code()43 static std::string const& make_vertex_shader_code()
44 {
45 static std::string const data = "#version 120\n"
46 "attribute vec3 posAttr;"
47 "uniform mat4 MVP;"
48 "void main()"
49 "{"
50 " vec4 pos = vec4( posAttr, 1.0 );"
51 " gl_FrontColor = gl_Color;"
52 " gl_Position = MVP * pos;"
53 "}";
54
55 return data;
56 }
57 }
58
LoadShaders()59 inline GLuint LoadShaders()
60 {
61 // Create the shaders
62 GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
63 GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
64
65 // Get the Vertex Shader code
66 std::string VertexShaderCode = shaders::make_vertex_shader_code();
67
68 // Get the Fragment Shader code
69 std::string FragmentShaderCode = shaders::make_fragment_shader_code();
70
71 GLint Result = GL_FALSE;
72 int InfoLogLength;
73
74 // Compile Vertex Shader
75 std::cout << "Compiling vertex shader" << std::endl;
76 char const* VertexSourcePointer = VertexShaderCode.c_str();
77 glShaderSource(VertexShaderID, 1, &VertexSourcePointer, nullptr);
78 glCompileShader(VertexShaderID);
79
80 // Check Vertex Shader
81 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
82 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
83 std::vector<char> VertexShaderErrorMessage(static_cast<std::size_t>(InfoLogLength));
84 if (VertexShaderErrorMessage.size() > 0)
85 {
86 glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]);
87 std::cout << &VertexShaderErrorMessage[0] << std::endl;
88 }
89
90 // Compile Fragment Shader
91 std::cout << "Compiling fragment shader" << std::endl;
92 char const* FragmentSourcePointer = FragmentShaderCode.c_str();
93 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, nullptr);
94 glCompileShader(FragmentShaderID);
95
96 // Check Fragment Shader
97 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
98 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
99 std::vector<char> FragmentShaderErrorMessage(static_cast<std::size_t>(InfoLogLength));
100 if (FragmentShaderErrorMessage.size() > 0)
101 {
102 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]);
103 std::cout << &FragmentShaderErrorMessage[0] << std::endl;
104 }
105
106 // Link the program
107 std::cout << "Linking program" << std::endl;
108 GLuint ProgramID = glCreateProgram();
109 glAttachShader(ProgramID, VertexShaderID);
110 glAttachShader(ProgramID, FragmentShaderID);
111 glLinkProgram(ProgramID);
112
113 // Check the program
114 glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
115 glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
116 std::vector<char> ProgramErrorMessage(static_cast<std::size_t>(InfoLogLength));
117 if (ProgramErrorMessage.size() > 0)
118 {
119 glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]);
120 std::cout << &ProgramErrorMessage[0] << std::endl;
121 }
122
123 glDeleteShader(VertexShaderID);
124 glDeleteShader(FragmentShaderID);
125
126 return ProgramID;
127 }
128
129 #endif
130