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

79 lines
2.5 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"
2021-08-09 21:42:05 -04:00
#include "game/graphics/pipelines/opengl.h"
2021-08-06 22:30:02 -04:00
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"};
at(ShaderId::DIRECT_BASIC_TEXTURED_TCC0) = {"direct_basic_textured_tcc0"};
2021-08-08 20:46:14 -04:00
at(ShaderId::DIRECT_BASIC_TEXTURED) = {"direct_basic_textured"};
at(ShaderId::DEBUG_RED) = {"debug_red"};
at(ShaderId::SPRITE_CPU) = {"sprite_cpu"};
at(ShaderId::SPRITE_CPU_AFAIL) = {"sprite_cpu_afail"};
at(ShaderId::SKY) = {"sky"};
at(ShaderId::SKY_BLEND) = {"sky_blend"};
at(ShaderId::DEBUG_BUFFERED) = {"debug_buffered"};
at(ShaderId::BUFFERED_TCC0) = {"buffered_tcc0"};
at(ShaderId::BUFFERED_TCC1) = {"buffered_tcc1"};
2021-08-06 22:30:02 -04:00
}