Add gaussian splat compute shader contracts

This commit is contained in:
2026-04-11 01:30:59 +08:00
parent 4080b2e5fe
commit d9bc0f1457
9 changed files with 442 additions and 8 deletions

View File

@@ -62,6 +62,12 @@ inline bool TryBuildBuiltinPassResourceBindingPlan(
case BuiltinPassResourceSemantic::VolumeField:
location = &outPlan.volumeField;
break;
case BuiltinPassResourceSemantic::GaussianSplatSortDistanceBuffer:
location = &outPlan.gaussianSplatSortDistanceBuffer;
break;
case BuiltinPassResourceSemantic::GaussianSplatOrderBuffer:
location = &outPlan.gaussianSplatOrderBuffer;
break;
case BuiltinPassResourceSemantic::GaussianSplatPositionBuffer:
location = &outPlan.gaussianSplatPositionBuffer;
break;
@@ -74,6 +80,9 @@ inline bool TryBuildBuiltinPassResourceBindingPlan(
case BuiltinPassResourceSemantic::GaussianSplatSHBuffer:
location = &outPlan.gaussianSplatSHBuffer;
break;
case BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer:
location = &outPlan.gaussianSplatViewDataBuffer;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
location = &outPlan.baseColorTexture;
break;
@@ -600,6 +609,12 @@ inline bool TryBuildBuiltinPassSetLayouts(
case BuiltinPassResourceSemantic::VolumeField:
setLayout.usesVolumeField = true;
break;
case BuiltinPassResourceSemantic::GaussianSplatSortDistanceBuffer:
setLayout.usesGaussianSplatSortDistanceBuffer = true;
break;
case BuiltinPassResourceSemantic::GaussianSplatOrderBuffer:
setLayout.usesGaussianSplatOrderBuffer = true;
break;
case BuiltinPassResourceSemantic::GaussianSplatPositionBuffer:
setLayout.usesGaussianSplatPositionBuffer = true;
break;
@@ -612,6 +627,9 @@ inline bool TryBuildBuiltinPassSetLayouts(
case BuiltinPassResourceSemantic::GaussianSplatSHBuffer:
setLayout.usesGaussianSplatSHBuffer = true;
break;
case BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer:
setLayout.usesGaussianSplatViewDataBuffer = true;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
setLayout.usesTexture = true;
setLayout.usesBaseColorTexture = true;

View File

@@ -147,6 +147,18 @@ inline BuiltinPassResourceSemantic ResolveBuiltinPassResourceSemantic(
return BuiltinPassResourceSemantic::VolumeField;
}
if (semantic == Containers::String("gaussiansplatsortdistancebuffer") ||
semantic == Containers::String("gaussiansplatsortdistances") ||
semantic == Containers::String("splatsortdistances")) {
return BuiltinPassResourceSemantic::GaussianSplatSortDistanceBuffer;
}
if (semantic == Containers::String("gaussiansplatorderbuffer") ||
semantic == Containers::String("gaussiansplatorder") ||
semantic == Containers::String("orderbuffer")) {
return BuiltinPassResourceSemantic::GaussianSplatOrderBuffer;
}
if (semantic == Containers::String("gaussiansplatpositionbuffer") ||
semantic == Containers::String("gaussiansplatpositions") ||
semantic == Containers::String("splatpositions")) {
@@ -171,6 +183,12 @@ inline BuiltinPassResourceSemantic ResolveBuiltinPassResourceSemantic(
return BuiltinPassResourceSemantic::GaussianSplatSHBuffer;
}
if (semantic == Containers::String("gaussiansplatviewdatabuffer") ||
semantic == Containers::String("gaussiansplatviewdata") ||
semantic == Containers::String("splatviewdata")) {
return BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer;
}
if (semantic == Containers::String("basecolortexture") ||
semantic == Containers::String("maintex")) {
return BuiltinPassResourceSemantic::BaseColorTexture;
@@ -233,6 +251,10 @@ inline const char* BuiltinPassResourceSemanticToString(BuiltinPassResourceSemant
return "PassConstants";
case BuiltinPassResourceSemantic::VolumeField:
return "VolumeField";
case BuiltinPassResourceSemantic::GaussianSplatSortDistanceBuffer:
return "GaussianSplatSortDistanceBuffer";
case BuiltinPassResourceSemantic::GaussianSplatOrderBuffer:
return "GaussianSplatOrderBuffer";
case BuiltinPassResourceSemantic::GaussianSplatPositionBuffer:
return "GaussianSplatPositionBuffer";
case BuiltinPassResourceSemantic::GaussianSplatOtherBuffer:
@@ -241,6 +263,8 @@ inline const char* BuiltinPassResourceSemanticToString(BuiltinPassResourceSemant
return "GaussianSplatColorBuffer";
case BuiltinPassResourceSemantic::GaussianSplatSHBuffer:
return "GaussianSplatSHBuffer";
case BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer:
return "GaussianSplatViewDataBuffer";
case BuiltinPassResourceSemantic::BaseColorTexture:
return "BaseColorTexture";
case BuiltinPassResourceSemantic::SourceColorTexture:
@@ -329,12 +353,17 @@ inline bool IsBuiltinPassResourceTypeCompatible(
case BuiltinPassResourceSemantic::VolumeField:
return type == Resources::ShaderResourceType::StructuredBuffer ||
type == Resources::ShaderResourceType::RawBuffer;
case BuiltinPassResourceSemantic::GaussianSplatSortDistanceBuffer:
case BuiltinPassResourceSemantic::GaussianSplatOrderBuffer:
case BuiltinPassResourceSemantic::GaussianSplatPositionBuffer:
case BuiltinPassResourceSemantic::GaussianSplatOtherBuffer:
case BuiltinPassResourceSemantic::GaussianSplatColorBuffer:
case BuiltinPassResourceSemantic::GaussianSplatSHBuffer:
case BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer:
return type == Resources::ShaderResourceType::StructuredBuffer ||
type == Resources::ShaderResourceType::RawBuffer;
type == Resources::ShaderResourceType::RawBuffer ||
type == Resources::ShaderResourceType::RWStructuredBuffer ||
type == Resources::ShaderResourceType::RWRawBuffer;
case BuiltinPassResourceSemantic::BaseColorTexture:
case BuiltinPassResourceSemantic::SourceColorTexture:
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:

View File

@@ -46,11 +46,13 @@ enum class BuiltinPassResourceSemantic : Core::uint8 {
Environment,
PassConstants,
VolumeField,
GaussianSplatSortDistanceBuffer,
GaussianSplatOrderBuffer,
GaussianSplatPositionBuffer,
GaussianSplatOtherBuffer,
GaussianSplatColorBuffer,
GaussianSplatSHBuffer,
GaussianSplatViewDataBuffer,
BaseColorTexture,
SourceColorTexture,
SkyboxPanoramicTexture,
@@ -84,11 +86,13 @@ struct BuiltinPassResourceBindingPlan {
PassResourceBindingLocation shadowReceiver = {};
PassResourceBindingLocation environment = {};
PassResourceBindingLocation passConstants = {};
PassResourceBindingLocation gaussianSplatSortDistanceBuffer = {};
PassResourceBindingLocation gaussianSplatOrderBuffer = {};
PassResourceBindingLocation gaussianSplatPositionBuffer = {};
PassResourceBindingLocation gaussianSplatOtherBuffer = {};
PassResourceBindingLocation gaussianSplatColorBuffer = {};
PassResourceBindingLocation gaussianSplatSHBuffer = {};
PassResourceBindingLocation gaussianSplatViewDataBuffer = {};
PassResourceBindingLocation baseColorTexture = {};
PassResourceBindingLocation sourceColorTexture = {};
PassResourceBindingLocation skyboxPanoramicTexture = {};
@@ -122,11 +126,13 @@ struct BuiltinPassSetLayoutMetadata {
bool usesPassConstants = false;
bool usesMaterialBuffers = false;
bool usesVolumeField = false;
bool usesGaussianSplatSortDistanceBuffer = false;
bool usesGaussianSplatOrderBuffer = false;
bool usesGaussianSplatPositionBuffer = false;
bool usesGaussianSplatOtherBuffer = false;
bool usesGaussianSplatColorBuffer = false;
bool usesGaussianSplatSHBuffer = false;
bool usesGaussianSplatViewDataBuffer = false;
bool usesTexture = false;
bool usesBaseColorTexture = false;
bool usesSourceColorTexture = false;

View File

@@ -39,6 +39,7 @@ Containers::String GetBuiltinSelectionMaskShaderPath();
Containers::String GetBuiltinSelectionOutlineShaderPath();
Containers::String GetBuiltinSkyboxShaderPath();
Containers::String GetBuiltinGaussianSplatShaderPath();
Containers::String GetBuiltinGaussianSplatUtilitiesShaderPath();
Containers::String GetBuiltinVolumetricShaderPath();
Containers::String GetBuiltinColorScalePostProcessShaderPath();
Containers::String GetBuiltinFinalColorShaderPath();