-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShader.cpp
More file actions
114 lines (95 loc) · 2.95 KB
/
Shader.cpp
File metadata and controls
114 lines (95 loc) · 2.95 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
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
#include "Shader.h"
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "Renderer.h"
Shader::Shader() : m_RendererID(0)
{
string vertexShaderSource = ParseShader("res/shaders/vertex.shader").str();
string fragmentShaderSource = ParseShader("res/shaders/fragment.shader").str();
m_RendererID = CreateShader(vertexShaderSource, fragmentShaderSource);
}
Shader::~Shader()
{
glDeleteProgram(m_RendererID);
}
void Shader::Bind() const
{
GLCall(glUseProgram(m_RendererID));
}
void Shader::UnBind() const
{
GLCall(glUseProgram(0));
}
int Shader::GetUniformLocation(const string& name)
{
if (m_UniformLocationCache.find(name) != m_UniformLocationCache.end())
{
return m_UniformLocationCache[name];
}
GLCall(int location = glGetUniformLocation(m_RendererID, name.c_str()));
if (location == -1)
{
cout << "Warning: uniform " << name << " doesn't exist" << endl;
}
m_UniformLocationCache[name] = location;
return location;
}
void Shader::SetUniform4f(const string& name, float v0, float v1, float v2, float v3)
{
GLCall(glUniform4f(GetUniformLocation(name), v0, v1, v2, v3));
}
void Shader::SetUniformMat4f(const string& name, const glm::mat4 matrix)
{
GLCall(glUniformMatrix4fv(GetUniformLocation(name), 1, GL_FALSE, &matrix[0][0]));
}
void Shader::SetUniform1i(const string& name, int value)
{
GLCall(glUniform1i(GetUniformLocation(name), value));
}
stringstream Shader::ParseShader(const std::string& filepath)
{
std::ifstream stream(filepath);
std::string line;
std::stringstream ss;
while (getline(stream, line))
{
ss << line << "\n";
}
return ss;
}
unsigned int Shader::CompileShader(unsigned int type, const std::string& source)
{
GLCall(unsigned int id = glCreateShader(type));
const char* src = source.c_str();
GLCall(glShaderSource(id, 1, &src, nullptr);)
GLCall(glCompileShader(id);)
int result;
GLCall(glGetShaderiv(id, GL_COMPILE_STATUS, &result);)
if (result == GL_FALSE)
{
int length;
GLCall(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);)
char* message = (char*)alloca(length * sizeof(char));
GLCall(glGetShaderInfoLog(id, length, &length, message);)
std::cout << "Failed to compile " << std::endl;
std::cout << message << std::endl;
GLCall(glDeleteShader(id);)
return 0;
}
return id;
}
unsigned int Shader::CreateShader(const std::string& vertexShader, const std::string& fragmentShader)
{
GLCall(unsigned int program = glCreateProgram();)
unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
GLCall(glAttachShader(program, vs);)
GLCall(glAttachShader(program, fs);)
GLCall(glLinkProgram(program);)
GLCall(glValidateProgram(program);)
GLCall(glDeleteShader(vs);)
GLCall(glDeleteShader(fs);)
return program;
}