shader.h
Go to the documentation of this file.
1 /*
2 * ECVL - European Computer Vision Library
3 * Version: 0.3.4
4 * copyright (c) 2021, Università degli Studi di Modena e Reggio Emilia (UNIMORE), AImageLab
5 * Authors:
6 * Costantino Grana (costantino.grana@unimore.it)
7 * Federico Bolelli (federico.bolelli@unimore.it)
8 * Michele Cancilla (michele.cancilla@unimore.it)
9 * Laura Canalini (laura.canalini@unimore.it)
10 * Stefano Allegretti (stefano.allegretti@unimore.it)
11 * All rights reserved.
12 */
13 
14 #ifndef ECVL_SHADER_H
15 #define ECVL_SHADER_H
16 
17 #include <glm/glm.hpp>
18 
19 #include <string>
20 #include <iostream>
21 
22 namespace ecvl {
23 
24 struct Shader {
25 public:
26  unsigned int ID;
27  // constructor generates the shader on the fly
28  // ------------------------------------------------------------------------
30  {
31  }
32 
33  void init(const std::string& vertexCode, const std::string& fragmentCode/*, const std::string& geometryCode = nullptr*/)
34  {
35  // 1. retrieve the vertex/fragment source code from filePath
36  const char* vShaderCode = vertexCode.c_str();
37  const char* fShaderCode = fragmentCode.c_str();
38  // 2. compile shaders
39  unsigned int vertex, fragment;
40  // vertex shader
41  vertex = glCreateShader(GL_VERTEX_SHADER);
42  glShaderSource(vertex, 1, &vShaderCode, NULL);
43  glCompileShader(vertex);
44  checkCompileErrors(vertex, "VERTEX");
45  // fragment Shader
46  fragment = glCreateShader(GL_FRAGMENT_SHADER);
47  glShaderSource(fragment, 1, &fShaderCode, NULL);
48  glCompileShader(fragment);
49  checkCompileErrors(fragment, "FRAGMENT");
50 
51  // shader Program
52  ID = glCreateProgram();
53  glAttachShader(ID, vertex);
54  glAttachShader(ID, fragment);
55 
56  glLinkProgram(ID);
57  checkCompileErrors(ID, "PROGRAM");
58  // delete the shaders as they're linked into our program now and no longer necessery
59  glDeleteShader(vertex);
60  glDeleteShader(fragment);
61  }
62 
63  // activate the shader
64  // ------------------------------------------------------------------------
65  void use()
66  {
67  glUseProgram(ID);
68  }
69  // utility uniform functions
70  // ------------------------------------------------------------------------
71  void setBool(const std::string& name, bool value) const
72  {
73  glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
74  }
75  // ------------------------------------------------------------------------
76  void setInt(const std::string& name, int value) const
77  {
78  glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
79  }
80  // ------------------------------------------------------------------------
81  void setFloat(const std::string& name, float value) const
82  {
83  glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
84  }
85  // ------------------------------------------------------------------------
86  void setVec2(const std::string& name, const glm::vec2& value) const
87  {
88  glUniform2fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
89  }
90  void setVec2(const std::string& name, float x, float y) const
91  {
92  glUniform2f(glGetUniformLocation(ID, name.c_str()), x, y);
93  }
94  // ------------------------------------------------------------------------
95  void setVec3(const std::string& name, const glm::vec3& value) const
96  {
97  glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
98  }
99  void setVec3(const std::string& name, float x, float y, float z) const
100  {
101  glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z);
102  }
103  // ------------------------------------------------------------------------
104  void setVec4(const std::string& name, const glm::vec4& value) const
105  {
106  glUniform4fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
107  }
108  void setVec4(const std::string& name, float x, float y, float z, float w)
109  {
110  glUniform4f(glGetUniformLocation(ID, name.c_str()), x, y, z, w);
111  }
112  // ------------------------------------------------------------------------
113  void setMat2(const std::string& name, const glm::mat2& mat) const
114  {
115  glUniformMatrix2fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
116  }
117  // ------------------------------------------------------------------------
118  void setMat3(const std::string& name, const glm::mat3& mat) const
119  {
120  glUniformMatrix3fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
121  }
122  // ------------------------------------------------------------------------
123  void setMat4(const std::string& name, const glm::mat4& mat) const
124  {
125  glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
126  }
127 
128 private:
129  // utility function for checking shader compilation/linking errors.
130  // ------------------------------------------------------------------------
131  void checkCompileErrors(GLuint shader, std::string type)
132  {
133  GLint success;
134  GLchar infoLog[1024];
135  if (type != "PROGRAM")
136  {
137  glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
138  if (!success)
139  {
140  glGetShaderInfoLog(shader, 1024, NULL, infoLog);
141  std::cerr << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
142  }
143  }
144  else
145  {
146  glGetProgramiv(shader, GL_LINK_STATUS, &success);
147  if (!success)
148  {
149  glGetProgramInfoLog(shader, 1024, NULL, infoLog);
150  std::cerr << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
151  }
152  }
153  }
154 };
155 
156 }
157 
158 #endif // ECVL_SHADER_H
159 
void setVec3(const std::string &name, const glm::vec3 &value) const
Definition: shader.h:95
void setInt(const std::string &name, int value) const
Definition: shader.h:76
void setMat2(const std::string &name, const glm::mat2 &mat) const
Definition: shader.h:113
void use()
Definition: shader.h:65
void init(const std::string &vertexCode, const std::string &fragmentCode)
Definition: shader.h:33
void setFloat(const std::string &name, float value) const
Definition: shader.h:81
void setVec4(const std::string &name, float x, float y, float z, float w)
Definition: shader.h:108
void setVec2(const std::string &name, float x, float y) const
Definition: shader.h:90
void setVec2(const std::string &name, const glm::vec2 &value) const
Definition: shader.h:86
unsigned int ID
Definition: shader.h:26
void setVec3(const std::string &name, float x, float y, float z) const
Definition: shader.h:99
void setVec4(const std::string &name, const glm::vec4 &value) const
Definition: shader.h:104
void setMat4(const std::string &name, const glm::mat4 &mat) const
Definition: shader.h:123
void setMat3(const std::string &name, const glm::mat3 &mat) const
Definition: shader.h:118
void setBool(const std::string &name, bool value) const
Definition: shader.h:71