light/modules/engine/src/platform/graphics/opengl/shader.cpp

124 lines
3.4 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/platform/graphics/opengl/shader.hpp>
#include <glad/gl.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/matrix.hpp>
2021-05-27 19:54:05 +04:30
namespace Light {
glShader::glShader(basic_file_handle vertexFile, basic_file_handle pixelFile): m_shader_id(0u)
2022-03-04 22:40:20 +03:30
{
// create
m_shader_id = glCreateProgram();
2022-03-04 22:40:20 +03:30
std::string vertexSource(vertexFile.GetData(), vertexFile.GetData() + vertexFile.get_size());
std::string pixelSource(pixelFile.GetData(), pixelFile.GetData() + pixelFile.get_size());
2022-03-04 22:40:20 +03:30
unsigned int vertexShader = compile_shader(vertexSource, Shader::Stage::VERTEX);
unsigned int pixelShader = compile_shader(pixelSource, Shader::Stage::PIXEL);
2022-03-04 22:40:20 +03:30
// attach shaders
glAttachShader(m_shader_id, vertexShader);
glAttachShader(m_shader_id, pixelShader);
2022-03-04 22:40:20 +03:30
// link shader program
glLinkProgram(m_shader_id);
2022-03-04 22:40:20 +03:30
// delete shaders (free memory)
glDeleteShader(vertexShader);
glDeleteShader(pixelShader);
}
glShader::~glShader()
{
glDeleteProgram(m_shader_id);
2022-03-04 22:40:20 +03:30
}
void glShader::bind()
2022-03-04 22:40:20 +03:30
{
glUseProgram(m_shader_id);
2022-03-04 22:40:20 +03:30
}
void glShader::un_bind()
2022-03-04 22:40:20 +03:30
{
glUseProgram(NULL);
}
// shaderc::SpvCompilationResult glShader::compile_glsl(basic_file_handle file, Shader::Stage stage)
// {
// // compile options
// shaderc::CompileOptions options;
// options.SetTargetEnvironment(shaderc_target_env_opengl, shaderc_env_version_opengl_4_5);
// options.SetOptimizationLevel(shaderc_optimization_level_performance);
//
// // compile
// shaderc::Compiler compiler;
2025-07-05 13:28:41 +03:30
// shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv(reinterpret_cast<const
// char*>(file.GetData()), stage == Shader::Stage::VERTEX ?
// shaderc_shader_kind::shaderc_vertex_shader : shaderc_shader_kind::shaderc_fragment_shader,
// file.GetName().c_str(), options);
//
// // log error
// if (result.GetCompilationStatus() != shaderc_compilation_status_success)
// {
// lt_log(err, "Failed to compile {} shader at {}...", stage == Shader::Stage::VERTEX ? "vertex" :
// "pixel", file.GetPath()); lt_log(err, " {}", result.GetErrorMessage());
// }
//
// return result;
// }
2022-03-04 22:40:20 +03:30
unsigned int glShader::compile_shader(std::string source, Shader::Stage stage)
2022-03-04 22:40:20 +03:30
{
// &(address of) needs an lvalue
2025-07-05 13:28:41 +03:30
const char *lvalue_source = source.c_str();
unsigned int shader = glCreateShader(
stage == Shader::Stage::VERTEX ? GL_VERTEX_SHADER :
stage == Shader::Stage::PIXEL ? GL_FRAGMENT_SHADER :
stage == Shader::Stage::GEOMETRY ? GL_GEOMETRY_SHADER :
NULL
);
2022-03-04 22:40:20 +03:30
// compile
glShaderSource(shader, 1, &lvalue_source, NULL);
glCompileShader(shader);
// check
int isCompiled = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
2022-03-04 22:40:20 +03:30
int logLength = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
2025-07-05 13:28:41 +03:30
char *errorLog = (char *)alloca(logLength);
2022-03-04 22:40:20 +03:30
glGetShaderInfoLog(shader, logLength, &logLength, &errorLog[0]);
lt_log(err,
2025-07-05 13:28:41 +03:30
"glShader::glShader: failed to compile {} shader:\n {}",
stage == Shader::Stage::VERTEX ? "Vertex" : "Pixel",
errorLog);
2022-03-04 22:40:20 +03:30
return NULL;
}
2022-03-04 22:40:20 +03:30
#define LIGHT_OPENGL_ENABLE_SHADER_INFO_LOG
#ifdef LIGHT_OPENGL_ENABLE_SHADER_INFO_LOG
// info log
{
2022-03-04 22:40:20 +03:30
int logLength = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
if (logLength)
2021-05-27 19:54:05 +04:30
{
2025-07-05 13:28:41 +03:30
char *infoLog = (char *)alloca(logLength);
2022-03-04 22:40:20 +03:30
glGetShaderInfoLog(shader, logLength, &logLength, &infoLog[0]);
lt_log(warn, infoLog);
}
2022-03-04 22:40:20 +03:30
}
#endif
2022-03-04 22:40:20 +03:30
return shader;
}
2021-05-27 19:54:05 +04:30
2022-03-04 22:40:20 +03:30
} // namespace Light