From 8632aa2303c3251ddbe53f423b240ea2c508a07c Mon Sep 17 00:00:00 2001 From: Aaro Koivukangas Date: Mon, 19 May 2025 17:35:19 +0300 Subject: [PATCH] can now render a trianglegit add . --- include/env-vars.h.in | 1 + include/grenderer.h | 5 ++ include/gshader.h | 12 ++++- src/grenderer.cpp | 44 +++++++++++++++-- src/gshader.cpp | 112 +++++++++++++++++++++++++++++++++++++++++- 5 files changed, 167 insertions(+), 7 deletions(-) diff --git a/include/env-vars.h.in b/include/env-vars.h.in index 8178e5d..25d3b3c 100644 --- a/include/env-vars.h.in +++ b/include/env-vars.h.in @@ -1,3 +1,4 @@ #pragma once #define GALAXY_SHADER_BIN_DIR "@GALAXY_SHADER_BIN_DIR@" +#define WIREFRAME_RENDERING 1 diff --git a/include/grenderer.h b/include/grenderer.h index 82f4872..086ad8b 100644 --- a/include/grenderer.h +++ b/include/grenderer.h @@ -1,6 +1,7 @@ #pragma once #include "gwindow.h" +#include "gshader.h" #include "logger.h" class GRenderer { @@ -13,4 +14,8 @@ public: private: Logger *logger; GWindow *window; + GShader *shader; + + unsigned int VAO; + unsigned int VBO; }; diff --git a/include/gshader.h b/include/gshader.h index 5648304..81c6f32 100644 --- a/include/gshader.h +++ b/include/gshader.h @@ -4,10 +4,18 @@ class GShader { public: - GShader(Logger *l) : logger(l) {}; - ~GShader() {}; + GShader(Logger *l) : logger(l), vertex_shader(0), fragment_shader(0) {}; + ~GShader(); + void init(); + void vertex_init(); + void fragment_init(); + + unsigned int getProgram() { return this->program; } private: Logger *logger; + unsigned int vertex_shader; + unsigned int fragment_shader; + unsigned int program; }; diff --git a/src/grenderer.cpp b/src/grenderer.cpp index 2c65fcd..f43938f 100644 --- a/src/grenderer.cpp +++ b/src/grenderer.cpp @@ -1,25 +1,61 @@ -#include "GLFW/glfw3.h" -#define GLFW_EXPOSE_NATIVE_X11 -#include "GLFW/glfw3native.h" +#include "glad/glad.h" #include "env-vars.h" #include "grenderer.h" +#include "gshader.h" #include "logger.h" -GRenderer::GRenderer(GWindow *w, Logger *l) : window(w), logger(l) { +float vertices[] = { + -0.5f, -0.5f, 0.0f, // left + 0.5f, -0.5f, 0.0f, // right + 0.0f, 0.5f, 0.0f // top +}; + +unsigned int indices[] = { + // note that we start from 0! + 0, 1, 3, // first triangle + 1, 2, 3 // second triangle +}; + +GRenderer::GRenderer(GWindow *w, Logger *l) : window(w), logger(l), VAO(0), VBO(0) { + this->shader = new GShader(l); } GRenderer::~GRenderer() { LOG_DEBUG("Shutting down renderer..."); + delete this->shader; } void GRenderer::init() { LOG_DEBUG("Initializing the GRenderer..."); + this->shader->init(); + + // Create Vertex attribute object and vertex buffer objects + glGenVertexArrays(1, &this->VAO); + glGenBuffers(1, &this->VBO); + + // Bind both of them + glBindVertexArray(this->VAO); + glBindBuffer(GL_ARRAY_BUFFER, this->VBO); + + // Send data to VBO + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // Describe data send to VBO + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr); + glEnableVertexAttribArray(0); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); } void GRenderer::update() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(this->shader->getProgram()); + glBindVertexArray(this->VAO); + glDrawArrays(GL_TRIANGLES, 0, 3); + glfwSwapBuffers(this->window->getWindow()); } diff --git a/src/gshader.cpp b/src/gshader.cpp index 11fadd4..e206756 100644 --- a/src/gshader.cpp +++ b/src/gshader.cpp @@ -1,5 +1,115 @@ -#include "logger.h" +#include "glad/glad.h" + +#include "env-vars.h" #include "gshader.h" +#include "logger.h" void GShader::init() { + LOG_DEBUG("Initializing the GShader..."); + this->vertex_init(); + this->fragment_init(); + + unsigned int program = glCreateProgram(); + + glAttachShader(program, this->vertex_shader); + glAttachShader(program, this->fragment_shader); + glLinkProgram(program); + + // Check for errors + int success; + char info_log[512]; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(program, 512, NULL, info_log); + + LOG_ERROR("Failed to link the shaders"); + LOG_ERROR(info_log); + + glDeleteShader(this->vertex_shader); + glDeleteShader(this->fragment_shader); + throw std::runtime_error("Failed to link the shaders"); + } + + // Not needed after binding + glDeleteShader(this->vertex_shader); + glDeleteShader(this->fragment_shader); + + this->program = program; + glUseProgram(this->program); + + // Test variable to enable wireframe rendering + if (WIREFRAME_RENDERING) { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } }; + +GShader::~GShader() { + glDeleteShader(this->vertex_shader); + glDeleteShader(this->fragment_shader); +} + +void GShader::vertex_init() { + const char *vertex_shader_source = + "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\n\0"; + + // Create empty vertex shader + unsigned int vertex_shader = glCreateShader(GL_VERTEX_SHADER); + + // Add source and compile the vertex shader created above + glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); + glCompileShader(vertex_shader); + + // Check for errors + int success; + char info_log[512]; + glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); + + if (!success) { + glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); + + LOG_ERROR("Creating the shader failed: "); + LOG_ERROR(info_log); + + throw std::runtime_error("Creating the shader failed"); + } + + // Success + this->vertex_shader = vertex_shader; +} + +void GShader::fragment_init() { + const char *fragment_shader_source = + "#version 330 core\n" + "out vec4 FragColor;\n" + + "void main()\n" + "{\n" + " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\0"; + + // Create empty fragment shader + unsigned int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + + // Add source to the shader and compile it + glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); + glCompileShader(fragment_shader); + + // Check for errors + int success; + char info_log[512]; + glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fragment_shader, 512, NULL, info_log); + LOG_ERROR("Creating the shader failed:"); + LOG_ERROR(info_log); + throw std::runtime_error("Creating the shader failed"); + } + + // Success + this->fragment_shader = fragment_shader; +}