Add gaussian splat asset caching groundwork

This commit is contained in:
2026-04-12 11:15:59 +08:00
parent b7ce8618d2
commit 7ee28a7969
16 changed files with 1652 additions and 88 deletions

View File

@@ -229,21 +229,21 @@ Shader "Builtin Gaussian Splat Utilities"
}
float3 CalcCovariance2D(
float3 viewPosition,
float3 localPosition,
float3 covariance3D0,
float3 covariance3D1,
float4x4 viewMatrix,
float4x4 modelViewMatrix,
float4x4 projectionMatrix,
float2 screenSize)
{
const float3 viewPosition = mul(modelViewMatrix, float4(localPosition, 1.0)).xyz;
if (abs(viewPosition.z) <= 1.0e-5)
{
return float3(0.3, 0.0, 0.3);
}
const float aspect = projectionMatrix[0][0] / projectionMatrix[1][1];
const float tanFovX = rcp(projectionMatrix[0][0]);
const float tanFovY = rcp(projectionMatrix[1][1] * aspect);
const float tanFovY = rcp(projectionMatrix[1][1]);
const float limitX = 1.3 * tanFovX;
const float limitY = 1.3 * tanFovY;
@@ -264,7 +264,7 @@ Shader "Builtin Gaussian Splat Utilities"
0.0,
0.0,
0.0);
const float3x3 worldToView = (float3x3)viewMatrix;
const float3x3 worldToView = (float3x3)modelViewMatrix;
const float3x3 transform = mul(jacobian, worldToView);
const float3x3 covariance3D = float3x3(
covariance3D0.x, covariance3D0.y, covariance3D0.z,
@@ -284,7 +284,7 @@ Shader "Builtin Gaussian Splat Utilities"
const float offDiagonal = covariance2D.y;
const float mid = 0.5 * (diagonal0 + diagonal1);
const float radius = length(float2((diagonal0 - diagonal1) * 0.5, offDiagonal));
const float lambda0 = max(mid + radius, 0.1);
const float lambda0 = mid + radius;
const float lambda1 = max(mid - radius, 0.1);
float2 basis = normalize(float2(offDiagonal, lambda0 - diagonal0));
@@ -425,22 +425,22 @@ Shader "Builtin Gaussian Splat Utilities"
GaussianSplatSortDistances[index] = FloatToSortableUint(viewCenter.z);
const float4 clipCenter = mul(gProjectionMatrix, float4(viewCenter, 1.0));
if (clipCenter.w > 0.0)
const float nearClip = max(gCameraWorldPos.w, 1.0e-4);
if (clipCenter.w > 0.0 && viewCenter.z > nearClip)
{
const float3x3 modelLinear = (float3x3)gModelMatrix;
const float4x4 modelViewMatrix = mul(gViewMatrix, gModelMatrix);
const float3x3 rotationScaleMatrix =
CalcMatrixFromRotationScale(otherData.rotation, otherData.scaleReserved.xyz);
const float3x3 worldRotationScale = mul(modelLinear, rotationScaleMatrix);
float3 covariance3D0 = 0.0;
float3 covariance3D1 = 0.0;
CalcCovariance3D(worldRotationScale, covariance3D0, covariance3D1);
CalcCovariance3D(rotationScaleMatrix, covariance3D0, covariance3D1);
const float3 covariance2D = CalcCovariance2D(
viewCenter,
localCenter,
covariance3D0,
covariance3D1,
gViewMatrix,
modelViewMatrix,
gProjectionMatrix,
gScreenParams.xy);