Precompute gaussian splat chunk visibility
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user