PeriDyno 1.0.0
Loading...
Searching...
No Matches
Shader.cpp
Go to the documentation of this file.
1#include "Shader.h"
2
3#include <glad/glad.h>
4#include <fstream>
5
6namespace dyno {
7
8 bool Shader::createFromSource(unsigned int type, const std::string& src)
9 {
10 const static char* path = "/";
11
12 const char* source = src.c_str();
13 // create shader
14 GLuint shader = glCreateShader(type);
15 glShaderSource(shader, 1, &source, 0);
16 glCompileShaderIncludeARB(shader, 1, &path, 0);
17
18 // check error
19 GLint success;
20 GLchar infoLog[2048];
21 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
22 if (!success)
23 {
24 glGetShaderInfoLog(shader, 2048, NULL, infoLog);
25 printf("Shader Compiling Error:\n%s\n", infoLog);
26 return false;
27 }
28
29 id = shader;
31
32 return true;
33 }
34
35 bool Shader::createFromSPIRV(unsigned int type, const void* src, const size_t len)
36 {
37 // create shader
38 GLuint shader = glCreateShader(type);
39
40 glShaderBinary(1, &shader, GL_SHADER_BINARY_FORMAT_SPIR_V, src, len);
41 glSpecializeShader(shader, "main", 0, 0, 0);
42
43 // check error
44 GLint success;
45 GLchar infoLog[2048];
46 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
47 if (!success)
48 {
49 glGetShaderInfoLog(shader, 2048, NULL, infoLog);
50 printf("Shader Compiling Error:\n%s\n", infoLog);
51 return false;
52 }
53
54 id = shader;
56
57 return true;
58 }
59
60 bool Shader::createFromFile(unsigned int type, const std::string& file)
61 {
62 // read file content
63 std::ifstream ifs(file);
64 std::string content((std::istreambuf_iterator<char>(ifs)),
65 (std::istreambuf_iterator<char>()));
66 const char* source = content.c_str();
67
68 if (createFromSource(type, content))
69 return true;
70
71 printf("Failed to compile shader from file: %s\n", file.c_str());
72 return false;
73 }
74
76 {
77 if (0xFFFFFFFF == id)
78 return;
79 glDeleteShader(id);
81
82 // reset object id
83 id = GL_INVALID_INDEX;
84 }
85
86
88 {
89 id = glCreateProgram();
90 }
91
93 {
94 glDeleteProgram(id);
95
96 // reset object id
97 id = GL_INVALID_INDEX;
98 }
99
100 void Program::attachShader(const Shader& shader)
101 {
102 glAttachShader(id, shader.id);
103 }
104
106 {
107 glLinkProgram(id);
108
109 GLint success;
110 GLchar infoLog[2048];
111 glGetProgramiv(id, GL_LINK_STATUS, &success);
112 if (!success) {
113 glGetProgramInfoLog(id, 2048, NULL, infoLog);
114 printf("Shader Program Linking Error:\n%s\n", infoLog);
115 return false;
116 }
117
118 return true;
119 }
120
122 {
123 glUseProgram(id);
124 }
125
126 void Program::setFloat(const char* name, float v)
127 {
128 GLuint location = glGetUniformLocation(id, name);
129 glUniform1f(location, v);
130 }
131
132 void Program::setInt(const char* name, int v)
133 {
134 GLuint location = glGetUniformLocation(id, name);
135 glUniform1i(location, v);
136 }
137
138 void Program::setVec2(const char* name, dyno::Vec2f v)
139 {
140 GLuint location = glGetUniformLocation(id, name);
141 glUniform2f(location, v[0], v[1]);
142 }
143
144 void Program::setVec3(const char* name, dyno::Vec3f v)
145 {
146 GLuint location = glGetUniformLocation(id, name);
147 glUniform3f(location, v[0], v[1], v[2]);
148 }
149
150 void Program::setVec4(const char* name, dyno::Vec4f v)
151 {
152 GLuint location = glGetUniformLocation(id, name);
153 glUniform4f(location, v[0], v[1], v[2], v[3]);
154 }
155
156
157 Program* Program::createProgram(const char* vs, const char* fs, const char* gs)
158 {
159 Program* program = new Program;
160 program->create();
161
162 Shader vshader;
163 Shader fshader;
164 Shader gshader;
165
166 if (vs != 0)
167 {
168 if (vshader.createFromSource(GL_VERTEX_SHADER, vs))
169 program->attachShader(vshader);
170 else
171 printf("Failed to compile shader: %s\n", vs);
172 }
173
174 if (fs != 0)
175 {
176 if (fshader.createFromSource(GL_FRAGMENT_SHADER, fs))
177 program->attachShader(fshader);
178 else
179 printf("Failed to compile shader: %s\n", fs);
180 }
181
182 if (gs != 0)
183 {
184 if (gshader.createFromSource(GL_GEOMETRY_SHADER, gs))
185 program->attachShader(gshader);
186 else
187 printf("Failed to compile shader: %s\n", gs);
188 }
189
190 if (!program->link())
191 {
192 printf("Failed to link shader program: %s\n", fs);
193 }
194
195 vshader.release();
196 fshader.release();
197 gshader.release();
198
199 return program;
200 }
201
203 const void* vs, size_t vs_len,
204 const void* fs, size_t fs_len,
205 const void* gs, size_t gs_len)
206 {
207 Program* program = new Program;
208 program->create();
209
210 Shader vshader;
211 Shader fshader;
212 Shader gshader;
213
214 if (vs != 0)
215 {
216 if (vshader.createFromSPIRV(GL_VERTEX_SHADER, vs, vs_len))
217 program->attachShader(vshader);
218 else
219 printf("Failed to compile shader: %s\n", vs);
220 }
221
222 if (fs != 0)
223 {
224 if (fshader.createFromSPIRV(GL_FRAGMENT_SHADER, fs, fs_len))
225 program->attachShader(fshader);
226 else
227 printf("Failed to compile shader: %s\n", fs);
228 }
229
230 if (gs != 0)
231 {
232 if (gshader.createFromSPIRV(GL_GEOMETRY_SHADER, gs, gs_len))
233 program->attachShader(gshader);
234 else
235 printf("Failed to compile shader: %s\n", gs);
236 }
237
238 if (!program->link())
239 {
240 printf("Failed to link shader program: %s\n", fs);
241 }
242
243 vshader.release();
244 fshader.release();
245 gshader.release();
246
247 return program;
248 }
249}
250
#define glCheckError()
void setFloat(const char *name, float v)
Definition Shader.cpp:126
static Program * createProgramSPIRV(const void *vs, size_t vs_len, const void *fs, size_t fs_len, const void *gs=0, size_t gs_len=0)
Definition Shader.cpp:202
void create()
Definition Shader.cpp:87
void setVec2(const char *name, dyno::Vec2f v)
Definition Shader.cpp:138
static Program * createProgram(const char *vs, const char *fs, const char *gs=0)
Definition Shader.cpp:157
void release()
Definition Shader.cpp:92
void setInt(const char *name, int v)
Definition Shader.cpp:132
void setVec4(const char *name, dyno::Vec4f v)
Definition Shader.cpp:150
void setVec3(const char *name, dyno::Vec3f v)
Definition Shader.cpp:144
bool link()
Definition Shader.cpp:105
void attachShader(const Shader &shader)
Definition Shader.cpp:100
bool createFromSPIRV(unsigned int type, const void *spirv, const size_t len)
Definition Shader.cpp:35
void release()
Definition Shader.cpp:75
bool createFromFile(unsigned int type, const std::string &path)
Definition Shader.cpp:60
bool createFromSource(unsigned int type, const std::string &src)
Definition Shader.cpp:8
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Vector< float, 2 > Vec2f
Definition Vector2D.h:81
Vector< float, 4 > Vec4f
Definition Vector4D.h:86
Vector< float, 3 > Vec3f
Definition Vector3D.h:93