5#include <glm/gtc/type_ptr.hpp>
7Shader::Shader(
const std::string &vertexPath,
const std::string &fragmentPath, QOpenGLFunctions_4_5_Core* glFuncs) : funcs(glFuncs) {
8 std::string vertexCode = loadFile(vertexPath);
9 std::string fragmentCode = loadFile(fragmentPath);
11 unsigned int vertex = compileShader(GL_VERTEX_SHADER, vertexCode);
12 unsigned int fragment = compileShader(GL_FRAGMENT_SHADER, fragmentCode);
14 ID = funcs->glCreateProgram();
15 funcs->glAttachShader(ID, vertex);
16 funcs->glAttachShader(ID, fragment);
17 funcs->glLinkProgram(ID);
19 funcs->glDeleteShader(vertex);
20 funcs->glDeleteShader(fragment);
24 funcs->glDeleteProgram(ID);
28std::string Shader::loadFile(
const std::string &path)
const {
29 std::ifstream file(path);
31 std::cerr <<
"Error: Could not open file " << path << std::endl;
34 std::stringstream buffer;
35 buffer << file.rdbuf();
39unsigned int Shader::compileShader(GLenum type,
const std::string &source)
const {
40 unsigned int shader = funcs->glCreateShader(type);
41 const char* src = source.c_str();
42 funcs->glShaderSource(shader, 1, &src,
nullptr);
43 funcs->glCompileShader(shader);
46 funcs->glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
49 funcs->glGetShaderInfoLog(shader, 1024,
nullptr, infoLog);
50 std::cerr <<
"ERROR::SHADER_COMPILATION_ERROR of type: " << type <<
"\n" << infoLog << std::endl;
56 funcs->glUseProgram(ID);
60 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), (
int)value);
63 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), value);
66 funcs->glUniform1f(funcs->glGetUniformLocation(ID, name.c_str()), value);
69 funcs->glUniformMatrix4fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, glm::value_ptr(mat));
72 funcs->glUniform3fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, glm::value_ptr(vec));
void setVec3(const std::string &name, const glm::vec3 &vec) const
Shader(const std::string &vertexPath, const std::string &fragmentPath, QOpenGLFunctions_4_5_Core *glFuncs)
void setMat4(const std::string &name, const glm::mat4 &mat) const
void setBool(const std::string &name, bool value) const
void setInt(const std::string &name, int value) const
void setFloat(const std::string &name, float value) const