diff --git a/res/shaders/BasePass.slang b/res/shaders/BasePass.slang index 2162b54..98bd7ce 100644 --- a/res/shaders/BasePass.slang +++ b/res/shaders/BasePass.slang @@ -5,11 +5,9 @@ import MaterialParameter; struct LightCullingData { - RWStructuredBuffer oLightIndexList; - RWStructuredBuffer tLightIndexList; + RWStructuredBuffer lightIndexList; - RWTexture2D oLightGrid; - RWTexture2D tLightGrid; + RWTexture2D lightGrid; }; layout(set=5) ParameterBlock pLightCullingData; @@ -21,8 +19,8 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target MaterialParameter materialParams = params.getMaterialParameter(); let brdf = pMaterial.prepare(materialParams); uint2 tileIndex = uint2(floor(params.position_CS.xy / BLOCK_SIZE)); - uint startOffset = pLightCullingData.oLightGrid[tileIndex].x; - uint lightCount = pLightCullingData.oLightGrid[tileIndex].y; + uint startOffset = pLightCullingData.lightGrid[tileIndex].x; + uint lightCount = pLightCullingData.lightGrid[tileIndex].y; float3 result = float3(0, 0, 0); for(int i = 0; i < pLightEnv.numDirectionalLights; ++i) { @@ -30,7 +28,7 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target } for(uint i = 0; i < lightCount; ++i) { - uint lightIndex = pLightCullingData.oLightIndexList[startOffset + lightCount]; + uint lightIndex = pLightCullingData.lightIndexList[startOffset + i]; result += pLightEnv.pointLights[lightIndex].illuminate(lightingParams, brdf); } return float4(result, 1.0f); diff --git a/res/shaders/ComputeFrustums.slang b/res/shaders/ComputeFrustums.slang index 1c9c27f..2832cab 100644 --- a/res/shaders/ComputeFrustums.slang +++ b/res/shaders/ComputeFrustums.slang @@ -13,23 +13,18 @@ struct ComputeShaderInput [shader("compute")] void computeFrustums(ComputeShaderInput in) { - const float3 topLeft = float3(-1, -1, -1); - const float3 topRight = float3(1, -1, -1); - const float3 bottomLeft = float3(-1, 1, -1); - const float3 origin = float3(0, 0, 0); - float3 xStep = (topRight - topLeft) / pDispatchParams.numThreads.x; - float3 yStep = (bottomLeft - topLeft) / pDispatchParams.numThreads.y; + float3 origin = float3(0, 0, 0); float3 corners[4] = { - topLeft + (in.dispatchThreadID.x + 0) * xStep + (in.dispatchThreadID.y + 0) * yStep, - topLeft + (in.dispatchThreadID.x + 1) * xStep + (in.dispatchThreadID.y + 0) * yStep, - topLeft + (in.dispatchThreadID.x + 0) * xStep + (in.dispatchThreadID.y + 1) * yStep, - topLeft + (in.dispatchThreadID.x + 1) * xStep + (in.dispatchThreadID.y + 1) * yStep + screenToClip(float3(float2(in.dispatchThreadID.x + 0, in.dispatchThreadID.y + 0) * BLOCK_SIZE, -1.0f)), + screenToClip(float3(float2(in.dispatchThreadID.x + 1, in.dispatchThreadID.y + 0) * BLOCK_SIZE, -1.0f)), + screenToClip(float3(float2(in.dispatchThreadID.x + 0, in.dispatchThreadID.y + 1) * BLOCK_SIZE, -1.0f)), + screenToClip(float3(float2(in.dispatchThreadID.x + 1, in.dispatchThreadID.y + 1) * BLOCK_SIZE, -1.0f)) }; Frustum frustum; - frustum.sides[0] = computePlane(origin, corners[0], corners[2]); - frustum.sides[1] = computePlane(origin, corners[3], corners[1]); - frustum.sides[2] = computePlane(origin, corners[1], corners[0]); - frustum.sides[3] = computePlane(origin, corners[2], corners[3]); + frustum.sides[0] = computePlane(origin, corners[2], corners[1]); + frustum.sides[1] = computePlane(origin, corners[1], corners[3]); + frustum.sides[2] = computePlane(origin, corners[0], corners[1]); + frustum.sides[3] = computePlane(origin, corners[3], corners[2]); if(in.dispatchThreadID.x < pDispatchParams.numThreads.x && in.dispatchThreadID.y < pDispatchParams.numThreads.y) { uint index = in.dispatchThreadID.x + (in.dispatchThreadID.y * pDispatchParams.numThreads.x); diff --git a/res/shaders/LightCulling.slang b/res/shaders/LightCulling.slang index dd44356..825fcc9 100644 --- a/res/shaders/LightCulling.slang +++ b/res/shaders/LightCulling.slang @@ -99,7 +99,6 @@ void cullLights(ComputeShaderInput in) { PointLight light = pLightEnv.pointLights[i]; float3 lightClip = light.getClipPosition(); - //TODO: why doesn't this check go through? if(light.insideFrustum(groupFrustum, lightClip, nearClip, maxDepth)) { tAppendLight(i); diff --git a/res/shaders/lib/Common.slang b/res/shaders/lib/Common.slang index 71f1bd6..c03e43e 100644 --- a/res/shaders/lib/Common.slang +++ b/res/shaders/lib/Common.slang @@ -12,15 +12,12 @@ struct ViewParameter layout(set = 0) ParameterBlock pViewParams; - -// Convert screen space coordinates to view space. -float4 screenToClip( float4 screen ) +float3 screenToClip(float3 screen) { - // Convert to normalized texture coordinates float2 texCoord = screen.xy / pViewParams.screenDimensions; // Convert to clip space - return float4( float2( texCoord.x, 1.0f-texCoord.y ) * 2.0f - 1.0f, screen.z, screen.w ); + return float3( float2( texCoord.x, 1.0f-texCoord.y ) * 2.0f - 1.0f, screen.z); } struct Plane diff --git a/res/shaders/lib/LightEnv.slang b/res/shaders/lib/LightEnv.slang index 23cb76d..c5891e4 100644 --- a/res/shaders/lib/LightEnv.slang +++ b/res/shaders/lib/LightEnv.slang @@ -30,7 +30,7 @@ struct PointLight : ILightEnv float3 lightDir_TS = mul(params.tbn, lightDir_WS); float d = length(lightDir_TS); float illuminance = max(1 - d / colorRange.w, 0); - return illuminance * brdf.evaluate(params.tbn, params.viewDir_TS, normalize(lightDir_TS), colorRange.xyz); + return illuminance * brdf.evaluate(params.tbn, params.viewDir_TS, -normalize(lightDir_TS), colorRange.xyz); } float3 getClipPosition() { diff --git a/src/Engine/Graphics/Initializer.h b/src/Engine/Graphics/Initializer.h index 202eeda..d016b8b 100644 --- a/src/Engine/Graphics/Initializer.h +++ b/src/Engine/Graphics/Initializer.h @@ -24,7 +24,7 @@ struct GraphicsInitializer : applicationName("SeeleEngine") , engineName("SeeleEngine") , windowLayoutFile(nullptr) - , layers{} + , layers{"VK_LAYER_LUNARG_monitor"} , instanceExtensions{} , deviceExtensions{"VK_KHR_swapchain"} , windowHandle(nullptr) diff --git a/src/Engine/Graphics/RenderPass/BasePass.cpp b/src/Engine/Graphics/RenderPass/BasePass.cpp index d84f328..4a4be17 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.cpp +++ b/src/Engine/Graphics/RenderPass/BasePass.cpp @@ -21,23 +21,6 @@ BasePass::BasePass(Gfx::PGraphics graphics, PScene scene) : RenderPass(graphics, scene) , descriptorSets(6) { - basePassLayout = graphics->createPipelineLayout(); - - basePassLayout->addDescriptorLayout(INDEX_VIEW_PARAMS, viewParamsLayout); - basePassLayout->addDescriptorLayout(INDEX_LIGHT_ENV, scene->getLightEnvironment()->getDescriptorLayout()); - - lightCullingLayout = graphics->createDescriptorLayout("BasePassLightCulling"); - // oLightIndexList - lightCullingLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER); - // tLightIndexList - lightCullingLayout->addDescriptorBinding(1, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER); - // oLightGrid - lightCullingLayout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_IMAGE); - // tLightGrid - lightCullingLayout->addDescriptorBinding(3, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_IMAGE); - lightCullingLayout->create(); - - basePassLayout->addDescriptorLayout(INDEX_LIGHT_CULLING, lightCullingLayout); if (graphics->supportMeshShading()) { graphics->getShaderCompiler()->registerRenderPass("BasePass", "MeshletBasePass", true, true, "BasePass", true, true, "MeshletBasePass"); @@ -57,6 +40,8 @@ void BasePass::beginFrame(const Component::Camera& cam) RenderPass::beginFrame(cam); lightCullingLayout->reset(); + opaqueCulling = lightCullingLayout->allocateDescriptorSet(); + transparentCulling = lightCullingLayout->allocateDescriptorSet(); } void BasePass::render() @@ -79,13 +64,14 @@ void BasePass::render() descriptorSets[INDEX_VIEW_PARAMS] = viewParamsSet; descriptorSets[INDEX_LIGHT_ENV] = scene->getLightEnvironment()->getDescriptorSet(); - descriptorSets[INDEX_LIGHT_CULLING] = lightCullingLayout->allocateDescriptorSet(); - descriptorSets[INDEX_LIGHT_CULLING]->updateBuffer(0, oLightIndexList); - descriptorSets[INDEX_LIGHT_CULLING]->updateBuffer(1, tLightIndexList); - descriptorSets[INDEX_LIGHT_CULLING]->updateTexture(2, oLightGrid); - descriptorSets[INDEX_LIGHT_CULLING]->updateTexture(3, tLightGrid); - descriptorSets[INDEX_LIGHT_CULLING]->writeChanges(); + opaqueCulling->updateBuffer(0, oLightIndexList); + opaqueCulling->updateTexture(1, oLightGrid); + transparentCulling->updateBuffer(0, tLightIndexList); + transparentCulling->updateTexture(1, tLightGrid); + opaqueCulling->writeChanges(); + transparentCulling->writeChanges(); + descriptorSets[INDEX_LIGHT_CULLING] = opaqueCulling; Gfx::ShaderPermutation permutation; if (graphics->supportMeshShading()) @@ -154,7 +140,6 @@ void BasePass::render() Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo)); command->bindPipeline(pipeline); } - descriptorSets[INDEX_VERTEX_DATA] = vertexData->getVertexDataSet(); for (const auto& [_, instance] : materialData.instances) { @@ -193,6 +178,19 @@ void BasePass::endFrame() void BasePass::publishOutputs() { + basePassLayout = graphics->createPipelineLayout(); + + basePassLayout->addDescriptorLayout(INDEX_VIEW_PARAMS, viewParamsLayout); + basePassLayout->addDescriptorLayout(INDEX_LIGHT_ENV, scene->getLightEnvironment()->getDescriptorLayout()); + + lightCullingLayout = graphics->createDescriptorLayout("BasePassLightCulling"); + // oLightIndexList + lightCullingLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER); + // oLightGrid + lightCullingLayout->addDescriptorBinding(1, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_IMAGE); + lightCullingLayout->create(); + + basePassLayout->addDescriptorLayout(INDEX_LIGHT_CULLING, lightCullingLayout); colorAttachment = Gfx::RenderTargetAttachment(viewport, Gfx::SE_IMAGE_LAYOUT_UNDEFINED, Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE); diff --git a/src/Engine/Graphics/RenderPass/BasePass.h b/src/Engine/Graphics/RenderPass/BasePass.h index fa005cf..7ed0528 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.h +++ b/src/Engine/Graphics/RenderPass/BasePass.h @@ -26,6 +26,8 @@ private: Gfx::PTexture2D oLightGrid; Gfx::PTexture2D tLightGrid; + Gfx::PDescriptorSet opaqueCulling; + Gfx::PDescriptorSet transparentCulling; Array descriptorSets; PCameraActor source; Gfx::OPipelineLayout basePassLayout; diff --git a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp index e3b0f10..b535e3e 100644 --- a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp +++ b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp @@ -156,7 +156,7 @@ void LightCullingPass::publishOutputs() .size = (uint32)sizeof(uint32) * dispatchParams.numThreadGroups.x * dispatchParams.numThreadGroups.y - * dispatchParams.numThreadGroups.z * 200, + * dispatchParams.numThreadGroups.z * 1024 * 16, .data = nullptr, .owner = Gfx::QueueType::COMPUTE },