-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshaders.cpp
138 lines (113 loc) · 3.98 KB
/
shaders.cpp
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "shaders.h"
Shader::Shader() { ID = -1; }
Shader::Shader(const char* vertexPath, const char* fragmentPath)
{
// 1. retreive the vertex/fragment source code from filePath
std::string vertexCode;
std::string fragmentCode;
std::ifstream vertexShaderFile;
std::ifstream fragmentShaderFile;
// ensure ifstream objects can throw exceptions
vertexShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
fragmentShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try
{
vertexShaderFile.open(vertexPath);
fragmentShaderFile.open(fragmentPath);
std::stringstream vertexShaderStream;
std::stringstream fragmentShaderStream;
vertexShaderStream << vertexShaderFile.rdbuf();
fragmentShaderStream << fragmentShaderFile.rdbuf();
vertexShaderFile.close();
fragmentShaderFile.close();
vertexCode = vertexShaderStream.str();
fragmentCode = fragmentShaderStream.str();
} catch (std::ifstream::failure e)
{
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ" << std::endl;
}
const char* vertexShaderCode = vertexCode.c_str();
const char* fragmentShaderCode = fragmentCode.c_str();
// 2. compile shaders
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderCode, NULL);
glCompileShader(vertexShader);
int success_vertex;
char infoLog_vertex[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success_vertex);
if (!success_vertex)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog_vertex);
std::cout << "ERROR::" << vertexPath << "::COMPILATION_FAILED\n"
<< infoLog_vertex << std::endl;
}
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderCode, NULL);
glCompileShader(fragmentShader);
int success_fragment;
char infoLog_fragment[512];
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success_fragment);
if (!success_fragment)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog_fragment);
std::cout << "ERROR::" << fragmentPath << "::COMPILATION_FAILED\n"
<< infoLog_fragment << std::endl;
}
ID = glCreateProgram();
glAttachShader(ID, vertexShader);
glAttachShader(ID, fragmentShader);
glLinkProgram(ID);
int success_shaderProgram;
char infoLog_shaderProgram[512];
glGetProgramiv(ID, GL_LINK_STATUS, &success_shaderProgram);
if (!success_shaderProgram)
{
glGetProgramInfoLog(ID, 512, NULL, infoLog_shaderProgram);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n"
<< infoLog_shaderProgram << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
void Shader::use() { glUseProgram(ID); }
void Shader::set1b(const std::string& name, bool value) const
{
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
}
void Shader::set1i(const std::string& name, int value) const
{
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
}
void Shader::set1f(const std::string& name, float value) const
{
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
}
void Shader::set2f(const std::string& name, float value1, float value2) const
{
glUniform2f(glGetUniformLocation(ID, name.c_str()), value1, value2);
}
void Shader::set2f(const std::string& name, glm::vec2 vector) const
{
glUniform2f(glGetUniformLocation(ID, name.c_str()), vector.x, vector.y);
}
void Shader::set3f(const std::string& name, float value1, float value2,
float value3) const
{
glUniform3f(glGetUniformLocation(ID, name.c_str()), value1, value2, value3);
}
void Shader::set3f(const std::string& name, glm::vec3 vector) const
{
glUniform3f(glGetUniformLocation(ID, name.c_str()), vector.x, vector.y,
vector.z);
}
void Shader::set4f(const std::string& name, float value1, float value2,
float value3, float value4) const
{
glUniform4f(glGetUniformLocation(ID, name.c_str()), value1, value2, value3,
value4);
}
void Shader::set1mat4f(const std::string& name, glm::mat4 matrix)
{
glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE,
glm::value_ptr(matrix));
}