1#include <glm/gtc/type_ptr.hpp>
2#include <zen/renderer/ZEN_Shader.h>
5 Shader::Shader(
const char *vertexPath,
const char *fragmentPath) {
9 std::string vertexCode;
10 std::string fragmentCode;
11 std::ifstream vShaderFile;
12 std::ifstream fShaderFile;
14 vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
15 fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
18 vShaderFile.open(vertexPath);
19 fShaderFile.open(fragmentPath);
20 std::stringstream vShaderStream, fShaderStream;
22 vShaderStream << vShaderFile.rdbuf();
23 fShaderStream << fShaderFile.rdbuf();
28 vertexCode = vShaderStream.str();
29 fragmentCode = fShaderStream.str();
35 }
catch (std::ifstream::failure e) {
36 ZEN_LOG_ERROR(
"ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ");
37 throw std::runtime_error(
"shader file read failed");
39 const char *vShaderCode = vertexCode.c_str();
40 const char *fShaderCode = fragmentCode.c_str();
42 uint32_t vertexShader, fragmentShader;
44 vertexShader = glCreateShader(GL_VERTEX_SHADER);
45 glShaderSource(vertexShader, 1, &vShaderCode,
nullptr);
48 glCompileShader(vertexShader);
51 glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &isCompiled);
52 if (isCompiled == GL_FALSE) {
54 glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &maxLength);
57 std::vector<GLchar> infoLog(maxLength);
58 glGetShaderInfoLog(vertexShader, maxLength, &maxLength, &infoLog[0]);
61 glDeleteShader(vertexShader);
63 ZEN_LOG_ERROR(
"{}", infoLog.data());
68 fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
69 glShaderSource(fragmentShader, 1, &fShaderCode,
nullptr);
72 glCompileShader(fragmentShader);
74 glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
75 if (isCompiled == GL_FALSE) {
77 glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
80 std::vector<GLchar> infoLog(maxLength);
81 glGetShaderInfoLog(fragmentShader, maxLength, &maxLength, &infoLog[0]);
84 glDeleteShader(fragmentShader);
86 glDeleteShader(vertexShader);
91 ZEN_LOG_ERROR(
"{}", infoLog.data());
98 m_rendererID = glCreateProgram();
99 GLuint program = m_rendererID;
102 glAttachShader(program, vertexShader);
103 glAttachShader(program, fragmentShader);
106 glLinkProgram(program);
110 glGetProgramiv(program, GL_LINK_STATUS, (
int *)&isLinked);
111 if (isLinked == GL_FALSE) {
113 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
116 std::vector<GLchar> infoLog(maxLength);
117 glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
120 glDeleteProgram(program);
122 glDeleteShader(vertexShader);
123 glDeleteShader(fragmentShader);
128 ZEN_LOG_ERROR(
"{}", infoLog.data());
133 glDetachShader(program, vertexShader);
134 glDetachShader(program, fragmentShader);
138 ZEN_LOG_DEBUG(
"Shader deconstructed");
139 glDeleteProgram(m_rendererID);
142 void Shader::bind()
const {
144 glUseProgram(m_rendererID);
147 void Shader::unBind()
const {
148 ZEN_LOG_DEBUG(
"Shader unbinded");
152 void Shader::uploadUniformMat4(
const std::string &name,
const glm::mat4 &matrix) {
153 GLint location = glGetUniformLocation(m_rendererID, name.c_str());
154 glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix));