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
|
#pragma once
|
||||||
|
|
||||||
#define GALAXY_SHADER_BIN_DIR "@GALAXY_SHADER_BIN_DIR@"
|
#define GALAXY_SHADER_BIN_DIR "@GALAXY_SHADER_BIN_DIR@"
|
||||||
|
#define WIREFRAME_RENDERING 1
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "gwindow.h"
|
#include "gwindow.h"
|
||||||
|
#include "gshader.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
|
||||||
class GRenderer {
|
class GRenderer {
|
||||||
@@ -13,4 +14,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
Logger *logger;
|
Logger *logger;
|
||||||
GWindow *window;
|
GWindow *window;
|
||||||
|
GShader *shader;
|
||||||
|
|
||||||
|
unsigned int VAO;
|
||||||
|
unsigned int VBO;
|
||||||
};
|
};
|
||||||
|
|||||||
+10
-2
@@ -4,10 +4,18 @@
|
|||||||
|
|
||||||
class GShader {
|
class GShader {
|
||||||
public:
|
public:
|
||||||
GShader(Logger *l) : logger(l) {};
|
GShader(Logger *l) : logger(l), vertex_shader(0), fragment_shader(0) {};
|
||||||
~GShader() {};
|
~GShader();
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
void vertex_init();
|
||||||
|
void fragment_init();
|
||||||
|
|
||||||
|
unsigned int getProgram() { return this->program; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Logger *logger;
|
Logger *logger;
|
||||||
|
unsigned int vertex_shader;
|
||||||
|
unsigned int fragment_shader;
|
||||||
|
unsigned int program;
|
||||||
};
|
};
|
||||||
|
|||||||
+40
-4
@@ -1,25 +1,61 @@
|
|||||||
#include "GLFW/glfw3.h"
|
#include "glad/glad.h"
|
||||||
#define GLFW_EXPOSE_NATIVE_X11
|
|
||||||
#include "GLFW/glfw3native.h"
|
|
||||||
|
|
||||||
#include "env-vars.h"
|
#include "env-vars.h"
|
||||||
#include "grenderer.h"
|
#include "grenderer.h"
|
||||||
|
#include "gshader.h"
|
||||||
#include "logger.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() {
|
GRenderer::~GRenderer() {
|
||||||
LOG_DEBUG("Shutting down renderer...");
|
LOG_DEBUG("Shutting down renderer...");
|
||||||
|
delete this->shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRenderer::init() {
|
void GRenderer::init() {
|
||||||
LOG_DEBUG("Initializing the GRenderer...");
|
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() {
|
void GRenderer::update() {
|
||||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glUseProgram(this->shader->getProgram());
|
||||||
|
glBindVertexArray(this->VAO);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
glfwSwapBuffers(this->window->getWindow());
|
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 "gshader.h"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
void GShader::init() {
|
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