jak-project/game/graphics/opengl_renderer/Shader.cpp

70 lines
2.1 KiB
C++
Raw Normal View History

2021-08-06 22:30:02 -04:00
#include "Shader.h"
#include "common/util/assert.h"
#include "common/util/FileUtil.h"
#include "game/graphics/opengl.h"
Shader::Shader(const std::string& shader_name) {
// read the shader source
auto vert_src =
file_util::read_text_file(file_util::get_file_path({shader_folder, shader_name + ".vert"}));
auto frag_src =
file_util::read_text_file(file_util::get_file_path({shader_folder, shader_name + ".frag"}));
m_vert_shader = glCreateShader(GL_VERTEX_SHADER);
const char* src = vert_src.c_str();
glShaderSource(m_vert_shader, 1, &src, nullptr);
glCompileShader(m_vert_shader);
constexpr int len = 1024;
int compile_ok;
char err[len];
glGetShaderiv(m_vert_shader, GL_COMPILE_STATUS, &compile_ok);
if (!compile_ok) {
glGetShaderInfoLog(m_vert_shader, len, nullptr, err);
printf("Failed to compile vertex shader %s:\n%s\n", shader_name.c_str(), err);
m_is_okay = false;
return;
}
m_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
src = frag_src.c_str();
glShaderSource(m_frag_shader, 1, &src, nullptr);
glCompileShader(m_frag_shader);
glGetShaderiv(m_frag_shader, GL_COMPILE_STATUS, &compile_ok);
if (!compile_ok) {
glGetShaderInfoLog(m_frag_shader, len, nullptr, err);
printf("Failed to compile fragment shader %s:\n%s\n", shader_name.c_str(), err);
m_is_okay = false;
return;
}
m_program = glCreateProgram();
glAttachShader(m_program, m_vert_shader);
glAttachShader(m_program, m_frag_shader);
glLinkProgram(m_program);
glGetProgramiv(m_program, GL_LINK_STATUS, &compile_ok);
if (!compile_ok) {
glGetProgramInfoLog(m_program, len, nullptr, err);
printf("Failed to link shader %s:\n%s\n", shader_name.c_str(), err);
m_is_okay = false;
return;
}
glDeleteShader(m_vert_shader);
glDeleteShader(m_frag_shader);
m_is_okay = true;
}
void Shader::activate() {
assert(m_is_okay);
glUseProgram(m_program);
}
ShaderLibrary::ShaderLibrary() {
at(ShaderId::TEST_SHADER) = {"test_shader"};
2021-08-07 18:57:13 -04:00
at(ShaderId::DIRECT_BASIC) = {"direct_basic"};
2021-08-08 20:46:14 -04:00
at(ShaderId::DIRECT_BASIC_TEXTURED) = {"direct_basic_textured"};
2021-08-06 22:30:02 -04:00
}