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 {
2025-07-05 13:28:41 +03:30
glShader::glShader(BasicFileHandle vertexFile, BasicFileHandle pixelFile): m_ShaderID(0u)
2022-03-04 22:40:20 +03:30
{
// create
m_ShaderID = glCreateProgram();
std::string vertexSource(vertexFile.GetData(), vertexFile.GetData() + vertexFile.GetSize());
std::string pixelSource(pixelFile.GetData(), pixelFile.GetData() + pixelFile.GetSize());
unsigned int vertexShader = CompileShader(vertexSource, Shader::Stage::VERTEX);
2025-07-05 13:28:41 +03:30
unsigned int pixelShader = CompileShader(pixelSource, Shader::Stage::PIXEL);
2022-03-04 22:40:20 +03:30
// attach shaders
glAttachShader(m_ShaderID, vertexShader);
glAttachShader(m_ShaderID, pixelShader);
// link shader program
glLinkProgram(m_ShaderID);
// delete shaders (free memory)
glDeleteShader(vertexShader);
glDeleteShader(pixelShader);
}
glShader::~glShader()
{
glDeleteProgram(m_ShaderID);
}
void glShader::Bind()
{
glUseProgram(m_ShaderID);
}
void glShader::UnBind()
{
glUseProgram(NULL);
}
// shaderc::SpvCompilationResult glShader::CompileGLSL(BasicFileHandle 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)
// {
2025-07-05 13:28:41 +03:30
// LOG(err, "Failed to compile {} shader at {}...", stage == Shader::Stage::VERTEX ? "vertex" :
// "pixel", file.GetPath()); LOG(err, " {}", result.GetErrorMessage());
// }
//
// return result;
// }
2022-03-04 22:40:20 +03:30
unsigned int glShader::CompileShader(std::string source, Shader::Stage stage)
{
// &(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]);
2025-07-05 13:28:41 +03:30
LOG(err,
"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]);
2022-03-07 21:57:00 +03:30
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