-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFirePartShader.cpp
More file actions
78 lines (64 loc) · 2.66 KB
/
FirePartShader.cpp
File metadata and controls
78 lines (64 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "FirePartShader.h"
FirePartShader::FirePartShader() {
// Set up shaders
// Create a shader from vertex program source code
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &source_vpart, NULL);
glCompileShader(vs);
// Check if shader compiled successfully
GLint status;
glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
char buffer[512];
glGetShaderInfoLog(vs, 512, NULL, buffer);
throw(std::ios_base::failure(std::string("Error compiling vertex shader: ") + std::string(buffer)));
}
// Create a shader from the fragment program source code
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &source_fp, NULL);
glCompileShader(fs);
// Check if shader compiled successfully
glGetShaderiv(fs, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
char buffer[512];
glGetShaderInfoLog(fs, 512, NULL, buffer);
throw(std::ios_base::failure(std::string("Error compiling fragment shader: ") + std::string(buffer)));
}
// Create a shader program linking both vertex and fragment shaders
// together
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vs);
glAttachShader(shaderProgram, fs);
glLinkProgram(shaderProgram);
// Check if shaders were linked successfully
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);
if (status != GL_TRUE) {
char buffer[512];
glGetShaderInfoLog(shaderProgram, 512, NULL, buffer);
throw(std::ios_base::failure(std::string("Error linking shaders: ") + std::string(buffer)));
}
// Delete memory used by shaders, since they were already compiled
// and linked
glDeleteShader(vs);
glDeleteShader(fs);
attributeBinding();
}
void FirePartShader::attributeBinding() {
// Set attributes for shaders
// Should be consistent with how we created the buffers for the particle elements
GLint vertex_att = glGetAttribLocation(shaderProgram, "vertex");
glVertexAttribPointer(vertex_att, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(vertex_att);
GLint dir_att = glGetAttribLocation(shaderProgram, "dir");
glVertexAttribPointer(dir_att, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (void *)(2 * sizeof(GLfloat)));
glEnableVertexAttribArray(dir_att);
GLint time_att = glGetAttribLocation(shaderProgram, "t");
glVertexAttribPointer(time_att, 1, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (void *)(4 * sizeof(GLfloat)));
glEnableVertexAttribArray(time_att);
GLint tex_att = glGetAttribLocation(shaderProgram, "uv");
glVertexAttribPointer(tex_att, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (void *)(5 * sizeof(GLfloat)));
glEnableVertexAttribArray(tex_att);
}
FirePartShader::~FirePartShader() {
glDeleteProgram(shaderProgram);
}