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