Number5
Visualisierung 2 Project - Florian Schober (0828151, f.schober@live.com), Andreas Walch (0926780, walch.andreas89@gmail.com)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Shader.cpp
Go to the documentation of this file.
1 #include "Shader.hpp"
2 
3 
4 Shader::Shader(string const & name)
5  : m_name(name)
6  , m_id(0)
7 {
8  m_id = glCreateProgram();
9 
10  if (m_id == 0)
11  {
12  cerr << "ERROR: Failed to create shader program" << endl;
13  exit(EXIT_FAILURE);
14  }
15 
16  auto vs = loadShader("content\\shaders\\" + name + ".vert", GL_VERTEX_SHADER);
17  auto fs = loadShader("content\\shaders\\" + name + ".frag", GL_FRAGMENT_SHADER);
18 
19  glAttachShader(m_id, vs);
20  glAttachShader(m_id, fs);
21 
22  link();
23 
24  glDeleteShader(vs);
25  glDeleteShader(fs);
26 }
27 
29 {
30  glDeleteProgram(m_id);
31  m_id = 0;
32 }
33 
34 int Shader::loadShader(string const & file, GLenum shaderType)
35 {
36  string code = Util::read_file_to_string(file);
37 
38  GLuint id = glCreateShader(shaderType);
39 
40  if ( id == 0 )
41  {
42  stringstream temp;
43 
44  temp << shaderType;
45  string type = temp.str();
46 
47  switch( shaderType )
48  {
49  case GL_FRAGMENT_SHADER: type = string("GL_FRAGMENT_SHADER"); break;
50  case GL_TESS_EVALUATION_SHADER: type = string("GL_TESS_EVALUATION_SHADER"); break;
51  case GL_TESS_CONTROL_SHADER: type = string("GL_TESS_CONTROL_SHADER"); break;
52  case GL_GEOMETRY_SHADER: type = string("GL_GEOMETRY_SHADER"); break;
53  case GL_VERTEX_SHADER: type = string("GL_VERTEX_SHADER"); break;
54  default: break;
55  }
56 
57  temp.str(string());
58 
59  cerr << "ERROR: Loading shader '" << file << "' failed (Shader-type '" << type << "' not supported)" << endl;
60 
61  exit(EXIT_FAILURE);
62  }
63 
64 
65  GLint result = GL_FALSE;
66  int infoLogLength;
67  char const * shaderCodePtr = code.c_str();
68  glShaderSource(id, 1, &shaderCodePtr , nullptr);
69  glCompileShader(id);
70 
71  glGetShaderiv(id, GL_COMPILE_STATUS, &result);
72  if (result != GL_TRUE)
73  {
74  glGetShaderiv(id, GL_INFO_LOG_LENGTH, &infoLogLength);
75 
76  vector<char> errorMessage(infoLogLength);
77  glGetShaderInfoLog(id, infoLogLength, nullptr, &errorMessage[0]);
78 
79  cerr << "ERROR: Loading shader '" << file << "' failed (Compile-error: '" << string(&errorMessage[0]) << "')" << endl;
80 
81  glDeleteShader(id);
82 
83  exit(EXIT_FAILURE);
84  }
85 
86  return id;
87 }
89 {
90  glLinkProgram(m_id);
91 
92  GLint succeded;
93  glGetProgramiv(m_id, GL_LINK_STATUS, &succeded);
94 
95  if (!succeded)
96  {
97  GLint infoLogLength;
98  glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &infoLogLength);
99 
100  vector<char> errorMessage(infoLogLength);
101  glGetProgramInfoLog(m_id, infoLogLength, nullptr, &errorMessage[0]);
102 
103  cerr << "ERROR: Loading shader '" << m_name << "' failed (Link-error: '" << string(&errorMessage[0]) << "')" << endl;
104 
105  exit(EXIT_FAILURE);
106  }
107 }
108 
109 
110 
112 {
113  glUseProgram(m_id);
114 }
115 GLint Shader::uniform(string const & name)
116 {
117  auto found = m_uniforms.find(name);
118  if (found != m_uniforms.end())
119  return found->second;
120 
121  auto& entry = m_uniforms[name];
122  entry = glGetUniformLocation(m_id, name.c_str());
123  return entry;
124 }
125 GLint Shader::uniformBlock(string const & name)
126 {
127  auto found = m_uniforms.find(name);
128  if (found != m_uniforms.end())
129  return found->second;
130 
131  auto& entry = m_uniforms[name];
132  entry = glGetUniformBlockIndex(m_id, name.c_str());
133  return entry;
134 }
135 
136 
137 
138 
139 Shader* Shaders::get(string const & name)
140 {
141  auto found = m_shaders.find(name);
142 
143  if (found != m_shaders.end())
144  return found->second.get();
145 
146  auto& entry = m_shaders[name];
147  entry.reset(new Shader(name));
148  return entry.get();
149 }
void use()
Definition: Shader.cpp:111
string read_file_to_string(string const &filename)
Definition: Util.cpp:3
map< string, unique_ptr< Shader > > m_shaders
Definition: Shader.hpp:136
string m_name
Definition: Shader.hpp:11
~Shader()
Definition: Shader.cpp:28
Shader * get(string const &name)
Definition: Shader.cpp:139
Definition: Shader.hpp:8
map< string, GLint > m_uniforms
Definition: Shader.hpp:12
int loadShader(string const &file, GLenum shaderType)
Definition: Shader.cpp:34
void link()
Definition: Shader.cpp:88
uint m_id
Definition: Shader.hpp:10
GLint uniformBlock(string const &name)
Definition: Shader.cpp:125
Shader(string const &name)
Definition: Shader.cpp:4
GLint uniform(string const &name)
Definition: Shader.cpp:115