From d7aefc07f3acd01727eaaf04306f8faec31a1a26 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Sat, 31 Aug 2024 13:29:33 +0200 Subject: [PATCH] Hopefully fixed culling now --- combined.png | Bin 52183 -> 0 bytes res/shaders/DrawListTask.slang | 2 - res/shaders/lib/Bounding.slang | 2 +- src/Editor/main.cpp | 8 +-- .../Graphics/RenderPass/DepthCullingPass.cpp | 60 +++++------------- .../Graphics/RenderPass/DepthCullingPass.h | 15 +---- .../Graphics/RenderPass/WaterRenderer.cpp | 2 +- 7 files changed, 24 insertions(+), 65 deletions(-) delete mode 100644 combined.png diff --git a/combined.png b/combined.png deleted file mode 100644 index d2cf4318c24cfe89f7c03c1d8ecb4591f4ff535e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52183 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

u 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 YTTHx0pV)k4M8K~{50vj0%j*08AE25;zW@LL diff --git a/res/shaders/DrawListTask.slang b/res/shaders/DrawListTask.slang index a9ea9a9..f3b10d6 100644 --- a/res/shaders/DrawListTask.slang +++ b/res/shaders/DrawListTask.slang @@ -26,9 +26,7 @@ void taskMain( uint cull = p.cullingOffset + i; MeshletDescription meshlet = pScene.meshletInfos[m]; MeshletCullingInfo culling = pScene.cullingInfos[cull]; -#ifdef DEPTH_CULLING if(culling.wasVisible()) -#endif { uint index; InterlockedAdd(head, 1, index); diff --git a/res/shaders/lib/Bounding.slang b/res/shaders/lib/Bounding.slang index b849cc3..2567001 100644 --- a/res/shaders/lib/Bounding.slang +++ b/res/shaders/lib/Bounding.slang @@ -70,7 +70,7 @@ struct AABB int2 screenCoords = int2(clamp(int(screenCorner.x), 0, int(pViewParams.screenDimensions.x)), clamp(int(screenCorner.y), 0, int(pViewParams.screenDimensions.y))); screenCornerMin = int2(min(screenCornerMin.x, screenCoords.x), min(screenCornerMin.y, screenCoords.y)); screenCornerMax = int2(max(screenCornerMax.x, screenCoords.x), max(screenCornerMax.y, screenCoords.y)); - maxDepth = max(maxDepth, screenCorner.z); + maxDepth = max(maxDepth, 1/screenCorner.z); } return maxDepth; } diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index 2c88337..d22754b 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -72,10 +72,10 @@ int main() { .filePath = sourcePath / "import/models/after-the-rain-vr-sound/source/Whitechapel.glb", .importPath = "Whitechapel", }); - // AssetImporter::importMesh(MeshImportArgs{ - // .filePath = sourcePath / "import/models/city-suburbs/source/city-suburbs.obj", - // .importPath = "suburbs", - // }); + //AssetImporter::importMesh(MeshImportArgs{ + // .filePath = sourcePath / "import/models/city-suburbs/source/city-suburbs.obj", + // .importPath = "suburbs", + //}); getThreadPool().waitIdle(); vd->commitMeshes(); WindowCreateInfo mainWindowInfo = { diff --git a/src/Engine/Graphics/RenderPass/DepthCullingPass.cpp b/src/Engine/Graphics/RenderPass/DepthCullingPass.cpp index fabaf19..7aaffff 100644 --- a/src/Engine/Graphics/RenderPass/DepthCullingPass.cpp +++ b/src/Engine/Graphics/RenderPass/DepthCullingPass.cpp @@ -87,47 +87,41 @@ void DepthCullingPass::render() { Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT); - //uint32 reset = 0; - //debugHead->updateContents(0, sizeof(uint32), &reset); - + depthMipBuffer->rotateBuffer(depthMipBuffer->getNumElements() * sizeof(uint32)); Gfx::PDescriptorSet set = depthAttachmentLayout->allocateDescriptorSet(); - //set->updateBuffer(0, debugUniform); set->updateTexture(0, Gfx::PTexture2D(depthAttachment.getTexture())); set->updateBuffer(1, depthMipBuffer); - //set->updateBuffer(3, debugHead); - //set->updateBuffer(4, debugData); set->writeChanges(); timestamps->begin(); timestamps->write(Gfx::SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "MipBegin"); - Gfx::OComputeCommand computeCommand = graphics->createComputeCommand("DepthMipGenCommand"); + Gfx::OComputeCommand computeCommand = graphics->createComputeCommand("InitialReduce"); computeCommand->bindPipeline(depthInitialReduce); computeCommand->bindDescriptor({viewParamsSet, set}); UVector2 reduceDimensions = UVector2(viewport->getOwner()->getFramebufferWidth() + BLOCK_SIZE - 1, viewport->getOwner()->getFramebufferHeight() + BLOCK_SIZE - 1) / uint32(BLOCK_SIZE); computeCommand->dispatch(reduceDimensions.x, reduceDimensions.y, 1); - - computeCommand->bindPipeline(depthMipGen); - computeCommand->bindDescriptor({viewParamsSet, set}); + graphics->executeCommands(std::move(computeCommand)); for (uint32 i = 0; i < mipOffsets.size() - 1; ++i) { depthMipBuffer->pipelineBarrier(Gfx::SE_ACCESS_SHADER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT, Gfx::SE_ACCESS_SHADER_READ_BIT | Gfx::SE_ACCESS_SHADER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + Gfx::OComputeCommand mipCommand = graphics->createComputeCommand(fmt::format("MipGenLevel{0}", i)); + mipCommand->bindPipeline(depthMipGen); + mipCommand->bindDescriptor({viewParamsSet, set}); MipParam params = { .srcMipOffset = mipOffsets[i], .dstMipOffset = mipOffsets[i + 1], .srcMipDim = mipDims[i], .dstMipDim = mipDims[i + 1], }; - computeCommand->pushConstants(Gfx::SE_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(MipParam), ¶ms); - UVector2 threadGroups = (((mipDims[i] + UVector2(1, 1)) / 2u) + UVector2(BLOCK_SIZE - 1, BLOCK_SIZE - 1)) / uint32(BLOCK_SIZE); - computeCommand->dispatch(threadGroups.x, threadGroups.y, 1); + mipCommand->pushConstants(Gfx::SE_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(MipParam), ¶ms); + UVector2 threadGroups = (reduceDimensions + 1u) / 2u; + mipCommand->dispatch(threadGroups.x, threadGroups.y, 1); + graphics->executeCommands(std::move(mipCommand)); } - Array computeCommands; - computeCommands.add(std::move(computeCommand)); - graphics->executeCommands(std::move(computeCommands)); depthMipBuffer->pipelineBarrier(Gfx::SE_ACCESS_SHADER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT, Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_TASK_SHADER_BIT_EXT); @@ -141,7 +135,7 @@ void DepthCullingPass::render() { Array commands; Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("DepthPass"); - permutation.setPositionOnly(getGlobals().usePositionOnly); + permutation.setPositionOnly(true); permutation.setDepthCulling(getGlobals().useDepthCulling); for (VertexData* vertexData : VertexData::getList()) { permutation.setVertexData(vertexData->getTypeName()); @@ -238,35 +232,10 @@ void DepthCullingPass::publishOutputs() { mipOffsets.add(bufferSize); mipDims.add(UVector2(width, height)); bufferSize += width * height; - width = std::max((width + 1) / 2, 1u); - height = std::max((height + 1) / 2, 1u); + width = (width + 1) / 2; + height = (height + 1) / 2; } - //debugUniform = graphics->createUniformBuffer(UniformBufferCreateInfo{ - // .sourceData = - // { - // .size = sizeof(uint32), - // .data = (uint8*)&bufferSize, - // }, - //}); - //uint32 reset = 0; - //debugHead = graphics->createShaderBuffer(ShaderBufferCreateInfo{ - // .sourceData = - // { - // .size = sizeof(uint32), - // .data = (uint8*)&reset, - // }, - // - //}); - //debugData = graphics->createShaderBuffer(ShaderBufferCreateInfo{ - // .sourceData = - // { - // .size = sizeof(DepthDebugData) * 10000, - // .data = nullptr, - // }, - //}); - //graphics->waitDeviceIdle(); - depthMipBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { @@ -274,6 +243,9 @@ void DepthCullingPass::publishOutputs() { .data = nullptr, }, .numElements = bufferSize, + .clearValue = 0, + .createCleared = true, + .dynamic = true, .name = "DepthMipBuffer", }); diff --git a/src/Engine/Graphics/RenderPass/DepthCullingPass.h b/src/Engine/Graphics/RenderPass/DepthCullingPass.h index 518cf2f..a0f94a4 100644 --- a/src/Engine/Graphics/RenderPass/DepthCullingPass.h +++ b/src/Engine/Graphics/RenderPass/DepthCullingPass.h @@ -26,16 +26,9 @@ class DepthCullingPass : public RenderPass { UVector2 dstMipDim; }; - struct DepthDebugData { - uint32 mipLevel; - uint32 mipOffset; - UVector2 mipDimensions; - UVector2 screenCornerMin; - UVector2 screenCornerMax; - }; - Array mipOffsets; Array mipDims; + Gfx::OShaderBuffer depthMipBuffer; Gfx::RenderTargetAttachment depthAttachment; Gfx::RenderTargetAttachment visibilityAttachment; @@ -49,11 +42,7 @@ class DepthCullingPass : public RenderPass { Gfx::PComputePipeline depthInitialReduce; Gfx::OComputeShader depthMipGenShader; Gfx::PComputePipeline depthMipGen; - - //Gfx::OUniformBuffer debugUniform; - //Gfx::OShaderBuffer debugHead; - //Gfx::OShaderBuffer debugData; - + Gfx::PShaderBuffer cullingBuffer; }; DEFINE_REF(DepthCullingPass) diff --git a/src/Engine/Graphics/RenderPass/WaterRenderer.cpp b/src/Engine/Graphics/RenderPass/WaterRenderer.cpp index 5e2c711..d89233e 100644 --- a/src/Engine/Graphics/RenderPass/WaterRenderer.cpp +++ b/src/Engine/Graphics/RenderPass/WaterRenderer.cpp @@ -174,7 +174,7 @@ WaterRenderer::WaterRenderer(Gfx::PGraphics graphics, PScene scene, Gfx::PDescri {"CS_AssembleMaps", "WaterCompute"}, }, .rootSignature = pipelineLayout, - .dumpIntermediate = true, + .dumpIntermediate = false, }; graphics->beginShaderCompilation(info); initSpectrumCS = graphics->createComputeShader({0});