can now render a trianglegit add .

This commit is contained in:
Aaro Koivukangas
2025-05-19 17:35:19 +03:00
parent 774fdcec7c
commit 8632aa2303
5 changed files with 167 additions and 7 deletions
+1
View File
@@ -1,3 +1,4 @@
#pragma once
#define GALAXY_SHADER_BIN_DIR "@GALAXY_SHADER_BIN_DIR@"
#define WIREFRAME_RENDERING 1
+5
View File
@@ -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;
};
+10 -2
View File
@@ -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;
};
+40 -4
View File
@@ -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());
}
+111 -1
View File
@@ -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;
}