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

125 lines
2.9 KiB
C++
Raw Normal View History

2021-05-27 19:54:05 +04:30
#include "ltpch.h"
#include "glShader.h"
2021-05-30 16:45:54 +04:30
#include <glad/glad.h>
2021-05-27 19:54:05 +04:30
#include <glm/glm.hpp>
#include <glm/matrix.hpp>
#include <glm/gtc/matrix_transform.hpp>
2021-05-27 19:54:05 +04:30
namespace Light {
2021-05-31 19:09:27 +04:30
glShader::glShader(const std::string& vertexSource, const std::string& fragmentSource)
2021-07-29 17:12:13 +04:30
: m_ShaderID(NULL)
2021-05-27 19:54:05 +04:30
{
m_ShaderID = glCreateProgram();
// create shaders
2021-05-27 19:54:05 +04:30
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
2021-05-27 19:54:05 +04:30
// &(address of) needs an lvalue
2021-05-31 19:09:27 +04:30
const char* lVertexSource = vertexSource.c_str();
const char* lFragmentSource = fragmentSource.c_str();
2021-05-27 19:54:05 +04:30
// set shaders' source code
2021-05-31 19:09:27 +04:30
glShaderSource(vertexShader, 1, &lVertexSource, NULL);
glShaderSource(fragmentShader, 1, &lFragmentSource, NULL);
2021-05-27 19:54:05 +04:30
// compile shaders
2021-05-27 19:54:05 +04:30
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
2021-05-27 19:54:05 +04:30
2021-07-29 17:12:13 +04:30
/* #TEMP_HANDLE_SHADER_COMPILE_FAILURE# */
2021-05-27 19:54:05 +04:30
int isCompiled = 0;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
int logLength = 0;
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &logLength);
2021-05-27 19:54:05 +04:30
char* errorLog = (char*)alloca(logLength);
glGetShaderInfoLog(vertexShader, logLength, &logLength, &errorLog[0]);
2021-06-26 13:09:11 +04:30
2021-05-27 19:54:05 +04:30
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
LT_ENGINE_ASSERT(false, "glShader::glShader: failed to compile vertex shader:\n {}", errorLog);
return;
2021-05-27 19:54:05 +04:30
}
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
2021-05-27 19:54:05 +04:30
if (isCompiled == GL_FALSE)
{
int logLength = 0;
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &logLength);
2021-05-27 19:54:05 +04:30
char* errorLog = (char*)alloca(logLength);
glGetShaderInfoLog(fragmentShader, logLength, &logLength, &errorLog[0]);
2021-05-27 19:54:05 +04:30
glDeleteShader(fragmentShader);
glDeleteShader(vertexShader);
LT_ENGINE_ASSERT(false, "glShader::glShader: failed to compile fragment shader:\n {}", errorLog);
return;
2021-05-27 19:54:05 +04:30
}
2021-07-29 17:12:13 +04:30
/* #TEMP_HANDLE_SHADER_COMPILE_FAILURE# */
2021-05-27 19:54:05 +04:30
#ifdef LIGHT_OPENGL_ENABLE_SHADER_INFO_LOG
{
int logLength = 0;
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &logLength);
if(logLength)
{
char* infoLog = (char*)alloca(logLength);
glGetShaderInfoLog(vertexShader, logLength, &logLength, &infoLog[0]);
LT_ENGINE_TRACE(infoLog);
}
}
{
int logLength = 0;
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &logLength);
if (logLength)
{
char* infoLog = (char*)alloca(logLength);
glGetShaderInfoLog(fragmentShader, logLength, &logLength, &infoLog[0]);
LT_ENGINE_TRACE(infoLog);
}
}
#endif
// attach shaders
2021-05-27 19:54:05 +04:30
glAttachShader(m_ShaderID, vertexShader);
glAttachShader(m_ShaderID, fragmentShader);
// link shader program
2021-05-27 19:54:05 +04:30
glLinkProgram(m_ShaderID);
// delete shaders (free memory)
2021-05-27 19:54:05 +04:30
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
2021-05-27 19:54:05 +04:30
}
glShader::~glShader()
{
glDeleteProgram(m_ShaderID);
}
void glShader::Bind()
{
glUseProgram(m_ShaderID);
}
void glShader::UnBind()
{
glUseProgram(NULL);
}
}