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
|
|
|
|
|
|
|
namespace Light {
|
|
|
|
|
2021-05-31 19:09:27 +04:30
|
|
|
glShader::glShader(const std::string& vertexSource, const std::string& fragmentSource)
|
2021-05-27 19:54:05 +04:30
|
|
|
{
|
|
|
|
m_ShaderID = glCreateProgram();
|
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// create shaders
|
2021-05-27 19:54:05 +04:30
|
|
|
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
2021-07-01 19:25:46 +04:30
|
|
|
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +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
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
// set shaders' source code
|
2021-05-31 19:09:27 +04:30
|
|
|
glShaderSource(vertexShader, 1, &lVertexSource, NULL);
|
2021-07-01 19:25:46 +04:30
|
|
|
glShaderSource(fragmentShader, 1, &lFragmentSource, NULL);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// compile shaders
|
2021-05-27 19:54:05 +04:30
|
|
|
glCompileShader(vertexShader);
|
2021-07-01 19:25:46 +04:30
|
|
|
glCompileShader(fragmentShader);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +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)
|
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
int logLength = 0;
|
|
|
|
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &logLength);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +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);
|
2021-07-01 19:25:46 +04:30
|
|
|
glDeleteShader(fragmentShader);
|
|
|
|
|
|
|
|
LT_ENGINE_ASSERT(false, "glShader::glShader: failed to compile vertex shader:\n {}", errorLog);
|
|
|
|
|
|
|
|
return;
|
2021-05-27 19:54:05 +04:30
|
|
|
}
|
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
|
2021-05-27 19:54:05 +04:30
|
|
|
if (isCompiled == GL_FALSE)
|
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
int logLength = 0;
|
|
|
|
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &logLength);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
char* errorLog = (char*)alloca(logLength);
|
|
|
|
glGetShaderInfoLog(fragmentShader, logLength, &logLength, &errorLog[0]);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +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-01 19:25:46 +04:30
|
|
|
//** #TEMP_HANDLE_SHADER_COMPILE_FAILURE# **//
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
// attach shaders
|
2021-05-27 19:54:05 +04:30
|
|
|
glAttachShader(m_ShaderID, vertexShader);
|
2021-07-01 19:25:46 +04:30
|
|
|
glAttachShader(m_ShaderID, fragmentShader);
|
|
|
|
|
|
|
|
// link shader program
|
2021-05-27 19:54:05 +04:30
|
|
|
glLinkProgram(m_ShaderID);
|
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// delete shaders (free memory)
|
2021-05-27 19:54:05 +04:30
|
|
|
glDeleteShader(vertexShader);
|
2021-07-01 19:25:46 +04:30
|
|
|
glDeleteShader(fragmentShader);
|
2021-05-27 19:54:05 +04:30
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// #todo: validate program
|
2021-05-27 19:54:05 +04:30
|
|
|
}
|
|
|
|
|
|
|
|
glShader::~glShader()
|
|
|
|
{
|
|
|
|
glDeleteProgram(m_ShaderID);
|
|
|
|
}
|
|
|
|
|
|
|
|
void glShader::Bind()
|
|
|
|
{
|
|
|
|
glUseProgram(m_ShaderID);
|
|
|
|
}
|
|
|
|
|
|
|
|
void glShader::UnBind()
|
|
|
|
{
|
|
|
|
glUseProgram(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|