#include #include #include #include #include #include #include /*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); } void Shader::setVec3(const std::string &name, glm::vec3 value) { glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, glm::value_ptr(value)); } void Shader::setMat4(const std::string &name, glm::mat4 value) { glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, glm::value_ptr(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; } }