diff options
author | fschildt <florian.schildt@protonmail.com> | 2025-07-21 16:07:28 +0200 |
---|---|---|
committer | fschildt <florian.schildt@protonmail.com> | 2025-07-21 16:07:28 +0200 |
commit | b46a0d9369fbaa1938f0968ab216bc2d564a9c37 (patch) | |
tree | c28b75187d01be9642af56a54a6101f51b25e4a7 /src/renderer/opengl/GlShader.cpp |
Diffstat (limited to 'src/renderer/opengl/GlShader.cpp')
-rw-r--r-- | src/renderer/opengl/GlShader.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/renderer/opengl/GlShader.cpp b/src/renderer/opengl/GlShader.cpp new file mode 100644 index 0000000..cf7c6c5 --- /dev/null +++ b/src/renderer/opengl/GlShader.cpp @@ -0,0 +1,80 @@ +#include <renderer/opengl/GlShader.hpp> +#include <GL/glew.h> +#include <stdio.h> + +static const char *s_vertex_shader_src = +"#version 330 core\n" +"layout (location = 0) in vec3 aPos;\n" +"layout (location = 1) in vec3 aColor;\n" +"\n" +"out vec4 vertexColor;\n" +"\n" +"void main()\n" +"{\n" +" gl_Position = vec4(aPos.xy, 0.0, 1.0);\n" +" vertexColor = vec4(aColor, 1.0);\n" +"}\n" +; + +static const char *s_fragment_shader_src = +"#version 330 core\n" +"in vec4 vertexColor;\n" +"\n" +"out vec4 FragColor;\n" +"\n" +"void main()\n" +"{\n" +" FragColor = vertexColor;\n" +"}\n" +; + +bool GlShader::InitProgram() { + GLuint vertex_shader; + GLuint fragment_shader; + if (!CompileShader(&vertex_shader, s_vertex_shader_src, GL_VERTEX_SHADER) || + !CompileShader(&fragment_shader, s_fragment_shader_src, GL_FRAGMENT_SHADER)) { + return false; + } + + GLuint program = glCreateProgram(); + glAttachShader(program, vertex_shader); + glAttachShader(program, fragment_shader); + glLinkProgram(program); + + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + int success; + char info_log[512]; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if (!success) { + printf("error linking shader program\n%s\n", info_log); + return false; + } + + m_ProgramId = program; + return true; +} + +void GlShader::UseProgram() { + glUseProgram(m_ProgramId); +} + +bool GlShader::CompileShader(GLuint *id, const char *src, GLenum type) { + GLuint shader = glCreateShader(type); + glShaderSource(shader, 1, &src, 0); + glCompileShader(shader); + + int success; + char info_log[512]; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if(!success) { + glGetShaderInfoLog(shader, 512, 0, info_log); + printf("error %s shader compilation failed\n%s\n", type == GL_VERTEX_SHADER ? "vertex" : "fragment", info_log); + glDeleteShader(shader); + return false; + } + + *id = shader; + return true; +} |