-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShaderProgram.cpp
More file actions
88 lines (70 loc) · 2.06 KB
/
Copy pathShaderProgram.cpp
File metadata and controls
88 lines (70 loc) · 2.06 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
#include "ShaderProgram.h"
#include <glm/gtc/type_ptr.hpp>
#include <iostream>
#include <vector>
ShaderProgram::ShaderProgram()
: m_id(GL_NONE)
, m_attachedShaders()
{
}
ShaderProgram::~ShaderProgram()
{
glDeleteProgram(m_id);
}
void ShaderProgram::Create()
{
if (m_id != GL_NONE) glDeleteProgram(m_id);
m_id = glCreateProgram();
}
void ShaderProgram::AttachShader(GLuint id)
{
glAttachShader(m_id, id);
m_attachedShaders.push_back(id);
}
void ShaderProgram::Build()
{
glLinkProgram(m_id);
GLint success;
glGetProgramiv(m_id, GL_LINK_STATUS, &success);
if (!success)
{
GLint length;
glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length);
std::vector<GLchar> infoLog(length);
glGetProgramInfoLog(m_id, length, &length, infoLog.data());
std::cerr << "[ShaderProgram] E: Linking shader." << std::endl;
std::cerr << infoLog.data() << std::endl;
}
for (GLuint attachedShader : m_attachedShaders) glDetachShader(m_id, attachedShader);
m_attachedShaders.clear();
}
void ShaderProgram::Use()
{
glUseProgram(m_id);
}
void ShaderProgram::SetInt(std::string_view key, int value)
{
glUniform1i(glGetUniformLocation(m_id, key.data()), value);
}
void ShaderProgram::SetFloat(std::string_view key, float value)
{
glUniform1f(glGetUniformLocation(m_id, key.data()), value);
}
void ShaderProgram::SetBool(std::string_view key, bool value)
{
glUniform1i(glGetUniformLocation(m_id, key.data()), value);
}
void ShaderProgram::SetVec3(std::string_view key, const glm::vec3& value)
{
glUniform3fv(glGetUniformLocation(m_id, key.data()), 1, glm::value_ptr(value));
}
void ShaderProgram::SetMat4(std::string_view key, const glm::mat4& value)
{
glUniformMatrix4fv(glGetUniformLocation(m_id, key.data()), 1, GL_FALSE, glm::value_ptr(value));
}
void ShaderProgram::SetTexture(std::string_view key, unsigned int unit, const Texture& value)
{
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, value.m_id);
glUniform1i(glGetUniformLocation(m_id, key.data()), unit);
}