From af5b3de3535acf4a2569875b466969bdb43dfdc0 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 6 Mar 2014 21:20:11 +0100 Subject: [PATCH] More shader stuff. --- Escape-the-Dawn/ShaderProgram.cpp | 149 ++++++++++++++++++++++++++++++ Escape-the-Dawn/ShaderProgram.h | 130 ++++---------------------- 2 files changed, 165 insertions(+), 114 deletions(-) create mode 100644 Escape-the-Dawn/ShaderProgram.cpp diff --git a/Escape-the-Dawn/ShaderProgram.cpp b/Escape-the-Dawn/ShaderProgram.cpp new file mode 100644 index 0000000..2aee783 --- /dev/null +++ b/Escape-the-Dawn/ShaderProgram.cpp @@ -0,0 +1,149 @@ +#include "ShaderProgram.h" + +GLuint Shader::CompileShader(GLenum shaderType, std::string fileName) +{ + LOG_INFO("Compiling shader \"%s\"", fileName.c_str()); + + std::string shaderFile; + std::ifstream in(fileName, std::ios::in); + if(!in) + { + LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str()); + return 0; + } + in.seekg(0, std::ios::end); + shaderFile.resize((int)in.tellg()); + in.seekg(0, std::ios::beg); + in.read(&shaderFile[0], shaderFile.size()); + in.close(); + + GLuint shader = glCreateShader(shaderType); + if(GLERROR("glCreateShader")) + return 0; + + const GLchar* shaderFiles = shaderFile.c_str(); + const GLint length = shaderFile.length(); + glShaderSource(shader, 1, &shaderFiles, &length); + if(GLERROR("glShaderSource")) + return 0; + + glCompileShader(shader); + + GLint compileStatus; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus); + if(compileStatus != GL_TRUE) + { + LOG_ERROR("Shader compilation failed"); + GLsizei infoLogLength; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); + GLchar* infolog = new GLchar[infoLogLength]; + glGetShaderInfoLog(shader, infoLogLength, &infoLogLength, infolog); + LOG_ERROR(infolog); + delete[] infolog; + } + + if(GLERROR("glCompileShader")) + return 0; + + return shader; +} + +Shader::Shader(GLenum shaderType, std::string fileName) : m_ShaderType(shaderType), m_FileName(fileName) +{ + m_ShaderHandle = 0; +} + +Shader::~Shader() +{ + glDeleteShader(m_ShaderHandle); +} + +GLuint Shader::Compile() +{ + m_ShaderHandle = CompileShader(m_ShaderType, m_FileName); + return m_ShaderHandle; +} + +GLenum Shader::GetType() const +{ + return m_ShaderType; +} + +std::string Shader::GetFileName() const +{ + return m_FileName; +} + +GLuint Shader::GetHandle() const +{ + return m_ShaderHandle; +} + +bool Shader::IsCompiled() const +{ + return m_ShaderHandle != 0; +} + +ShaderProgram::ShaderProgram() +{ + Initialize(); +} + +ShaderProgram::ShaderProgram(std::string vertexShaderFile, std::string fragmentShaderFile) +{ + AddShader(std::unique_ptr(new VertexShader(vertexShaderFile))); + AddShader(std::unique_ptr(new VertexShader(fragmentShaderFile))); + Initialize(); +} + +ShaderProgram::~ShaderProgram() +{ + Unbind(); + glDeleteProgram(m_ShaderProgramHandle); +} + +void ShaderProgram::AddShader(std::unique_ptr shader) +{ + if (!shader->IsCompiled()) { + shader->Compile(); + } + + m_Shaders.push_back(std::move(shader)); +} + +GLuint ShaderProgram::Link() +{ + LOG_INFO("Linking shader program"); + m_ShaderProgramHandle = glCreateProgram(); + for (auto &shader : m_Shaders) { + glAttachShader(m_ShaderProgramHandle, shader->GetHandle()); + } + glLinkProgram(m_ShaderProgramHandle); + if (GLERROR("glLinkProgram")) + return 0; + + for (auto &shader : m_Shaders) { + shader.release(); + } + m_Shaders.clear(); + + return m_ShaderProgramHandle; +} + +void ShaderProgram::Bind() +{ + if (m_ShaderProgramHandle == 0) + return; + + glUseProgram(m_ShaderProgramHandle); +} + +void ShaderProgram::Unbind() +{ + glActiveShaderProgram(0, 0); +} + +void ShaderProgram::Initialize() +{ + m_ShaderProgramHandle = 0; +} diff --git a/Escape-the-Dawn/ShaderProgram.h b/Escape-the-Dawn/ShaderProgram.h index 3d84820..e46d89d 100644 --- a/Escape-the-Dawn/ShaderProgram.h +++ b/Escape-the-Dawn/ShaderProgram.h @@ -17,75 +17,18 @@ class Shader { public: - static GLuint CompileShader(GLenum shaderType, std::string fileName) - { - LOG_INFO("Compiling shader \"%s\"", fileName.c_str()); + static GLuint CompileShader(GLenum shaderType, std::string fileName); - std::string shaderFile; - std::ifstream in(fileName, std::ios::in); - if(!in) - { - LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str()); - return 0; - } - in.seekg(0, std::ios::end); - shaderFile.resize((int)in.tellg()); - in.seekg(0, std::ios::beg); - in.read(&shaderFile[0], shaderFile.size()); - in.close(); + Shader(GLenum shaderType, std::string fileName); - GLuint shader = glCreateShader(shaderType); - if(GLERROR("glCreateShader")) - return 0; + virtual ~Shader(); - const GLchar* shaderFiles = shaderFile.c_str(); - const GLint length = shaderFile.length(); - glShaderSource(shader, 1, &shaderFiles, &length); - if(GLERROR("glShaderSource")) - return 0; + GLuint Compile(); - glCompileShader(shader); - - GLint compileStatus; - glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus); - if(compileStatus != GL_TRUE) - { - LOG_ERROR("Shader compilation failed"); - GLsizei infoLogLength; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); - GLchar* infolog = new GLchar[infoLogLength]; - glGetShaderInfoLog(shader, infoLogLength, &infoLogLength, infolog); - LOG_ERROR(infolog); - delete[] infolog; - } - - if(GLERROR("glCompileShader")) - return 0; - - return shader; - } - - Shader(GLenum shaderType, std::string fileName) - : m_ShaderType(shaderType), m_FileName(fileName) - { - m_ShaderHandle = 0; - } - - virtual ~Shader() - { - glDeleteShader(m_ShaderHandle); - } - - GLuint Compile() - { - m_ShaderHandle = CompileShader(m_ShaderType, m_FileName); - return m_ShaderHandle; - } - - GLenum GetType() const { return m_ShaderType; } - std::string GetFileName() const { return m_FileName; } - GLuint GetHandle() const { return m_ShaderHandle; } - bool IsCompiled() const { return m_ShaderHandle != 0; } + GLenum GetType() const; + std::string GetFileName() const; + GLuint GetHandle() const; + bool IsCompiled() const; protected: GLenum m_ShaderType; @@ -125,65 +68,24 @@ public: class ShaderProgram { public: - ShaderProgram() - { - Initialize(); - } + ShaderProgram(); + ~ShaderProgram(); - ShaderProgram(std::string vertexShaderFile, std::string fragmentShaderFile) - { - AddShader(std::unique_ptr(new VertexShader(vertexShaderFile))); - AddShader(std::unique_ptr(new VertexShader(fragmentShaderFile))); - Initialize(); - } + ShaderProgram(std::string vertexShaderFile, std::string fragmentShaderFile); - void AddShader(std::unique_ptr shader) - { - if (!shader->IsCompiled()) { - shader->Compile(); - } + void AddShader(std::unique_ptr shader); - m_Shaders.push_back(std::move(shader)); - } + GLuint Link(); - GLuint Link() - { - LOG_INFO("Linking shader program"); - m_ShaderProgramHandle = glCreateProgram(); - for (auto &shader : m_Shaders) { - glAttachShader(m_ShaderProgramHandle, shader->GetHandle()); - } - glLinkProgram(m_ShaderProgramHandle); - if (GLERROR("glLinkProgram")) - return 0; + void Bind(); - for (auto &shader : m_Shaders) { - shader.release(); - } - m_Shaders.clear(); - } - - void Bind() - { - if (m_ShaderProgramHandle == 0) - return; - - glActiveShaderProgram(0, m_ShaderProgramHandle); - } - - void Unbind() - { - glActiveShaderProgram(0, 0); - } + void Unbind(); private: GLuint m_ShaderProgramHandle; std::vector> m_Shaders; - void Initialize() - { - m_ShaderProgramHandle = 0; - } + void Initialize(); }; #endif // ShaderProgram_h__ \ No newline at end of file