diff options
Diffstat (limited to 'src/renderer/shader.cpp')
-rw-r--r-- | src/renderer/shader.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/renderer/shader.cpp b/src/renderer/shader.cpp new file mode 100644 index 0000000..735fc22 --- /dev/null +++ b/src/renderer/shader.cpp | |||
@@ -0,0 +1,84 @@ | |||
1 | #include "shader.h" | ||
2 | #include <fstream> | ||
3 | #include <vector> | ||
4 | #include "util.h" | ||
5 | |||
6 | Shader::Shader(std::string name) | ||
7 | { | ||
8 | GLShader vertexShader(GL_VERTEX_SHADER); | ||
9 | GLShader fragmentShader(GL_FRAGMENT_SHADER); | ||
10 | |||
11 | std::ifstream vertexFile("shaders/" + name + ".vertex"); | ||
12 | std::ifstream fragmentFile("shaders/" + name + ".fragment"); | ||
13 | |||
14 | std::string vertexCode(slurp(vertexFile)); | ||
15 | std::string fragmentCode(slurp(fragmentFile)); | ||
16 | |||
17 | const char* vertexCodePtr = vertexCode.c_str(); | ||
18 | const char* fragmentCodePtr = fragmentCode.c_str(); | ||
19 | |||
20 | glShaderSource(vertexShader.getId(), 1, &vertexCodePtr, nullptr); | ||
21 | glShaderSource(fragmentShader.getId(), 1, &fragmentCodePtr, nullptr); | ||
22 | |||
23 | glCompileShader(vertexShader.getId()); | ||
24 | glCompileShader(fragmentShader.getId()); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | GLint result = GL_FALSE; | ||
28 | int infoLogLength; | ||
29 | |||
30 | glGetShaderiv(vertexShader.getId(), GL_COMPILE_STATUS, &result); | ||
31 | |||
32 | if (result == GL_FALSE) | ||
33 | { | ||
34 | glGetShaderiv(vertexShader.getId(), GL_INFO_LOG_LENGTH, &infoLogLength); | ||
35 | |||
36 | std::vector<char> errMsg(infoLogLength); | ||
37 | glGetShaderInfoLog( | ||
38 | vertexShader.getId(), | ||
39 | infoLogLength, | ||
40 | nullptr, | ||
41 | errMsg.data()); | ||
42 | |||
43 | throw std::gl_error("Could not compile shader", errMsg.data()); | ||
44 | } | ||
45 | |||
46 | glGetShaderiv(fragmentShader.getId(), GL_COMPILE_STATUS, &result); | ||
47 | |||
48 | if (result == GL_FALSE) | ||
49 | { | ||
50 | glGetShaderiv(fragmentShader.getId(), GL_INFO_LOG_LENGTH, &infoLogLength); | ||
51 | |||
52 | std::vector<char> errMsg(infoLogLength); | ||
53 | glGetShaderInfoLog( | ||
54 | fragmentShader.getId(), | ||
55 | infoLogLength, | ||
56 | nullptr, | ||
57 | errMsg.data()); | ||
58 | |||
59 | throw std::gl_error("Could not compile shader", errMsg.data()); | ||
60 | } | ||
61 | #endif | ||
62 | |||
63 | glAttachShader(program_.getId(), vertexShader.getId()); | ||
64 | glAttachShader(program_.getId(), fragmentShader.getId()); | ||
65 | glLinkProgram(program_.getId()); | ||
66 | |||
67 | #ifdef DEBUG | ||
68 | glGetProgramiv(program_.getId(), GL_LINK_STATUS, &result); | ||
69 | |||
70 | if (result == GL_FALSE) | ||
71 | { | ||
72 | glGetProgramiv(program_.getId(), GL_INFO_LOG_LENGTH, &infoLogLength); | ||
73 | |||
74 | std::vector<char> errMsg(infoLogLength); | ||
75 | glGetProgramInfoLog( | ||
76 | program_.getId(), | ||
77 | infoLogLength, | ||
78 | nullptr, | ||
79 | errMsg.data()); | ||
80 | |||
81 | throw std::gl_error("Could not link shader program", errMsg.data()); | ||
82 | } | ||
83 | #endif | ||
84 | } | ||