Fixed framebuffer resizing and transform rotation matrix

This commit is contained in:
antopilo
2021-09-04 01:41:47 -04:00
parent c3d3e20ab4
commit 99ea3a906c
15 changed files with 115 additions and 48 deletions

View File

@@ -159,7 +159,6 @@ float ShadowCalculation(Light light, vec3 FragPos, vec3 normal)
// transform to [0,1] range
projCoords = projCoords * 0.5 + 0.5;
// get closest depth value from light's perspective (using [0,1] range fragPosLight as coords)
float closestDepth = texture(light.ShadowMaps[0], projCoords.xy).r;
// get depth of current fragment from light's perspective
float currentDepth = projCoords.z;
// check whether current frag pos is in shadow
@@ -214,7 +213,14 @@ vec3 ComputeVolumetric(vec3 FragPos, Light light)
if (closestDepth > currentDepth)
accumFog += (ComputeScattering(dot(rayDirection, light.Direction)).xxx * light.Color);
currentPosition += step;
//float ditherPattern[4][4] = {
// { 0.0f, 0.5f, 0.125f, 0.625f},
// { 0.75f, 0.22f, 0.875f, 0.375f},
// { 0.1875f, 0.6875f, 0.0625f, 0.5625},
// { 0.9375f, 0.4375f, 0.8125f, 0.3125}
//};
currentPosition += step; //* ditherPattern[int(gl_FragCoord.x) % 4][int(gl_FragCoord.y) % 4];
}
accumFog /= u_FogStepCount;

View File

