Shader Class

This commit is contained in:
k
2024-12-19 20:20:52 -05:00
parent 15cc550bf9
commit c085fdbf5a
5 changed files with 144 additions and 64 deletions

99
src/shader.cpp Normal file
View File

@@ -0,0 +1,99 @@
#include <fstream>
#include <glad/glad.h>
#include <iostream>
#include <shader.hpp>
#include <sstream>
#include <string>
/*pub*/
Shader::Shader(const char *vertexPath, const char *fragmentPath) {
std::string vertexCode, fragmentCode;
std::ifstream vShaderFile, fShaderFile;
vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try {
vShaderFile.open(vertexPath);
fShaderFile.open(fragmentPath);
std::stringstream vShaderStream, fShaderStream;
vShaderStream << vShaderFile.rdbuf();
fShaderStream << fShaderFile.rdbuf();
vShaderFile.close();
fShaderFile.close();
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
} catch (std::ifstream::failure &e) {
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ: " << e.what()
<< std::endl;
}
this->ID = shaderProgramCMPL(vertexCode.c_str(), fragmentCode.c_str());
}
Shader::~Shader() { glDeleteProgram(ID); }
void Shader::use() { glUseProgram(ID); }
void Shader::setInt(const std::string &name, int value) {
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
}
void Shader::setFloat(const std::string &name, float value) {
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
}
/*priv*/
unsigned int Shader::shaderCMPL(GLenum type, const char *src) {
unsigned int shader;
shader = glCreateShader(type);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
return shader;
}
void Shader::shaderERR(unsigned int shader) {
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
}
}
unsigned int Shader::shaderProgramCMPL(const char *vertexSource,
const char *fragmentSource) {
unsigned int vertexShader;
vertexShader = shaderCMPL(GL_VERTEX_SHADER, vertexSource);
shaderERR(vertexShader);
unsigned int fragmentShader;
fragmentShader = shaderCMPL(GL_FRAGMENT_SHADER, fragmentSource);
shaderERR(fragmentShader);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
shaderProgramERR(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return shaderProgram;
}
void Shader::shaderProgramERR(unsigned int shaderProgram) {
int success;
char infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::FAILED\n" << infoLog << std::endl;
}
}