From 42d792e9f42e1308939f1aac3285e2944980f8ca Mon Sep 17 00:00:00 2001 From: Samuel Walker Date: Wed, 22 Jan 2025 08:36:25 -0700 Subject: [PATCH] Implemented Uniform Buffer objects. and moved shader code to sprite renderer. --- 2dGameProject/SpriteRenderer.cpp | 73 +++++++++++++++++++++++ 2dGameProject/SpriteRenderer.h | 2 +- 2dGameProject/deff.h | 3 +- 2dGameProject/main.cpp | 99 +++++--------------------------- 4 files changed, 89 insertions(+), 88 deletions(-) diff --git a/2dGameProject/SpriteRenderer.cpp b/2dGameProject/SpriteRenderer.cpp index 3944d41..8843816 100644 --- a/2dGameProject/SpriteRenderer.cpp +++ b/2dGameProject/SpriteRenderer.cpp @@ -2,6 +2,32 @@ #include #include #include "Log.h" +#include "deff.h" + +const char* vertexShaderSource = "#version 330 core\n" +"#extension GL_ARB_explicit_uniform_location: enable\n" +"layout (location = 0) in vec3 aPos;\n" +"layout (location = 1) in vec4 color;\n" +"layout (std140) uniform matricies \n" +"{\n" +" mat4 projection;\n" +" mat4 view;\n" +"};\n" +"layout (location = 2) in mat4 model;\n" +"out vec4 vertexColor;\n" +"void main()\n" +"{\n" +" gl_Position = projection * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" +" vertexColor = color;\n" +"}\0"; + +const char* fragmentShaderSource = "#version 330 core\n" +"out vec4 FragColor;\n" +"in vec4 vertexColor;\n" +"void main()\n" +"{\n" +" FragColor = vertexColor;\n" +"}\0"; SpriteRenderer::SpriteRenderer() { //Generate Resources @@ -49,6 +75,51 @@ SpriteRenderer::SpriteRenderer() { glVertexAttribDivisor(5, 1); glBindVertexArray(0); + + unsigned int vertexShader; + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + ERR("Vertex Shader Compile Failed: {}", infoLog); + return; + } + + unsigned int fragmentShader; + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + ERR("Fragment Shader Compile Failed: {}", infoLog); + return; + } + + shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + ERR("Program Link Failed: {}", infoLog); + return; + } + + glUseProgram(shaderProgram); + unsigned int proj_index = glGetUniformBlockIndex(shaderProgram, "matricies"); + glUniformBlockBinding(shaderProgram, proj_index, PROJ_MAT_UNIFORM_BUFFER); + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + INFO("Sprite renderer initialized"); } @@ -57,6 +128,7 @@ SpriteRenderer::~SpriteRenderer() { unsigned int buffers[] = { VBO, EBO, instanceVBO }; glDeleteBuffers(3, buffers); glDeleteVertexArrays(1, &VAO); + glDeleteProgram(shaderProgram); } void SpriteRenderer::drawSprite(glm::mat4 transform) { @@ -67,6 +139,7 @@ void SpriteRenderer::flush() { glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * matrices.size(), matrices.data(), GL_STREAM_DRAW); glBindVertexArray(VAO); + glUseProgram(shaderProgram); glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, matrices.size()); glBindVertexArray(0); glFinish(); diff --git a/2dGameProject/SpriteRenderer.h b/2dGameProject/SpriteRenderer.h index ffc241c..a7ea745 100644 --- a/2dGameProject/SpriteRenderer.h +++ b/2dGameProject/SpriteRenderer.h @@ -4,7 +4,7 @@ class SpriteRenderer { private: - unsigned int VAO, VBO, EBO, instanceVBO; + unsigned int VAO, VBO, EBO, instanceVBO, shaderProgram; std::vector matrices; public: diff --git a/2dGameProject/deff.h b/2dGameProject/deff.h index a353d13..d6f7ca5 100644 --- a/2dGameProject/deff.h +++ b/2dGameProject/deff.h @@ -1,4 +1,3 @@ #pragma once -#define UNIFORM_PROJ_MAT 0 -#define UNIFORM_MODEL_MAT 1 \ No newline at end of file +#define PROJ_MAT_UNIFORM_BUFFER 0 \ No newline at end of file diff --git a/2dGameProject/main.cpp b/2dGameProject/main.cpp index 82b74ed..38f00eb 100644 --- a/2dGameProject/main.cpp +++ b/2dGameProject/main.cpp @@ -1,3 +1,5 @@ +#include "glm/ext/matrix_float4x4.hpp" +#include "glm/ext/matrix_transform.hpp" #define GLFW_INCLUDE_NONE #include #include "Window.h" @@ -18,49 +20,14 @@ int OpenGLVersion; spdlog::logger logger("none"); std::mutex ready; -float square[] = { - 1.0f, 1.0f, 0.0f, // top right - 1.0f, -1.0f, 0.0f, // bottom right - -1.0f, -1.0f, 0.0f, // bottom left - -1.0f, 1.0f, 0.0f // top left -}; - -unsigned int squareIndices[]{ - 0, 1, 3, - 1, 2, 3 -}; - -float squareColors[] = { - 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 0.0f, 0.0f, 1.0f -}; - -const char* vertexShaderSource = "#version 330 core\n" -"#extension GL_ARB_explicit_uniform_location: enable\n" -"layout (location = 0) in vec3 aPos;\n" -"layout (location = 1) in vec4 color;\n" -"layout (location = 0) uniform mat4 projection;\n" -"layout (location = 2) in mat4 model;\n" -"out vec4 vertexColor;\n" -"void main()\n" -"{\n" -" gl_Position = projection * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" -" vertexColor = color;\n" -"}\0"; - -const char* fragmentShaderSource = "#version 330 core\n" -"out vec4 FragColor;\n" -"in vec4 vertexColor;\n" -"void main()\n" -"{\n" -" FragColor = vertexColor;\n" -"}\0"; - bool running = true; Window* window; -unsigned int shaderProgram; +unsigned int uniformBuffer; + +struct matricies { + glm::mat4 projection; + glm::mat4 view; +}; void GLAPIENTRY MessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userparam) { if (type == GL_DEBUG_TYPE_ERROR) { @@ -118,55 +85,17 @@ void renderInit() { //window->setWindowedFullscreen(); openGLContextInit(); - unsigned int vertexShader; - vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); - glCompileShader(vertexShader); - - int success; - char infoLog[512]; - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); - ERR("Vertex Shader Compile Failed: {}", infoLog); - return; - } - - unsigned int fragmentShader; - fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); - glCompileShader(fragmentShader); - - glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); - ERR("Fragment Shader Compile Failed: {}", infoLog); - return; - } - - shaderProgram = glCreateProgram(); - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glLinkProgram(shaderProgram); - - glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); - if (!success) { - glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); - ERR("Program Link Failed: {}", infoLog); - return; - } - - glUseProgram(shaderProgram); - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); - + glGenBuffers(1, &uniformBuffer); + glBindBuffer(GL_UNIFORM_BUFFER, uniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4)*2, new matricies{glm::ortho(0.0f, 800.0f, 600.0f, 0.0f), glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))}, GL_STATIC_DRAW); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, PROJ_MAT_UNIFORM_BUFFER, uniformBuffer); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glUniformMatrix4fv(UNIFORM_PROJ_MAT, 1, GL_FALSE, glm::value_ptr(glm::ortho(0.0f, 800.0f, 600.0f, 0.0f))); } void deinit() { - glDeleteProgram(shaderProgram); glfwTerminate(); }