diff options
author | jjesswan <jessica_wan@brown.edu> | 2024-04-22 21:56:26 -0400 |
---|---|---|
committer | jjesswan <jessica_wan@brown.edu> | 2024-04-22 21:56:26 -0400 |
commit | a556b45abf18f1bd509daaf63b66b7d55e9fd291 (patch) | |
tree | bc9b8a2d184c12aee236e7f9f276a34b84ca552d /engine-ocean/Graphics/shaderloader.h | |
parent | cd7c76017a12bb548036571c1ff13e551369d06d (diff) |
add engine version
Diffstat (limited to 'engine-ocean/Graphics/shaderloader.h')
-rw-r--r-- | engine-ocean/Graphics/shaderloader.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/engine-ocean/Graphics/shaderloader.h b/engine-ocean/Graphics/shaderloader.h new file mode 100644 index 0000000..eeb8e8c --- /dev/null +++ b/engine-ocean/Graphics/shaderloader.h @@ -0,0 +1,98 @@ +#pragma once + +#include "debug.h" + +#include <vector> +#include <string> +#include <stdexcept> +#include <fstream> +#include <iostream> + +class ShaderLoader{ +public: + static GLuint createShaderProgram(std::vector<GLenum> shaderTypes, std::vector<const char*> filepaths){ + // Create and compile shaders + std::vector<GLuint> shaderIDs; + for(int i = 0; i<shaderTypes.size(); i++){ + shaderIDs.push_back(createAndCompileShader(shaderTypes[i], filepaths[i])); + } + + // Link the shader program + GLuint programID = glCreateProgram(); + for(int i = 0; i<shaderIDs.size(); i++){ + glAttachShader(programID, shaderIDs[i]); + } + glLinkProgram(programID); + + // Print the info log if program fails to link + GLint status; + glGetProgramiv(programID, GL_LINK_STATUS, &status); + if(status == GL_FALSE){ + GLint length; + glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &length); + std::string log(length, '\0'); + glGetProgramInfoLog(programID, length, nullptr, &log[0]); + glDeleteProgram(programID); + throw std::runtime_error(log); + } + + // Individual shaders no longer necessary, stored in program + for(int i = 0; i<shaderIDs.size(); i++){ + glDeleteShader(shaderIDs[i]); + } + + std::cout<<"END OF SHADERLOADER"<<std::endl; + return programID; + } + +private: + static std::string readFile(const char *filePath) { + std::cout<<"READ FILE: "<<std::string(filePath)<<std::endl; + std::string content; + std::ifstream fileStream(filePath, std::ios::in); + + if(!fileStream.is_open()) { + std::string log = "Could not read file "+std::string(filePath)+". File does not exist."; + throw std::runtime_error(log); + return ""; + } + + std::string line = ""; + while(std::getline(fileStream, line)) { + content.append(line + "\n"); + } + + fileStream.close(); + + return content; + } + + static GLuint createAndCompileShader(GLenum shaderType, const char* filepath){ + std::cout<<"CREATE AND COMPILE SHADER: "<<shaderType<<std::endl; + GLuint shaderID = glCreateShader(shaderType); + + // Read shader file + std::string shaderStr = readFile(filepath); + const char* shaderSrc = shaderStr.c_str(); + + std::cout<<"GL SHADER SOURCE"<<std::endl; + glShaderSource(shaderID, 1, &shaderSrc, NULL); + + std::cout<<"GL COMPILE SHADER: "<<shaderID<<std::endl; + glCompileShader(shaderID); + + // Print info log if shader fails to compile + GLint status; + glGetShaderiv(shaderID, GL_COMPILE_STATUS, &status); + if(status == GL_FALSE){ + GLint length; + glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &length); + std::string log(length, '\0'); + glGetShaderInfoLog(shaderID, length, nullptr, &log[0]); + glDeleteShader(shaderID); + throw std::runtime_error(log); + } + + return shaderID; + } +};
\ No newline at end of file |