From 72440a362d276997565fff84b72c5e84243f71e2 Mon Sep 17 00:00:00 2001 From: antopilo Date: Fri, 10 Jan 2025 23:36:25 -0500 Subject: [PATCH] Fixed camera view array --- Nuake/src/Rendering/Vulkan/VkResources.h | 7 ++- .../src/Rendering/Vulkan/VulkanResources.cpp | 9 +++- .../Rendering/Vulkan/VulkanSceneRenderer.cpp | 50 +++++++++++++++++-- Nuake/src/Scene/Components/LightComponent.cpp | 6 +++ Nuake/src/Scene/Components/LightComponent.h | 17 ++++++- Nuake/src/Window.cpp | 6 ++- Resources/Shaders/Vulkan/shading.frag | 1 + Resources/Shaders/Vulkan/shading.vert | 1 + Resources/Shaders/Vulkan/shadow.vert | 2 +- Resources/Shaders/Vulkan/triangle.vert | 2 +- 10 files changed, 91 insertions(+), 10 deletions(-) diff --git a/Nuake/src/Rendering/Vulkan/VkResources.h b/Nuake/src/Rendering/Vulkan/VkResources.h index 4c0da547..7bbead47 100644 --- a/Nuake/src/Rendering/Vulkan/VkResources.h +++ b/Nuake/src/Rendering/Vulkan/VkResources.h @@ -28,9 +28,13 @@ namespace Nuake Vector3 Position; float Near; float Far; + float pad; + float pad2; + float pad3; + //char padding[64]; // 124 bytes to reach 128 bytes }; - struct LightResource + struct LightResources { }; @@ -45,6 +49,7 @@ namespace Nuake std::map> Light; std::vector Cameras; + std::array CamerasData; // Bindless buffer layouts VkDescriptorSetLayout CameraDescriptorLayout; VkDescriptorSetLayout TriangleBufferDescriptorLayout; diff --git a/Nuake/src/Rendering/Vulkan/VulkanResources.cpp b/Nuake/src/Rendering/Vulkan/VulkanResources.cpp index 0a56c73a..3e5bc11c 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanResources.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanResources.cpp @@ -212,7 +212,7 @@ void GPUResources::CreateBindlessLayout() // bindless cameras { DescriptorLayoutBuilder builder; - builder.AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_CAMERAS); + builder.AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER); CamerasDescriptorLayout = builder.Build(device, VK_SHADER_STAGE_ALL_GRAPHICS); } @@ -259,6 +259,13 @@ void GPUResources::RecreateBindlessCameras() CreateBindlessLayout(); } + int i = 0; + for (auto& c : Cameras) + { + CamerasData[i] = c; + i++; + } + void* mappedData; auto allocator = VulkanAllocator::Get().GetAllocator(); vmaMapMemory(allocator, (VkRenderer::Get().GetCurrentFrame().CamerasStagingBuffer->GetAllocation()), &mappedData); diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 34d614fb..faa7c14f 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -96,6 +96,7 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) camData.Near = camera->Near; camData.Far = camera->Far; GPUResources::Get().AddCamera(camera->ID, camData); + GPUResources::Get().AddCamera(camera->ID + 1, camData); auto view = scene->m_Registry.view(); for (auto e : view) @@ -112,12 +113,36 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) GPUResources::Get().AddCamera(camera.ID, camData); } } + + // Build light view list { auto view = scene->m_Registry.view(); for (auto e : view) { auto [transform, light] = view.get(e); - //light.CalculateViewProjection(); + + for (int i = 0; i < light.m_LightViews.size(); i++) + { + LightView& view = light.m_LightViews[i]; + CameraView viewData{}; + viewData.View = view.View; + viewData.Projection = view.Proj; + viewData.InverseView = glm::inverse(view.View); + viewData.InverseProjection = glm::inverse(view.Proj); + viewData.Position = transform.GetGlobalTransform()[3]; + viewData.Near = 25.0; + viewData.Far = -25.0; + GPUResources::Get().AddCamera(view.CameraID, viewData); + } + } + } + { + auto view = scene->m_Registry.view(); + for (auto e : view) + { + auto [transform, light] = view.get(e); + auto cam = GPUResources::Get().GetCamera(inContext.CameraID); + light.CalculateViewProjection(cam.View, cam.Projection); } } @@ -128,9 +153,28 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) passCtx.scene = inContext.CurrentScene; passCtx.commandBuffer = inContext.CommandBuffer; passCtx.resolution = Context.Size; - passCtx.cameraID = GPUResources::Get().GetBindlessCameraID(Context.CameraID); - //ShadowPipeline.Execute(passCtx); + auto view = scene->m_Registry.view(); + for (auto e : view) + { + auto [transform, light] = view.get(e); + + if (light.Type != LightType::Directional) + { + continue; + } + + passCtx.cameraID = GPUResources::Get().GetBindlessCameraID(light.m_LightViews[0].CameraID); + ShadowPipeline.Execute(passCtx); + + for (int i = 0; i < CSM_AMOUNT; i++) + { + + } + } + + + passCtx.cameraID = GPUResources::Get().GetBindlessCameraID(Context.CameraID); GBufferPipeline.Execute(passCtx); } ModelPushConstant modelPushConstant{}; diff --git a/Nuake/src/Scene/Components/LightComponent.cpp b/Nuake/src/Scene/Components/LightComponent.cpp index 3b3eaf44..0b35b34a 100644 --- a/Nuake/src/Scene/Components/LightComponent.cpp +++ b/Nuake/src/Scene/Components/LightComponent.cpp @@ -13,7 +13,13 @@ namespace Nuake Color(1, 1, 1), Strength(10.0f), Direction(0, 1, 0) + { + m_LightViews = std::vector(CSM_AMOUNT); + for (int i = 0; i < CSM_AMOUNT; i++) + { + m_LightViews[i] = LightView{}; + } } void LightComponent::SetCastShadows(bool toggle) diff --git a/Nuake/src/Scene/Components/LightComponent.h b/Nuake/src/Scene/Components/LightComponent.h index b0852802..8bb8754a 100644 --- a/Nuake/src/Scene/Components/LightComponent.h +++ b/Nuake/src/Scene/Components/LightComponent.h @@ -18,6 +18,14 @@ namespace Nuake Directional, Point, Spot }; + struct LightView + { + UUID CameraID; + + Matrix4 View; + Matrix4 Proj; + }; + const int CSM_AMOUNT = 4; class LightComponent : public Component { @@ -38,6 +46,7 @@ namespace Nuake Ref m_Framebuffers[CSM_AMOUNT]; Matrix4 mViewProjections[CSM_AMOUNT]; + std::vector m_LightViews; float mCascadeSplitDepth[CSM_AMOUNT]; float mCascadeSplits[CSM_AMOUNT]; @@ -52,7 +61,9 @@ namespace Nuake void CalculateViewProjection(glm::mat4& view, const glm::mat4& projection) { - glm::mat4 viewProjection = projection * view; + Matrix4 normalProj = projection; + normalProj *= -1.0f; + glm::mat4 viewProjection = normalProj * view; glm::mat4 inverseViewProjection = glm::inverse(viewProjection); // TODO: Automate this @@ -147,6 +158,10 @@ namespace Nuake roundOffset.w = 0.0f; lightProjectionMatrix[3] += roundOffset; + m_LightViews[cascade].View = view; + m_LightViews[cascade].Proj = projection; + //m_LightViews[cascade].Proj[1][1] *= -1.0f; + // Store SplitDistance and ViewProjection-Matrix mCascadeSplitDepth[cascade] = (nearClip + splitDist * clipRange) * 1.0f; mViewProjections[cascade] = shadowMatrix; diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index 80aef8ac..ab7ad934 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -234,6 +234,7 @@ void Window::EndDraw() } auto& vkRenderer = VkRenderer::Get(); + GPUResources::Get().RecreateBindlessTextures(); if(vkRenderer.Draw()) { // Render whatever we want in here :) @@ -242,10 +243,11 @@ void Window::EndDraw() RenderContext ctx { scene, - vkRenderer.GetCurrentCmdBuffer() + vkRenderer.GetCurrentCmdBuffer(), + Vector2{}, + scene->GetCurrentCamera()->ID }; - GPUResources::Get().RecreateBindlessTextures(); vkRenderer.DrawScene(ctx); } } diff --git a/Resources/Shaders/Vulkan/shading.frag b/Resources/Shaders/Vulkan/shading.frag index 1b93e319..74a3904b 100644 --- a/Resources/Shaders/Vulkan/shading.frag +++ b/Resources/Shaders/Vulkan/shading.frag @@ -46,6 +46,7 @@ struct Light [[vk::binding(0, 6)]] StructuredBuffer lights; + struct CameraView { float4x4 View; float4x4 Projection; diff --git a/Resources/Shaders/Vulkan/shading.vert b/Resources/Shaders/Vulkan/shading.vert index eb97e311..5149ae3e 100644 --- a/Resources/Shaders/Vulkan/shading.vert +++ b/Resources/Shaders/Vulkan/shading.vert @@ -45,6 +45,7 @@ struct Light [[vk::binding(0, 6)]] StructuredBuffer lights; + struct CameraView { float4x4 View; float4x4 Projection; diff --git a/Resources/Shaders/Vulkan/shadow.vert b/Resources/Shaders/Vulkan/shadow.vert index 5cbbe0ce..8c0c8cc9 100644 --- a/Resources/Shaders/Vulkan/shadow.vert +++ b/Resources/Shaders/Vulkan/shadow.vert @@ -87,7 +87,7 @@ VSOutput main(uint vertexIndex : SV_VertexID) Vertex v = vertexBuffer[vertexIndex]; // Output the position of each vertex - output.Position = mul(camView.Projection, mul(camView.View, mul(modelData.model, float4(v.position, 1.0f)))); + output.Position = mul(camView.Projection, mul(camView.View,mul(modelData.model, float4(v.position, 1.0f)))); return output; } \ No newline at end of file diff --git a/Resources/Shaders/Vulkan/triangle.vert b/Resources/Shaders/Vulkan/triangle.vert index 2ffb8185..4f362e3b 100644 --- a/Resources/Shaders/Vulkan/triangle.vert +++ b/Resources/Shaders/Vulkan/triangle.vert @@ -83,7 +83,7 @@ VSOutput main(uint vertexIndex : SV_VertexID) VSOutput output; Camera camData = camera[0]; - CameraView camView = cameras[pushConstants.cameraID]; + CameraView camView = cameras[1]; ModelData modelData = model[pushConstants.modelIndex]; // Load vertex data from the buffer