From c2ce3c9cb90712c77d81eac043cbb65eb07c1cf6 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sun, 11 Jul 2021 23:59:37 -0400 Subject: [PATCH] Rendering abstraction progress --- Nuake/src/Rendering/Buffers/VertexBuffer.cpp | 10 +- Nuake/src/Rendering/Buffers/VertexBuffer.h | 5 +- Nuake/src/Rendering/Mesh/Mesh.cpp | 60 ++++------- Nuake/src/Rendering/Mesh/Mesh.h | 17 ++- .../Rendering/Platforms/OGLRendererAPI.cpp | 10 +- .../src/Rendering/Platforms/OGLRendererAPI.h | 1 + Nuake/src/Rendering/Platforms/RendererAPI.h | 5 +- Nuake/src/Rendering/RenderCommand.cpp | 5 + Nuake/src/Rendering/RenderCommand.h | 1 + Nuake/src/Rendering/Renderer.cpp | 36 +++---- Nuake/src/Rendering/Renderer.h | 2 + Nuake/src/Scene/Components/LightComponent.cpp | 4 +- Nuake/src/Scene/Components/MeshComponent.cpp | 101 +----------------- Nuake/src/Scene/Components/MeshComponent.h | 2 - 14 files changed, 77 insertions(+), 182 deletions(-) diff --git a/Nuake/src/Rendering/Buffers/VertexBuffer.cpp b/Nuake/src/Rendering/Buffers/VertexBuffer.cpp index 8c9c2e1f..5e584706 100644 --- a/Nuake/src/Rendering/Buffers/VertexBuffer.cpp +++ b/Nuake/src/Rendering/Buffers/VertexBuffer.cpp @@ -1,12 +1,12 @@ #include "VertexBuffer.h" -#include "src/Rendering/RenderCommand.h" namespace Nuake { - VertexBuffer::VertexBuffer(const void* data, unsigned int size) + VertexBuffer::VertexBuffer(const void* data, unsigned int size, RendererEnum bufferType) { + m_BufferType = bufferType; RenderCommand::GenBuffer(m_RendererID); Bind(); - RenderCommand::SetBufferData(RendererEnum::ARRAY_BUFFER, data, size); + RenderCommand::SetBufferData(m_BufferType, data, size); } VertexBuffer::~VertexBuffer() @@ -16,11 +16,11 @@ namespace Nuake { void VertexBuffer::Bind() const { - RenderCommand::BindBuffer(RendererEnum::ARRAY_BUFFER, m_RendererID); + RenderCommand::BindBuffer(m_BufferType, m_RendererID); } void VertexBuffer::Unbind() const { - RenderCommand::BindBuffer(RendererEnum::ARRAY_BUFFER, 0); + RenderCommand::BindBuffer(m_BufferType, 0); } } \ No newline at end of file diff --git a/Nuake/src/Rendering/Buffers/VertexBuffer.h b/Nuake/src/Rendering/Buffers/VertexBuffer.h index d29e4bd9..94921c09 100644 --- a/Nuake/src/Rendering/Buffers/VertexBuffer.h +++ b/Nuake/src/Rendering/Buffers/VertexBuffer.h @@ -1,15 +1,18 @@ #pragma once +#include "src/Rendering/RenderCommand.h" namespace Nuake { class VertexBuffer { public: - VertexBuffer(const void* data, unsigned int size); + VertexBuffer() {} + VertexBuffer(const void* data, unsigned int size, RendererEnum bufferType = RendererEnum::ARRAY_BUFFER); ~VertexBuffer(); void Bind() const; void Unbind() const; private: unsigned int m_RendererID = -1; + RendererEnum m_BufferType; }; } \ No newline at end of file diff --git a/Nuake/src/Rendering/Mesh/Mesh.cpp b/Nuake/src/Rendering/Mesh/Mesh.cpp index 5b1e97b9..498b4093 100644 --- a/Nuake/src/Rendering/Mesh/Mesh.cpp +++ b/Nuake/src/Rendering/Mesh/Mesh.cpp @@ -19,61 +19,37 @@ namespace Nuake void Mesh::setupMesh() { - glGenVertexArrays(1, &VAO); - glGenBuffers(1, &VBO); - glGenBuffers(1, &EBO); + m_VertexArray = new VertexArray(); + m_VertexArray->Bind(); + m_VertexBuffer = new VertexBuffer(m_Vertices.data(), m_Vertices.size() * sizeof(Vertex)); + m_ElementBuffer = new VertexBuffer(m_Indices.data(), m_Indices.size() * sizeof(unsigned int), RendererEnum::ELEMENT_ARRAY_BUFFER); - glBindVertexArray(VAO); - glBindBuffer(GL_ARRAY_BUFFER, VBO); + VertexBufferLayout bufferLayout = VertexBufferLayout(); + bufferLayout.Push(3); // Position + bufferLayout.Push(2); // UV + bufferLayout.Push(3); // Normal + bufferLayout.Push(3); // Tangent + bufferLayout.Push(3); // Bitangent + bufferLayout.Push(1); // Texture - glBufferData(GL_ARRAY_BUFFER, m_Vertices.size() * sizeof(Vertex), &m_Vertices[0], GL_STATIC_DRAW); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_Indices.size() * sizeof(unsigned int), &m_Indices[0], GL_STATIC_DRAW); - - // vertex positions - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); - glEnableVertexAttribArray(0); - - // UV - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 3)); - glEnableVertexAttribArray(1); - - // Normal - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 5)); - glEnableVertexAttribArray(2); - - // Tangent - glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 8)); - glEnableVertexAttribArray(3); - - // Bi tangent - glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 11)); - glEnableVertexAttribArray(4); - - // Texture - glVertexAttribPointer(5, 1, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 14)); - glEnableVertexAttribArray(5); - - - glBindVertexArray(0); + m_VertexArray->AddBuffer(*m_VertexBuffer, bufferLayout); + m_VertexArray->Unbind(); } void Mesh::Draw(bool drawMaterial) { if (drawMaterial) m_Material->Bind(); - // draw mesh - glBindVertexArray(VAO); - glDrawElements(GL_TRIANGLES, m_Indices.size(), GL_UNSIGNED_INT, 0); - //glBindVertexArray(0); + + m_VertexArray->Bind(); + RenderCommand::DrawElements(RendererEnum::TRIANGLES, m_Indices.size(), RendererEnum::UINT, 0); } void Mesh::DebugDraw() { Renderer::m_DebugShader->Bind(); Renderer::m_DebugShader->SetUniform4f("u_Color", 1.0f, 0.0f, 0.0f, 1.f); - glBindVertexArray(VAO); - glDrawElements(GL_TRIANGLES, m_Indices.size(), GL_UNSIGNED_INT, 0); + m_VertexArray->Bind(); + RenderCommand::DrawElements(RendererEnum::TRIANGLES, m_Indices.size(), RendererEnum::UINT, 0); } } diff --git a/Nuake/src/Rendering/Mesh/Mesh.h b/Nuake/src/Rendering/Mesh/Mesh.h index 068a8799..6572d6e1 100644 --- a/Nuake/src/Rendering/Mesh/Mesh.h +++ b/Nuake/src/Rendering/Mesh/Mesh.h @@ -1,10 +1,13 @@ #pragma once -#include -#include "src/Rendering/Textures/Texture.h" -#include "src/Rendering/Vertex.h" -#include -#include "src/Rendering/Textures/Material.h" #include "src/Core/Core.h" +#include "src/Core/Maths.h" + +#include "src/Rendering/Textures/Material.h" +#include "src/Rendering/Vertex.h" + +#include "src/Rendering/Buffers/VertexBuffer.h" +#include "src/Rendering/Buffers/VertexArray.h" +#include "src/Rendering/Buffers/VertexBufferLayout.h" namespace Nuake { @@ -21,6 +24,10 @@ namespace Nuake void DebugDraw(); private: + VertexBuffer* m_VertexBuffer; + VertexArray* m_VertexArray; + VertexBuffer* m_ElementBuffer; + unsigned int VAO, VBO, EBO; void setupMesh(); }; diff --git a/Nuake/src/Rendering/Platforms/OGLRendererAPI.cpp b/Nuake/src/Rendering/Platforms/OGLRendererAPI.cpp index c146f1d7..b79907fc 100644 --- a/Nuake/src/Rendering/Platforms/OGLRendererAPI.cpp +++ b/Nuake/src/Rendering/Platforms/OGLRendererAPI.cpp @@ -54,7 +54,13 @@ namespace Nuake { void OGLRendererAPI::VertexAttribPointer(const unsigned int index, const int size, const RendererEnum type, bool normalized, int stride, const void* pointer) { - glVertexAttribPointer(index, size, GetType(type), normalized, stride, pointer); + GLenum glType = GetType(type); + glVertexAttribPointer(index, size, glType, normalized, stride, pointer); + } + + void OGLRendererAPI::DrawElements(const RendererEnum mode, const int count, const RendererEnum type, const void* indices) + { + glDrawElements(GetType(mode), count, GetType(type), indices); } void OGLRendererAPI::DrawArrays(int from, int count) @@ -67,12 +73,14 @@ namespace Nuake { switch (bufferType) { case RendererEnum::ARRAY_BUFFER: return GL_ARRAY_BUFFER; + case RendererEnum::ELEMENT_ARRAY_BUFFER: return GL_ELEMENT_ARRAY_BUFFER; case RendererEnum::FLOAT: return GL_FLOAT; case RendererEnum::UFLOAT: return GL_BYTE; case RendererEnum::BYTE: return GL_BYTE; case RendererEnum::UBYTE: return GL_UNSIGNED_BYTE; case RendererEnum::INT: return GL_INT; case RendererEnum::UINT: return GL_UNSIGNED_INT; + case RendererEnum::TRIANGLES: return GL_TRIANGLES; } return 0; diff --git a/Nuake/src/Rendering/Platforms/OGLRendererAPI.h b/Nuake/src/Rendering/Platforms/OGLRendererAPI.h index 9c865c06..694ab163 100644 --- a/Nuake/src/Rendering/Platforms/OGLRendererAPI.h +++ b/Nuake/src/Rendering/Platforms/OGLRendererAPI.h @@ -22,6 +22,7 @@ namespace Nuake { void EnableVertexAttribArray(unsigned int& index) override; void VertexAttribPointer(const unsigned int index, const int size, const RendererEnum type, bool normalized, int stride, const void* pointer) override; + void DrawElements(const RendererEnum mode, const int count, const RendererEnum type, const void* indices) override; void DrawArrays(int from, int count) override; private: GLenum GetType(const RendererEnum& bufferType); diff --git a/Nuake/src/Rendering/Platforms/RendererAPI.h b/Nuake/src/Rendering/Platforms/RendererAPI.h index 23a4a5e5..893ddbad 100644 --- a/Nuake/src/Rendering/Platforms/RendererAPI.h +++ b/Nuake/src/Rendering/Platforms/RendererAPI.h @@ -5,7 +5,9 @@ namespace Nuake { enum class RendererEnum { INT, UINT, BYTE, UBYTE, FLOAT, UFLOAT, - ARRAY_BUFFER + ARRAY_BUFFER, + ELEMENT_ARRAY_BUFFER, + TRIANGLES }; class RendererAPI @@ -25,6 +27,7 @@ namespace Nuake { virtual void EnableVertexAttribArray(unsigned int& index) = 0; virtual void VertexAttribPointer(const unsigned int index, const int size, const RendererEnum type, bool normalized, int stride, const void* pointer) = 0; + virtual void DrawElements(const RendererEnum mode, const int count, const RendererEnum type, const void* indices) = 0; virtual void DrawArrays(int from, int count) = 0; }; } \ No newline at end of file diff --git a/Nuake/src/Rendering/RenderCommand.cpp b/Nuake/src/Rendering/RenderCommand.cpp index a66198cd..4357bafd 100644 --- a/Nuake/src/Rendering/RenderCommand.cpp +++ b/Nuake/src/Rendering/RenderCommand.cpp @@ -64,6 +64,11 @@ namespace Nuake { sRendererAPI->VertexAttribPointer(index, size, type, normalized, stride, pointer); } + void RenderCommand::DrawElements(const RendererEnum mode, const int count, const RendererEnum type, const void* indices) + { + sRendererAPI->DrawElements(mode, count, type, indices); + } + void RenderCommand::DrawArrays(int first, int count) { sRendererAPI->DrawArrays(first, count); diff --git a/Nuake/src/Rendering/RenderCommand.h b/Nuake/src/Rendering/RenderCommand.h index fd40d889..84471bb7 100644 --- a/Nuake/src/Rendering/RenderCommand.h +++ b/Nuake/src/Rendering/RenderCommand.h @@ -27,6 +27,7 @@ namespace Nuake { static void BindVertexArray(const unsigned int& rendererID); static void VertexAttribPointer(const unsigned int index, const int size, const RendererEnum type, bool normalized, int stride, const void* pointer); + static void DrawElements(const RendererEnum mode, const int count, const RendererEnum type, const void* indices); static void DrawArrays(int first, int count); private: static RendererAPI* sRendererAPI; diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index 422fae93..7a04ad7c 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -29,6 +29,7 @@ namespace Nuake Ref Renderer::m_ShadowmapShader; VertexArray* Renderer::QuadVertexArray; + VertexBuffer* Renderer::QuadVertexBuffer; unsigned int CubeVAO; unsigned int CubeVBO; @@ -85,43 +86,29 @@ namespace Nuake QuadVertexArray = new VertexArray(); QuadVertexArray->Bind(); - VertexBuffer quadVertexBuffer(QuadVertices, sizeof(QuadVertices)); + QuadVertexBuffer = new VertexBuffer(QuadVertices, sizeof(QuadVertices)); VertexBufferLayout vblayout = VertexBufferLayout(); vblayout.Push(3); vblayout.Push(2); - - - QuadVertexArray->AddBuffer(quadVertexBuffer, vblayout); - - //glGenVertexArrays(1, &QuadVAO);` - //glBindVertexArray(QuadVAO); - // - //glGenBuffers(1, &QuadVBO); - //glBindBuffer(GL_ARRAY_BUFFER, QuadVBO); - //glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertices), QuadVertices, GL_STATIC_DRAW); - // - //glEnableVertexAttribArray(0); - //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); - //glEnableVertexAttribArray(1); - //glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + QuadVertexArray->AddBuffer(*QuadVertexBuffer, vblayout); } void Renderer::LoadShaders() { - m_ShadowmapShader = ShaderManager::GetShader("resources/Shaders/shadowMap.shader"); - m_SkyboxShader = ShaderManager::GetShader("resources/Shaders/skybox.shader"); - m_BRDShader = ShaderManager::GetShader("resources/Shaders/BRD.shader"); - m_GBufferShader = ShaderManager::GetShader("resources/Shaders/gbuffer.shader"); - m_DeferredShader = ShaderManager::GetShader("resources/Shaders/deferred.shader"); + m_ShadowmapShader = ShaderManager::GetShader("resources/Shaders/shadowMap.shader"); + m_SkyboxShader = ShaderManager::GetShader("resources/Shaders/skybox.shader"); + m_BRDShader = ShaderManager::GetShader("resources/Shaders/BRD.shader"); + m_GBufferShader = ShaderManager::GetShader("resources/Shaders/gbuffer.shader"); + m_DeferredShader = ShaderManager::GetShader("resources/Shaders/deferred.shader"); m_ProceduralSkyShader = ShaderManager::GetShader("resources/Shaders/atmospheric_sky.shader"); - m_DebugShader = ShaderManager::GetShader("resources/Shaders/debug.shader"); - m_Shader = ShaderManager::GetShader("resources/Shaders/basic.shader"); + m_DebugShader = ShaderManager::GetShader("resources/Shaders/debug.shader"); + m_Shader = ShaderManager::GetShader("resources/Shaders/basic.shader"); } void Renderer::BeginDraw(Ref camera) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + RenderCommand::Clear(); m_Shader->Bind(); m_Shader->SetUniformMat4f("u_Projection", camera->GetPerspective()); @@ -141,6 +128,7 @@ namespace Nuake { if (m_Lights.size() == 20) return; + m_Lights.push_back({ transform , light }); // What light idx is this? diff --git a/Nuake/src/Rendering/Renderer.h b/Nuake/src/Rendering/Renderer.h index ef3f984e..5a31dc13 100644 --- a/Nuake/src/Rendering/Renderer.h +++ b/Nuake/src/Rendering/Renderer.h @@ -16,6 +16,8 @@ namespace Nuake { public: static VertexArray* Renderer::QuadVertexArray; + static VertexBuffer* Renderer::QuadVertexBuffer; + static Ref m_Shader; static Ref m_ShadowmapShader; static Ref m_SkyboxShader; diff --git a/Nuake/src/Scene/Components/LightComponent.cpp b/Nuake/src/Scene/Components/LightComponent.cpp index ef24c0a3..32d16f65 100644 --- a/Nuake/src/Scene/Components/LightComponent.cpp +++ b/Nuake/src/Scene/Components/LightComponent.cpp @@ -1,10 +1,10 @@ #pragma once //#include #include "LightComponent.h" -#include "../../../Rendering/Renderer.h" +#include "src/Rendering/Renderer.h" #include -#include "../Core/Core.h" +#include "src/Core/Core.h" #include namespace Nuake { diff --git a/Nuake/src/Scene/Components/MeshComponent.cpp b/Nuake/src/Scene/Components/MeshComponent.cpp index 82af9da8..74ca53a5 100644 --- a/Nuake/src/Scene/Components/MeshComponent.cpp +++ b/Nuake/src/Scene/Components/MeshComponent.cpp @@ -62,107 +62,10 @@ namespace Nuake { // //ProcessNode(scene->mRootNode, scene); } + unsigned int sphereVAO = 0; unsigned int indexCount; - void MeshComponent::RenderSphere() { - - if (sphereVAO == 0) - { - glGenVertexArrays(1, &sphereVAO); - - unsigned int vbo, ebo; - glGenBuffers(1, &vbo); - glGenBuffers(1, &ebo); - - std::vector positions; - std::vector uv; - std::vector normals; - std::vector indices; - - const unsigned int X_SEGMENTS = 64; - const unsigned int Y_SEGMENTS = 64; - const float PI = 3.14159265359; - for (unsigned int y = 0; y <= Y_SEGMENTS; ++y) - { - for (unsigned int x = 0; x <= X_SEGMENTS; ++x) - { - float xSegment = (float)x / (float)X_SEGMENTS; - float ySegment = (float)y / (float)Y_SEGMENTS; - float xPos = std::cos(xSegment * 2.0f * PI) * std::sin(ySegment * PI); - float yPos = std::cos(ySegment * PI); - float zPos = std::sin(xSegment * 2.0f * PI) * std::sin(ySegment * PI); - - positions.push_back(glm::vec3(xPos, yPos, zPos)); - uv.push_back(glm::vec2(xSegment, ySegment)); - normals.push_back(glm::vec3(xPos, yPos, zPos)); - } - } - - bool oddRow = false; - for (unsigned int y = 0; y < Y_SEGMENTS; ++y) - { - if (!oddRow) // even rows: y == 0, y == 2; and so on - { - for (unsigned int x = 0; x <= X_SEGMENTS; ++x) - { - indices.push_back(y * (X_SEGMENTS + 1) + x); - indices.push_back((y + 1) * (X_SEGMENTS + 1) + x); - } - } - else - { - for (int x = X_SEGMENTS; x >= 0; --x) - { - indices.push_back((y + 1) * (X_SEGMENTS + 1) + x); - indices.push_back(y * (X_SEGMENTS + 1) + x); - } - } - oddRow = !oddRow; - } - indexCount = indices.size(); - - std::vector data; - for (std::size_t i = 0; i < positions.size(); ++i) - { - data.push_back(positions[i].x); - data.push_back(positions[i].y); - data.push_back(positions[i].z); - - if (uv.size() > 0) - { - data.push_back(uv[i].x); - data.push_back(uv[i].y); - } - if (normals.size() > 0) - { - data.push_back(normals[i].x); - data.push_back(normals[i].y); - data.push_back(normals[i].z); - } - } - glBindVertexArray(sphereVAO); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(float), &data[0], GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW); - float stride = (3 + 2 + 3) * sizeof(float); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); - glEnableVertexAttribArray(0); - - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 3)); - glEnableVertexAttribArray(1); - - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 5)); - glEnableVertexAttribArray(2); - - glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(GL_FLOAT) * 8)); - glEnableVertexAttribArray(3); - } - - glBindVertexArray(sphereVAO); - glDrawElements(GL_TRIANGLE_STRIP, indexCount, GL_UNSIGNED_INT, 0); - - } + //void MeshComponent::ProcessNode(aiNode * node, const aiScene* scene) //{ diff --git a/Nuake/src/Scene/Components/MeshComponent.h b/Nuake/src/Scene/Components/MeshComponent.h index 19853ba1..1cf6e0c9 100644 --- a/Nuake/src/Scene/Components/MeshComponent.h +++ b/Nuake/src/Scene/Components/MeshComponent.h @@ -20,7 +20,5 @@ namespace Nuake { void SetMaterial(const std::string materialName); void Draw(glm::mat4 projection, glm::mat4 view, glm::mat4 transform); void DrawEditor(); - - void RenderSphere(); }; }