Precompute gaussian splat chunk visibility

This commit is contained in:
2026-04-11 16:32:40 +08:00
parent 0a2bdedc59
commit c03c7379c8
11 changed files with 583 additions and 62 deletions

View File

@@ -302,6 +302,60 @@ Shader "Builtin Gaussian Splat Utilities"
SubShader
{
Pass
{
Name "GaussianSplatMarkVisibleChunks"
HLSLPROGRAM
#pragma target 4.5
#pragma compute GaussianSplatMarkVisibleChunksCS
cbuffer PerObjectConstants
{
float4x4 gProjectionMatrix;
float4x4 gViewMatrix;
float4x4 gModelMatrix;
float4x4 gWorldToObjectMatrix;
float4 gCameraRight;
float4 gCameraUp;
float4 gCameraWorldPos;
float4 gScreenParams;
float4 gSplatParams;
};
StructuredBuffer<GaussianSplatChunkData> GaussianSplatChunks;
RWStructuredBuffer<uint> GaussianSplatVisibleChunks;
[numthreads(64, 1, 1)]
void GaussianSplatMarkVisibleChunksCS(uint3 dispatchThreadId : SV_DispatchThreadID)
{
const uint chunkCount = (uint)gSplatParams.w;
const uint chunkIndex = dispatchThreadId.x;
if (chunkIndex >= chunkCount)
{
return;
}
const GaussianSplatChunkData chunkData = GaussianSplatChunks[chunkIndex];
uint visibleFlag = 1u;
if (chunkData.posX.x > chunkData.posX.y ||
chunkData.posY.x > chunkData.posY.y ||
chunkData.posZ.x > chunkData.posZ.y ||
IsChunkDefinitelyOutsideFrustum(
chunkData,
chunkCount,
chunkIndex,
gModelMatrix,
gViewMatrix,
gProjectionMatrix))
{
visibleFlag = 0u;
}
GaussianSplatVisibleChunks[chunkIndex] = visibleFlag;
}
ENDHLSL
}
Pass
{
Name "GaussianSplatPrepareOrder"
@@ -326,7 +380,7 @@ Shader "Builtin Gaussian Splat Utilities"
StructuredBuffer<GaussianSplatOtherData> GaussianSplatOther;
StructuredBuffer<float4> GaussianSplatColor;
StructuredBuffer<GaussianSplatSHData> GaussianSplatSH;
StructuredBuffer<GaussianSplatChunkData> GaussianSplatChunks;
StructuredBuffer<uint> GaussianSplatVisibleChunks : register(t0, space3);
RWStructuredBuffer<uint> GaussianSplatSortDistances;
RWStructuredBuffer<uint> GaussianSplatOrderBuffer;
RWStructuredBuffer<GaussianSplatViewData> GaussianSplatViewDataBuffer;
@@ -358,23 +412,8 @@ Shader "Builtin Gaussian Splat Utilities"
const GaussianSplatSHData shData = GaussianSplatSH[index];
const uint chunkIndex = index / GAUSSIAN_SPLAT_CHUNK_SIZE;
const uint chunkCount = (uint)gSplatParams.w;
const GaussianSplatChunkData chunkData = GaussianSplatChunks[chunkIndex];
const uint shOrder = min((uint)gSplatParams.z, 3u);
if (chunkData.posX.x > chunkData.posX.y ||
chunkData.posY.x > chunkData.posY.y ||
chunkData.posZ.x > chunkData.posZ.y)
{
GaussianSplatSortDistances[index] = 0xffffffffu;
GaussianSplatViewDataBuffer[index] = viewData;
return;
}
if (IsChunkDefinitelyOutsideFrustum(
chunkData,
chunkCount,
chunkIndex,
gModelMatrix,
gViewMatrix,
gProjectionMatrix))
if (chunkIndex >= chunkCount || GaussianSplatVisibleChunks[chunkIndex] == 0u)
{
GaussianSplatSortDistances[index] = 0xffffffffu;
GaussianSplatViewDataBuffer[index] = viewData;