light/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp

119 lines
3.4 KiB
C++
Raw Normal View History

2022-03-08 21:19:19 +03:30
#include "glShader.hpp"
2021-05-27 19:54:05 +04:30
#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 {
2022-03-04 22:40:20 +03:30
glShader::glShader(BasicFileHandle vertexFile, BasicFileHandle pixelFile)
: m_ShaderID(0u)
{
// 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);
unsigned int pixelShader = CompileShader(pixelSource, Shader::Stage::PIXEL);
// 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;
// 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)
// {
// 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
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);
2022-03-04 22:40:20 +03:30
char* errorLog = (char*)alloca(logLength);
glGetShaderInfoLog(shader, logLength, &logLength, &errorLog[0]);
2022-03-07 21:57:00 +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
{
2022-03-04 22:40:20 +03:30
char* infoLog = (char*)alloca(logLength);
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