From b46a0d9369fbaa1938f0968ab216bc2d564a9c37 Mon Sep 17 00:00:00 2001 From: fschildt Date: Mon, 21 Jul 2025 16:07:28 +0200 Subject: first commit --- src/renderer/opengl/GlShader.cpp | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/renderer/opengl/GlShader.cpp (limited to 'src/renderer/opengl/GlShader.cpp') 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 +#include +#include + +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; +} -- cgit v1.2.3