-
Notifications
You must be signed in to change notification settings - Fork 222
/
shader.cpp
116 lines (92 loc) · 2.84 KB
/
shader.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
#include "shader.h"
namespace sparky { namespace graphics {
Shader::Shader(const char* vertPath, const char* fragPath)
: m_VertPath(vertPath), m_FragPath(fragPath)
{
m_ShaderID = load();
}
Shader::~Shader()
{
glDeleteProgram(m_ShaderID);
}
GLuint Shader::load()
{
GLuint program = glCreateProgram();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
std::string vertSourceString = FileUtils::read_file(m_VertPath);
std::string fragSourceString = FileUtils::read_file(m_FragPath);
const char* vertSource = vertSourceString.c_str();
const char* fragSource = fragSourceString.c_str();
glShaderSource(vertex, 1, &vertSource, NULL);
glCompileShader(vertex);
GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cout << "Failed to compile vertex shader!" << std::endl << &error[0] << std::endl;
glDeleteShader(vertex);
return 0;
}
glShaderSource(fragment, 1, &fragSource, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment, length, &length, &error[0]);
std::cout << "Failed to compile fragment shader!" << std::endl << &error[0] << std::endl;
glDeleteShader(fragment);
return 0;
}
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vertex);
glDeleteShader(fragment);
return program;
}
GLint Shader::getUniformLocation(const GLchar* name)
{
return glGetUniformLocation(m_ShaderID, name);
}
void Shader::setUniform1f(const GLchar* name, float value)
{
glUniform1f(getUniformLocation(name), value);
}
void Shader::setUniform1i(const GLchar* name, int value)
{
glUniform1i(getUniformLocation(name), value);
}
void Shader::setUniform2f(const GLchar* name, const maths::vec2& vector)
{
glUniform2f(getUniformLocation(name), vector.x, vector.y);
}
void Shader::setUniform3f(const GLchar* name, const maths::vec3& vector)
{
glUniform3f(getUniformLocation(name), vector.x, vector.y, vector.z);
}
void Shader::setUniform4f(const GLchar* name, const maths::vec4& vector)
{
glUniform4f(getUniformLocation(name), vector.x, vector.y, vector.z, vector.w);
}
void Shader::setUniformMat4(const GLchar* name, const maths::mat4& matrix)
{
glUniformMatrix4fv(getUniformLocation(name), 1, GL_FALSE, matrix.elements);
}
void Shader::enable() const
{
glUseProgram(m_ShaderID);
}
void Shader::disable() const
{
glUseProgram(0);
}
} }