@@ -69,10 +69,14 @@ namespace Nuake {
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
Vector2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
if (Engine::GetCurrentWindow()->GetFrameBuffer()->GetSize() != viewportPanelSize)
Engine::GetCurrentWindow()->GetFrameBuffer()->QueueResize(viewportPanelSize);
Ref<FrameBuffer> framebuffer = Engine::GetCurrentWindow()->GetDeferredBuffer();
if (framebuffer->GetSize() != viewportPanelSize)
{
Engine::GetCurrentWindow()->GetGBuffer()->QueueResize(viewportPanelSize);
framebuffer->QueueResize(viewportPanelSize);
}
Ref<Texture> texture = Engine::GetCurrentWindow()->GetFrameBuffer()->GetTexture();
Ref<Texture> texture = framebuffer->GetTexture();
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
ImGuizmo::SetDrawlist();
@@ -131,23 +135,23 @@ namespace Nuake {
if (m_IsEntitySelected)
{
if (ImGui::Begin("DEFERRED"))
{
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
Ref<Texture> texture = Engine::GetCurrentWindow()->GetDeferredBuffer()->GetTexture(GL_COLOR_ATTACHMENT0);
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
//if (ImGui::Begin("DEFERRED"))
//{
// ImVec2 regionAvail = ImGui::GetContentRegionAvail();
// glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
// Ref<Texture> texture = Engine::GetCurrentWindow()->GetDeferredBuffer()->GetTexture(GL_COLOR_ATTACHMENT0);
// ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
//
//}
//ImGui::End();
//
if (ImGui::Begin("GBUFFER"))
{
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
Ref<Texture> texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_DEPTH_ATTACHMENT);
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
if (ImGui::Begin("GBUFFER2"))
@@ -156,7 +160,7 @@ namespace Nuake {
glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
Ref<Texture> texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT0);
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
if (ImGui::Begin("GBUFFER3"))
@@ -165,7 +169,7 @@ namespace Nuake {
glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
Ref<Texture> texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT1);
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
if (ImGui::Begin("GBUFFER4"))
@@ -174,7 +178,7 @@ namespace Nuake {
glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y);
Ref<Texture> texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT2);
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
//

View File

@@ -50,10 +50,11 @@ namespace Nuake
// Dont update if no scene is loaded.
if (CurrentWindow->GetScene())
{
CurrentWindow->Update(timestep);
// Play mode update all the entities, Editor does not.
if (Engine::IsPlayMode)
{
CurrentWindow->Update(timestep);
m_FixedUpdateDifference += timestep;
// Fixed update

View File

@@ -7,12 +7,13 @@ namespace Nuake
{
m_Textures = std::map<int, Ref<Texture>>();
m_Size = size;
m_HasRenderBuffer = hasRenderBuffer;
glGenFramebuffers(1, &m_FramebufferID);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FramebufferID);
// Create render buffer and attach to frame buffer.
if (hasRenderBuffer)
if (m_HasRenderBuffer)
{
glGenRenderbuffers(1, &m_RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer);
@@ -94,25 +95,29 @@ namespace Nuake
// Delete frame buffer and render buffer.
glDeleteFramebuffers(1, &m_FramebufferID);
glDeleteRenderbuffers(1, &m_RenderBuffer);
// Recreate resized texture.
for (auto t : m_Textures)
t.second->Resize(size);
if(m_HasRenderBuffer)
glDeleteRenderbuffers(1, &m_RenderBuffer);
// New FBO and RBO.
glGenFramebuffers(1, &m_FramebufferID);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FramebufferID);
// Recreate resized texture.
for (auto t : m_Textures)
t.second->AttachToFramebuffer(t.first);
for (auto& t : m_Textures)
{
t.second->Resize(size);
SetTexture(t.second, t.first);
}
// Recreate render buffer
glGenRenderbuffers(1, &m_RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Size.x, m_Size.y);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RenderBuffer);
// TODO: move out render buffer.
if (m_HasRenderBuffer)
{
glGenRenderbuffers(1, &m_RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Size.x, m_Size.y);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RenderBuffer);
}
// Unbind.
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

View File

@@ -19,6 +19,7 @@ namespace Nuake
std::map<int, Ref<Texture>> m_Textures;
Ref<Texture> m_Texture;
bool m_HasRenderBuffer = false;
public:
FrameBuffer(bool hasRenderBuffer, Vector2 size);

View File

@@ -12,8 +12,8 @@ namespace Nuake
Ref<FrameBuffer> shadowmap = CreateRef<FrameBuffer>(false, glm::vec2(4096, 4096));
Ref<Texture> texture = CreateRef<Texture>(glm::vec2(4096, 4096), GL_DEPTH_COMPONENT);
texture->SetParameter(GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
shadowmap->SetTexture(texture, GL_DEPTH_ATTACHMENT);
m_ShadowMaps[i] = shadowmap;
}
}

View File

@@ -138,7 +138,6 @@ namespace Nuake
Matrix4 lightView = glm::lookAt(pos, pos - direction, glm::vec3(0.0f, 1.0f, 0.0f));
//light.m_Framebuffer->GetTexture(GL_DEPTH_ATTACHMENT)->Bind(17);
if (light.CastShadows)
{
for (unsigned int i = 0; i < CSM_AMOUNT; i++)
@@ -171,7 +170,7 @@ namespace Nuake
int idx = m_Lights.size();
Vector3 direction = light.GetDirection();
Vector3 pos = transform.GlobalTranslation;
Vector3 pos = transform.GetTransform()[3];
Matrix4 lightView = glm::lookAt(pos, pos - direction, glm::vec3(0.0f, 1.0f, 0.0f));
//light.m_Framebuffer->GetTexture(GL_DEPTH_ATTACHMENT)->Bind(17);
@@ -190,7 +189,7 @@ namespace Nuake
deferredShader->SetUniform1i("LightCount", idx);
deferredShader->SetUniform1i("Lights[" + std::to_string(idx - 1) + "].Type", light.Type);
deferredShader->SetUniformMat4f("Lights[" + std::to_string(idx - 1) + "].LightTransform", light.GetProjection() * lightView);
deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Position", transform.GlobalTranslation.x, transform.GlobalTranslation.y, transform.GlobalTranslation.z);
deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Position",pos.x, pos.y, pos.z);
deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Direction", direction.x, direction.y, direction.z);
deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Color", light.Color.r * light.Strength, light.Color.g * light.Strength, light.Color.b * light.Strength);
deferredShader->SetUniform1i("Lights[" + std::to_string(idx - 1) + "].Volumetric", light.IsVolumetric);

View File

@@ -99,4 +99,11 @@ namespace Nuake
{
glBindTexture(GL_TEXTURE_2D, 0);
}
void Texture::SetParameter(const GLenum& param, const GLenum& value)
{
Bind();
glTextureParameteri(GL_TEXTURE_2D, param, value);
Unbind();
}
}

View File

@@ -33,6 +33,8 @@ namespace Nuake
void Bind(unsigned int slot = 0) const;
void Unbind() const;
void SetParameter(const GLenum& param, const GLenum& value);
unsigned int GetID() const { return m_RendererId; }
inline std::string GetPath() { return m_FilePath; }
inline int GetWidth() const { return m_Width; }

View File

@@ -13,12 +13,12 @@ namespace Nuake
glm::mat4 TransformComponent::GetTransform()
{
Matrix4 transform = Matrix4(1.0f);
transform = glm::translate(transform, GlobalTranslation);
transform = glm::rotate(transform, glm::radians(Rotation.x), Vector3(1, 0, 0));
transform = glm::rotate(transform, glm::radians(Rotation.y), Vector3(0, 1, 0));
transform = glm::rotate(transform, glm::radians(Rotation.z), Vector3(0, 0, 1));
transform = glm::scale(transform, Scale);
return transform;
//Matrix4 transform = Matrix4(1.0f);
//transform = glm::translate(transform, GlobalTranslation);
//transform = glm::rotate(transform, glm::radians(Rotation.x), Vector3(1, 0, 0));
//transform = glm::rotate(transform, glm::radians(Rotation.y), Vector3(0, 1, 0));
//transform = glm::rotate(transform, glm::radians(Rotation.z), Vector3(0, 0, 1));
//transform = glm::scale(transform, Scale);
return Transform;
}
}

View File

@@ -1,6 +1,6 @@
#pragma once
#include "../Core/Maths.h"
#include "../Resource/Serializable.h"
#include "src/Core/Maths.h"
#include "src/Resource/Serializable.h"
namespace Nuake
{
@@ -8,6 +8,7 @@ namespace Nuake
public:
Vector3 GlobalTranslation;
Vector3 Translation;
Matrix4 Transform;
Vector3 GlobalRotation;
Vector3 Rotation; // TODO: Should use quaternions.

View File

@@ -90,6 +90,9 @@ namespace Nuake
void PhysicsSystem::Update(Timestep ts)
{
if (!Engine::IsPlayMode)
return;
PhysicsManager::Get()->Step(ts);
auto brushes = m_Scene->m_Registry.view<TransformComponent, BSPBrushComponent>();

View File

@@ -1,6 +1,7 @@
#include "ScriptingSystem.h"
#include "src/Scene/Components/WrenScriptComponent.h"
#include "src/Scene/Scene.h"
#include "Engine.h"
namespace Nuake {
ScriptingSystem::ScriptingSystem(Scene* scene)
@@ -36,6 +37,9 @@ namespace Nuake {
void ScriptingSystem::Update(Timestep ts)
{
if (!Engine::IsPlayMode)
return;
auto entities = m_Scene->m_Registry.view<WrenScriptComponent>();
for (auto& e : entities)
{

View File

@@ -49,32 +49,63 @@ namespace Nuake {
auto [parent, transform] = transformView.get<ParentComponent, TransformComponent>(e);
Entity currentParent = Entity((entt::entity)e, m_Scene);
Matrix4 globalTransform = Matrix4(1.0f);
Vector3 globalPosition = Vector3();
Vector3 globalRotation = Vector3();
Vector3 globalScale = Vector3();
if (parent.HasParent)
{
globalTransform = glm::translate(globalTransform, transform.Translation);
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.x), Vector3(1, 0, 0));
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.y), Vector3(0, 1, 0));
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.z), Vector3(0, 0, 1));
globalTransform = glm::scale(globalTransform, transform.Scale);
ParentComponent parentComponent = currentParent.GetComponent<ParentComponent>();
while (parentComponent.HasParent)
{
TransformComponent& transformComponent = parentComponent.Parent.GetComponent<TransformComponent>();
Matrix4 currentParentMatrix = Matrix4(1.0f);
currentParentMatrix = glm::translate(currentParentMatrix, transformComponent.Translation);
currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.x), Vector3(1, 0, 0));
currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.y), Vector3(0, 1, 0));
currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.z), Vector3(0, 0, 1));
currentParentMatrix = glm::scale(currentParentMatrix, transformComponent.Scale);
globalTransform = currentParentMatrix * globalTransform;
globalPosition += transformComponent.Translation;
globalRotation += transformComponent.Rotation;
globalScale *= transformComponent.Scale;
parentComponent = parentComponent.Parent.GetComponent<ParentComponent>();
}
transform.GlobalTranslation = globalPosition + transform.Translation;
transform.GlobalRotation = globalRotation + transform.Rotation;
transform.GlobalScale = globalScale * transform.Scale;
transform.Transform = globalTransform;
}
else
{
transform.GlobalTranslation = transform.Translation;
transform.GlobalRotation = transform.Rotation;
transform.Scale = transform.Scale;
globalTransform = glm::translate(globalTransform, transform.Translation);
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.x), Vector3(1, 0, 0));
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.y), Vector3(0, 1, 0));
globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.z), Vector3(0, 0, 1));
globalTransform = glm::scale(globalTransform, transform.Scale);
transform.Transform = globalTransform;
}
}
}

View File

@@ -17,7 +17,7 @@
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/matrix_decompose.hpp>
#include "Resource/FontAwesome5.h"
#include "../Engine.h"
#include "Engine.h"
namespace Nuake {
// TODO: Use abstraction for vertex buffers
@@ -133,6 +133,7 @@ namespace Nuake {
// TODO: have clear color in environnement.
glClearColor(0.019f, 0.501f, 1.0f, 1.0f);
glfwSwapInterval(1);
glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
glEnable(GL_DEPTH_TEST);
glEnable(GL_MULTISAMPLE);
@@ -277,6 +278,8 @@ namespace Nuake {
}
m_Framebuffer->Unbind();
m_Scene->m_EditorCamera->OnWindowResize(m_GBuffer->GetSize().x, m_GBuffer->GetSize().y);
m_GBuffer->Bind();
m_GBuffer->Clear();
{