From e203ac5bd88d4f96ac0fdbbb71c42daa5c7fc77e Mon Sep 17 00:00:00 2001 From: antopilo Date: Sun, 12 Jan 2025 00:02:56 -0500 Subject: [PATCH] Started working towards supporting all the splits --- .../Rendering/Vulkan/VulkanSceneRenderer.cpp | 19 +++-- .../Rendering/Vulkan/VulkanSceneRenderer.h | 6 +- Nuake/src/Scene/Components/LightComponent.cpp | 1 + Nuake/src/Scene/Components/LightComponent.h | 4 +- Resources/Shaders/Vulkan/shading.frag | 80 +++++++++++++++++-- Resources/Shaders/Vulkan/shading.vert | 5 +- Resources/Shaders/Vulkan/shadow.frag | 4 +- Resources/Shaders/Vulkan/shadow.vert | 4 +- Resources/Shaders/Vulkan/triangle.frag | 4 +- Resources/Shaders/Vulkan/triangle.vert | 4 +- 10 files changed, 106 insertions(+), 25 deletions(-) diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 38f9478a..dd1f37ce 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -123,7 +123,7 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) { auto [transform, light] = view.get(e); - for (int i = 0; i < light.m_LightViews.size(); i++) + for (int i = 0; i < CSM_AMOUNT; i++) { LightView& view = light.m_LightViews[i]; CameraView viewData{}; @@ -132,8 +132,8 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) 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; + viewData.Near = 0; + viewData.Far = 0; GPUResources::Get().AddCamera(view.CameraID, viewData); } } @@ -850,8 +850,11 @@ void VkSceneRenderer::BuildMatrixBuffer() light.type = lightComp.Type; light.color = Vector4(lightComp.Color * lightComp.Strength, 1.0); light.castShadow = lightComp.CastShadows; - light.transformId = GPUResources::Get().GetBindlessCameraID(lightComp.m_LightViews[0].CameraID); - light.shadowMapTextureId = GPUResources::Get().GetBindlessTextureID(lightComp.LightMapID); + for (int i = 0; i < CSM_AMOUNT; i++) + { + light.transformId[i] = GPUResources::Get().GetBindlessCameraID(lightComp.m_LightViews[i].CameraID); + light.shadowMapTextureId[i] = GPUResources::Get().GetBindlessTextureID(lightComp.LightMapID); + } allLights[currentIndex] = light; @@ -862,6 +865,12 @@ void VkSceneRenderer::BuildMatrixBuffer() MaterialDataContainer = MaterialData{ allMaterials }; LightDataContainerArray = LightDataContainer{ allLights }; shadingPushConstant.LightCount = currentIndex; + + // Copy CSM split depths + for (int i = 0; i < CSM_AMOUNT; i++) + { + shadingPushConstant.CascadeSplits[i] = LightComponent::mCascadeSplitDepth[i]; + } } void VkSceneRenderer::UpdateTransformBuffer() diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h index 1cb4f850..19ef85fc 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h @@ -34,6 +34,7 @@ namespace Nuake int MaterialTextureID; int LightCount; int CameraID; + float CascadeSplits[4]; }; struct ModelData @@ -75,8 +76,9 @@ namespace Nuake float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; + float pad[2]; }; struct LightDataContainer diff --git a/Nuake/src/Scene/Components/LightComponent.cpp b/Nuake/src/Scene/Components/LightComponent.cpp index 0b35b34a..398f6bb2 100644 --- a/Nuake/src/Scene/Components/LightComponent.cpp +++ b/Nuake/src/Scene/Components/LightComponent.cpp @@ -9,6 +9,7 @@ namespace Nuake { + float LightComponent::mCascadeSplitDepth[CSM_AMOUNT]; LightComponent::LightComponent() : Color(1, 1, 1), Strength(10.0f), diff --git a/Nuake/src/Scene/Components/LightComponent.h b/Nuake/src/Scene/Components/LightComponent.h index 3c3b4c73..8ba0defb 100644 --- a/Nuake/src/Scene/Components/LightComponent.h +++ b/Nuake/src/Scene/Components/LightComponent.h @@ -47,7 +47,7 @@ namespace Nuake Ref m_Framebuffers[CSM_AMOUNT]; Matrix4 mViewProjections[CSM_AMOUNT]; std::vector m_LightViews; - float mCascadeSplitDepth[CSM_AMOUNT]; + static float mCascadeSplitDepth[CSM_AMOUNT]; float mCascadeSplits[CSM_AMOUNT]; public: @@ -223,7 +223,7 @@ namespace Nuake bool Deserialize(const json& j) { if (j.contains("Type")) - Type = (LightType)j["Type"]; + Type = static_cast(j["Type"]); if (j.contains("IsVolumetric")) IsVolumetric = j["IsVolumetric"]; if (j.contains("Color")) diff --git a/Resources/Shaders/Vulkan/shading.frag b/Resources/Shaders/Vulkan/shading.frag index 427ef4ff..9630cf28 100644 --- a/Resources/Shaders/Vulkan/shading.frag +++ b/Resources/Shaders/Vulkan/shading.frag @@ -39,14 +39,13 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]] StructuredBuffer lights; - struct CameraView { float4x4 View; float4x4 Projection; @@ -77,11 +76,80 @@ struct ShadingPushConstant int MaterialInputTextureId; int LightCount; int CameraID; + float cascadeDepth[4]; }; [[vk::push_constant]] ShadingPushConstant pushConstants; +static const float2 poissonDisk64[64] = +{ + float2 ( 0.1187053, 0.7951565), + float2 ( 0.1173675, 0.6087878), + float2 (-0.09958518, 0.7248842), + float2 ( 0.4259812, 0.6152718), + float2 ( 0.3723574, 0.8892787), + float2 (-0.02289676, 0.9972908), + float2 (-0.08234791, 0.5048386), + float2 ( 0.1821235, 0.9673787), + float2 (-0.2137264, 0.9011746), + float2 ( 0.3115066, 0.4205415), + float2 ( 0.1216329, 0.383266), + float2 ( 0.5948939, 0.7594361), + float2 ( 0.7576465, 0.5336417), + float2 (-0.521125, 0.7599803), + float2 (-0.2923127, 0.6545699), + float2 ( 0.6782473, 0.22385), + float2 (-0.3077152, 0.4697627), + float2 ( 0.4484913, 0.2619455), + float2 (-0.5308799, 0.4998215), + float2 (-0.7379634, 0.5304936), + float2 ( 0.02613133, 0.1764302), + float2 (-0.1461073, 0.3047384), + float2 (-0.8451027, 0.3249073), + float2 (-0.4507707, 0.2101997), + float2 (-0.6137282, 0.3283674), + float2 (-0.2385868, 0.08716244), + float2 ( 0.3386548, 0.01528411), + float2 (-0.04230833, -0.1494652), + float2 ( 0.167115, -0.1098648), + float2 (-0.525606, 0.01572019), + float2 (-0.7966855, 0.1318727), + float2 ( 0.5704287, 0.4778273), + float2 (-0.9516637, 0.002725032), + float2 (-0.7068223, -0.1572321), + float2 ( 0.2173306, -0.3494083), + float2 ( 0.06100426, -0.4492816), + float2 ( 0.2333982, 0.2247189), + float2 ( 0.07270987, -0.6396734), + float2 ( 0.4670808, -0.2324669), + float2 ( 0.3729528, -0.512625), + float2 ( 0.5675077, -0.4054544), + float2 (-0.3691984, -0.128435), + float2 ( 0.8752473, 0.2256988), + float2 (-0.2680127, -0.4684393), + float2 (-0.1177551, -0.7205751), + float2 (-0.1270121, -0.3105424), + float2 ( 0.5595394, -0.06309237), + float2 (-0.9299136, -0.1870008), + float2 ( 0.974674, 0.03677348), + float2 ( 0.7726735, -0.06944724), + float2 (-0.4995361, -0.3663749), + float2 ( 0.6474168, -0.2315787), + float2 ( 0.1911449, -0.8858921), + float2 ( 0.3671001, -0.7970535), + float2 (-0.6970353, -0.4449432), + float2 (-0.417599, -0.7189326), + float2 (-0.5584748, -0.6026504), + float2 (-0.02624448, -0.9141423), + float2 ( 0.565636, -0.6585149), + float2 (-0.874976, -0.3997879), + float2 ( 0.9177843, -0.2110524), + float2 ( 0.8156927, -0.3969557), + float2 (-0.2833054, -0.8395444), + float2 ( 0.799141, -0.5886372) +}; + float3 WorldPosFromDepth(float depth, float2 uv, float4x4 invProj, float4x4 invView) { float z = depth; @@ -159,8 +227,8 @@ float ShadowCalculation(Light light, float3 fragPos, float3 normal) CameraView camView = cameras[pushConstants.CameraID]; float depth = length(fragPos - camView.Position); - CameraView lightView = cameras[light.transformId]; - int shadowMap = light.shadowMapTextureId; + CameraView lightView = cameras[light.transformId[0]]; + int shadowMap = light.shadowMapTextureId[0]; float4 fragLightSpace = mul(lightView.Projection, mul(lightView.View, float4(fragPos, 1.0))); float3 projCoords = fragLightSpace.xyz / fragLightSpace.w; projCoords.xy = projCoords.xy * 0.5 + 0.5; @@ -172,7 +240,7 @@ float ShadowCalculation(Light light, float3 fragPos, float3 normal) //projCoords.y = 1.0 - projCoords.y; float currentDepth = projCoords.z; float bias = max(0.005 * (1.0 - dot(normal, light.direction)), 0.0005); - float shadowMapDepth = textures[light.shadowMapTextureId].Sample(mySampler, projCoords.xy).r; + float shadowMapDepth = textures[light.shadowMapTextureId[0]].Sample(mySampler, projCoords.xy).r; return (currentDepth > shadowMapDepth);//> 0.0 ? 1.0 : 0.0; } diff --git a/Resources/Shaders/Vulkan/shading.vert b/Resources/Shaders/Vulkan/shading.vert index 5149ae3e..e62485b0 100644 --- a/Resources/Shaders/Vulkan/shading.vert +++ b/Resources/Shaders/Vulkan/shading.vert @@ -38,8 +38,8 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]] @@ -67,6 +67,7 @@ struct ShadingPushConstant int MaterialInputTextureId; int LightCount; int CameraID; + float cascadeDepth[4]; }; [[vk::push_constant]] diff --git a/Resources/Shaders/Vulkan/shadow.frag b/Resources/Shaders/Vulkan/shadow.frag index 78598654..63378314 100644 --- a/Resources/Shaders/Vulkan/shadow.frag +++ b/Resources/Shaders/Vulkan/shadow.frag @@ -45,8 +45,8 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]] diff --git a/Resources/Shaders/Vulkan/shadow.vert b/Resources/Shaders/Vulkan/shadow.vert index 8acae92c..f0f9409b 100644 --- a/Resources/Shaders/Vulkan/shadow.vert +++ b/Resources/Shaders/Vulkan/shadow.vert @@ -45,8 +45,8 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]] diff --git a/Resources/Shaders/Vulkan/triangle.frag b/Resources/Shaders/Vulkan/triangle.frag index 144b966c..06c53388 100644 --- a/Resources/Shaders/Vulkan/triangle.frag +++ b/Resources/Shaders/Vulkan/triangle.frag @@ -45,8 +45,8 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]] diff --git a/Resources/Shaders/Vulkan/triangle.vert b/Resources/Shaders/Vulkan/triangle.vert index 4f362e3b..760f9b37 100644 --- a/Resources/Shaders/Vulkan/triangle.vert +++ b/Resources/Shaders/Vulkan/triangle.vert @@ -45,8 +45,8 @@ struct Light float outerConeAngle; float innerConeAngle; bool castShadow; - int shadowMapTextureId; - int transformId; + int shadowMapTextureId[4]; + int transformId[4]; }; [[vk::binding(0, 6)]]