9 bool geometryShaderPresent =
false;
11 if (!geometryPath.empty()) {
12 geometryShaderPresent =
true;
15 if (!std::filesystem::exists(vertexPath)) {
18 if (!std::filesystem::exists(fragmentPath)) {
21 if (!geometryPath.empty()) {
22 if (!std::filesystem::exists(geometryPath)) {
32 const char* vertexSource = vertexCode.c_str();
36 const char* fragmentSource = fragmentCode.c_str();
39 const GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
40 glShaderSource(vertex, 1, &vertexSource,
nullptr);
41 glCompileShader(vertex);
42 if (CheckCompileErrors(vertex,
"VERTEX") ==
false) {
43 m_CreationSuccessful =
false;
45 const GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
46 glShaderSource(fragment, 1, &fragmentSource,
nullptr);
47 glCompileShader(fragment);
48 if (CheckCompileErrors(fragment,
"FRAGMENT") ==
false) {
49 m_CreationSuccessful =
false;
51 if (geometryShaderPresent) {
54 const char* geometrySource = geometryCode.c_str();
56 geometry = glCreateShader(GL_GEOMETRY_SHADER);
57 glShaderSource(geometry, 1, &geometrySource,
nullptr);
58 glCompileShader(geometry);
59 if (CheckCompileErrors(geometry,
"GEOMETRY") ==
false) {
60 m_CreationSuccessful =
false;
63 m_ID = glCreateProgram();
65 glAttachShader(m_ID, vertex);
66 glAttachShader(m_ID, fragment);
67 if (geometryShaderPresent) {
68 glAttachShader(m_ID, geometry);
72 if (CheckCompileErrors(m_ID,
"PROGRAM") ==
false) {
73 m_CreationSuccessful =
false;
76 glDeleteShader(vertex);
77 glDeleteShader(fragment);
78 if (geometryShaderPresent) {
79 glDeleteShader(geometry);
82 if (m_CreationSuccessful) {
127 if (!m_UniformLocations.contains(name)) {
128 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
131 glProgramUniform2fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, &value[0]);
135 if (!m_UniformLocations.contains(name)) {
136 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
139 glProgramUniform3fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, &value[0]);
143 if (!m_UniformLocations.contains(name)) {
144 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
147 glProgramUniform4fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, &value[0]);
151 if (!m_UniformLocations.contains(name)) {
152 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
155 glProgramUniformMatrix2fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, GL_FALSE, &value[0][0]);
159 if (!m_UniformLocations.contains(name)) {
160 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
163 glProgramUniformMatrix3fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, GL_FALSE, &value[0][0]);
167 if (!m_UniformLocations.contains(name)) {
168 m_UniformLocations.insert({ name,
static_cast<int32_t
>(glGetUniformLocation(m_ID, name)) });
171 glProgramUniformMatrix4fv(m_ID,
static_cast<GLint
>(m_UniformLocations.find(name)->second), 1, GL_FALSE, &value[0][0]);
174 bool OpenGLShaderProgram::CheckCompileErrors(
const uint32_t shader, std::string type) {