diff --git a/NFPackCreator/AssetBuild/base/shaders/gBufferFragment.shader b/NFPackCreator/AssetBuild/base/shaders/gBufferFragment.shader index e69de29..6962304 100644 --- a/NFPackCreator/AssetBuild/base/shaders/gBufferFragment.shader +++ b/NFPackCreator/AssetBuild/base/shaders/gBufferFragment.shader @@ -0,0 +1,2 @@ +#version 330 core + diff --git a/NFPackCreator/AssetBuild/base/shaders/gBufferVertex.shader b/NFPackCreator/AssetBuild/base/shaders/gBufferVertex.shader index e69de29..0cae23a 100644 --- a/NFPackCreator/AssetBuild/base/shaders/gBufferVertex.shader +++ b/NFPackCreator/AssetBuild/base/shaders/gBufferVertex.shader @@ -0,0 +1,23 @@ +#version 330 core + +layout(location = 0) in vec3 pos; +layout(location = 1) in vec2 texCoords; +layout(location = 2) in vec3 normals; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 proj; + +out vec3 fragPos; +out vec2 texCoord; +out vec3 normal; + +void main() { + vec4 world = model * vec4(pos, 1.0); + fragPos = world.xyz; + texCoord = texCoords; + mat3 normalMat = transpose(inverse(mat3(model))); + normal - normalMat * normals; + + gl_Position = proj * view * world; +} \ No newline at end of file diff --git a/NothinFancy/NothinFancy.vcxproj b/NothinFancy/NothinFancy.vcxproj index 6d9ecd8..4fab881 100644 --- a/NothinFancy/NothinFancy.vcxproj +++ b/NothinFancy/NothinFancy.vcxproj @@ -206,6 +206,7 @@ + @@ -230,6 +231,7 @@ + diff --git a/NothinFancy/NothinFancy.vcxproj.filters b/NothinFancy/NothinFancy.vcxproj.filters index 2be8a82..bb88ef9 100644 --- a/NothinFancy/NothinFancy.vcxproj.filters +++ b/NothinFancy/NothinFancy.vcxproj.filters @@ -84,6 +84,9 @@ Source Files + + Source Files + @@ -167,6 +170,9 @@ Header Files + + Header Files + diff --git a/NothinFancy/src/Renderer/GBuffer.cpp b/NothinFancy/src/Renderer/GBuffer.cpp new file mode 100644 index 0000000..da0ab37 --- /dev/null +++ b/NothinFancy/src/Renderer/GBuffer.cpp @@ -0,0 +1,68 @@ +#include "GBuffer.h" + +#include "GL/glew.h" + +#include "Application.h" +#include "Entity.h" + +namespace nf { + GBuffer::GBuffer() : + m_FBO(0), + m_depth(0), + m_width(0), + m_height(0) + { + glGenFramebuffers(1, &m_FBO); + glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); + + m_width = Application::getApp()->getConfig().width; + m_height = Application::getApp()->getConfig().height; + glGenTextures(m_textures.size(), &m_textures[0]); + for (unsigned int i = 0; i < m_textures.size(); i++) { + glBindTexture(GL_TEXTURE_2D, m_textures[i]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, m_width, m_height, 0, GL_RGB, GL_FLOAT, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0); + } + glGenTextures(1, &m_depth); + glBindTexture(GL_TEXTURE_2D, m_depth); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depth, 0); + GLenum draw[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT7 }; + glDrawBuffers(m_textures.size(), draw); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } + + void GBuffer::resize() { + unsigned int width, height; + width = Application::getApp()->getConfig().width; + height = Application::getApp()->getConfig().height; + if (m_width != width || m_height != height) { + m_width = width; + m_height = height; + for (unsigned int curr : m_textures) { + glBindTexture(GL_TEXTURE_2D, curr); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, m_width, m_height, 0, GL_RGB, GL_FLOAT, nullptr); + } + } + } + + void GBuffer::render(std::vector& entites) { + + } + + void GBuffer::bindTextures() { + for (unsigned int i = 0; i < m_textures.size(); i++) { + glActiveTexture(GL_TEXTURE0 + i); + glBindTexture(GL_TEXTURE_2D, m_textures[i]); + } + } + + GBuffer::~GBuffer() { + for (unsigned int curr : m_textures) + glDeleteTextures(1, &curr); + glDeleteTextures(1, &m_depth); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &m_FBO); + } +} \ No newline at end of file diff --git a/NothinFancy/src/Renderer/Renderer.cpp b/NothinFancy/src/Renderer/Renderer.cpp index 6998dbb..a992f71 100644 --- a/NothinFancy/src/Renderer/Renderer.cpp +++ b/NothinFancy/src/Renderer/Renderer.cpp @@ -6,6 +6,7 @@ #include "stb_image.h" #include "Application.h" +#include "GBuffer.h" #include "Shader.h" #include "Light.h" #include "Entity.h" @@ -17,6 +18,7 @@ namespace nf { Renderer::Renderer(Application* app) : + m_gBuffer(nullptr), m_shadowMapFBO(0), m_directionalDepthTexSize(0), m_pointDepthTexSize(0), @@ -73,6 +75,8 @@ namespace nf { loadBaseAssets(); + m_gBuffer = new GBuffer; + m_directionalDepthTexSize = 4096; m_pointDepthTexSize = 1024; createShadowMap(); @@ -354,6 +358,9 @@ namespace nf { const char* entityVertex = m_baseAP["entityVertex.shader"]->data; const char* entityFragment = m_baseAP["entityFragment.shader"]->data; m_entityShader = new Shader(entityVertex, entityFragment); + const char* gBufferVertex = m_baseAP["gBufferVertex.shader"]->data; + const char* gBufferFragment = m_baseAP["gBufferFragment.shader"]->data; + m_gBufferShader = new Shader(gBufferVertex, gBufferFragment); const char* textVertex = m_baseAP["textVertex.shader"]->data; const char* textFragment = m_baseAP["textFragment.shader"]->data; m_textShader = new Shader(textVertex, textFragment); @@ -424,6 +431,7 @@ namespace nf { delete m_cubemapShader; delete m_fadeShader; delete m_directionalShadowShader; + delete m_gBuffer; delete m_fadeVAO; delete m_fadeIB; ReleaseDC(m_app->getWindow(), m_hdc); diff --git a/NothinFancy/src/include/GBuffer.h b/NothinFancy/src/include/GBuffer.h new file mode 100644 index 0000000..2cf94ce --- /dev/null +++ b/NothinFancy/src/include/GBuffer.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include + +namespace nf { + class Entity; + + class GBuffer { + public: + GBuffer(); + + void resize(); + void render(std::vector& entities); + void bindTextures(); + + ~GBuffer(); + private: + unsigned int m_FBO; + std::array m_textures; //TODO: Check this number + unsigned int m_depth; + + unsigned int m_width, m_height; + }; +} \ No newline at end of file diff --git a/NothinFancy/src/include/NothinFancy.h b/NothinFancy/src/include/NothinFancy.h index f7d4b26..0bc0dce 100644 --- a/NothinFancy/src/include/NothinFancy.h +++ b/NothinFancy/src/include/NothinFancy.h @@ -64,6 +64,7 @@ namespace nf { std::vector m_lGame; Cubemap* m_cubemap; std::vector m_lUI; + Shader* m_gBufferShader; Shader* m_entityShader; Shader* m_textShader; Shader* m_uiTextureShader; diff --git a/NothinFancy/src/include/Renderer.h b/NothinFancy/src/include/Renderer.h index 70f1a50..8670220 100644 --- a/NothinFancy/src/include/Renderer.h +++ b/NothinFancy/src/include/Renderer.h @@ -13,6 +13,7 @@ namespace nf { class Light; class Cubemap; class Camera; + class GBuffer; class VertexArray; class IndexBuffer; @@ -44,6 +45,8 @@ namespace nf { AssetPack m_baseAP; + GBuffer* m_gBuffer; + unsigned int m_shadowMapFBO; int m_directionalDepthTexSize; int m_pointDepthTexSize; @@ -55,6 +58,7 @@ namespace nf { std::vector m_lGame; Cubemap* m_cubemap; std::vector m_lUI; + Shader* m_gBufferShader; Shader* m_entityShader; Shader* m_textShader; Shader* m_uiTextureShader;