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;