10 #include <cmrc/cmrc.hpp> 18 Shader::Shader(
const std::string& vertex_shader_path,
const std::string& fragment_shader_path)
20 std::string sourcecode_vertex_shader;
21 std::string sourcecode_fragmentshader;
26 auto cmrc_fs = cmrc::shader::get_filesystem();
28 if (cmrc_fs.exists(vertex_shader_path) && cmrc_fs.is_file(vertex_shader_path) &&
29 cmrc_fs.exists(fragment_shader_path) && cmrc_fs.is_file(fragment_shader_path))
31 auto vertex_shader_cmrc_file = cmrc_fs.open(vertex_shader_path);
32 sourcecode_vertex_shader.assign(vertex_shader_cmrc_file.cbegin(), vertex_shader_cmrc_file.cend());
35 auto fragment_shader_cmrc_file = cmrc_fs.open(fragment_shader_path);
36 sourcecode_fragmentshader.assign(fragment_shader_cmrc_file.cbegin(), fragment_shader_cmrc_file.cend());
40 std::ifstream file_vertex_shader;
41 file_vertex_shader.exceptions(std::ifstream::badbit);
43 file_vertex_shader.open(vertex_shader_path);
45 std::stringstream vertex_shader_stream;
46 vertex_shader_stream << file_vertex_shader.rdbuf();
48 file_vertex_shader.close();
51 std::ifstream file_fragment_shader;
52 file_fragment_shader.exceptions(std::ifstream::badbit);
54 file_fragment_shader.open(fragment_shader_path);
56 std::stringstream fragment_shader_stream;
57 fragment_shader_stream << file_fragment_shader.rdbuf();
59 file_fragment_shader.close();
62 sourcecode_vertex_shader = vertex_shader_stream.str();
63 sourcecode_fragmentshader = fragment_shader_stream.str();
66 catch (
const std::ifstream::failure& e)
68 throw std::runtime_error(
"ERROR::SHADER::CTOR\nERROR:\n\tCould not read shader source code.\n" + std::string(e.what()));
73 const GLchar* ptr_sourcecode_vertex_shader = sourcecode_vertex_shader.c_str();
74 const GLchar* ptr_sourcecode_fragment_shader = sourcecode_fragmentshader.c_str();
82 vertex = glCreateShader(GL_VERTEX_SHADER);
83 glShaderSource(vertex, 1, &ptr_sourcecode_vertex_shader, NULL);
84 glCompileShader(vertex);
87 glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
90 glGetShaderInfoLog(vertex, 512, NULL, info_log);
91 throw std::runtime_error(
"ERROR::SHADER::CTOR\nERROR:\n\tVertex shader program compilation error.\nLOG:\n\t" + std::string(info_log));
96 fragment = glCreateShader(GL_FRAGMENT_SHADER);
97 glShaderSource(fragment, 1, &ptr_sourcecode_fragment_shader, NULL);
98 glCompileShader(fragment);
101 glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
104 glGetShaderInfoLog(vertex, 512, NULL, info_log);
105 throw std::runtime_error(
"ERROR::SHADER::CTOR\nERROR:\n\tFragment shader program compilation error.\nLOG:\n\t" + std::string(info_log));
120 throw std::runtime_error(
"ERROR::SHADER::CTOR\nERROR:\n\tShader program link fail.\nLOG:\n\t" + std::string(info_log));
124 glDeleteShader(vertex);
125 glDeleteShader(fragment);
void install()
Activate the shader program.
Shader(const std::string &vertex_shader_path, const std::string &fragment_shader_path)
Create a shader program with given vertex and fragment shader paths.
GLuint shader_program_id_
The program ID.
void uninstall()
Deactivate the shader program.