mirror of
https://github.com/iritmaximus/galaxy-engine.git
synced 2026-10-12 19:13:41 +03:00
can now render a trianglegit add .
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#define GALAXY_SHADER_BIN_DIR "@GALAXY_SHADER_BIN_DIR@"
|
||||
#define WIREFRAME_RENDERING 1
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user