Derive gaussian splat SH order from resource layout
This commit is contained in:
@@ -1064,6 +1064,11 @@ bool BuiltinGaussianSplatPass::PrepareVisibleGaussianSplat(
|
||||
|
||||
commandList->SetPipelineState(pipelineState);
|
||||
|
||||
const float shOrder =
|
||||
visibleGaussianSplat.gaussianSplat != nullptr
|
||||
? static_cast<float>(visibleGaussianSplat.gaussianSplat->GetSHOrder())
|
||||
: 0.0f;
|
||||
|
||||
const PerObjectConstants perObjectConstants = {
|
||||
sceneData.cameraData.projection,
|
||||
sceneData.cameraData.view,
|
||||
@@ -1080,7 +1085,7 @@ bool BuiltinGaussianSplatPass::PrepareVisibleGaussianSplat(
|
||||
Math::Vector4(
|
||||
static_cast<float>(cachedGaussianSplat->splatCount),
|
||||
static_cast<float>(workingSet->sortCapacity),
|
||||
3.0f,
|
||||
shOrder,
|
||||
0.0f)
|
||||
};
|
||||
|
||||
|
||||
@@ -3,6 +3,38 @@
|
||||
namespace XCEngine {
|
||||
namespace Resources {
|
||||
|
||||
Core::uint32 ResolveGaussianSplatSHOrderFromCoefficientCount(Core::uint32 coefficientCount) {
|
||||
if (coefficientCount == 0u || (coefficientCount % kGaussianSplatSHColorChannelCount) != 0u) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
Core::uint32 remainingTriplets = coefficientCount / kGaussianSplatSHColorChannelCount;
|
||||
Core::uint32 resolvedOrder = 0u;
|
||||
for (Core::uint32 order = 1u; order <= kGaussianSplatMaxSHOrder; ++order) {
|
||||
const Core::uint32 bandTriplets = (2u * order) + 1u;
|
||||
if (remainingTriplets < bandTriplets) {
|
||||
break;
|
||||
}
|
||||
|
||||
remainingTriplets -= bandTriplets;
|
||||
resolvedOrder = order;
|
||||
}
|
||||
|
||||
return resolvedOrder;
|
||||
}
|
||||
|
||||
Core::uint32 ResolveGaussianSplatSHOrderFromSectionStride(Core::uint32 elementStride) {
|
||||
if (elementStride < sizeof(float)) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
const Core::uint32 floatCount = elementStride / static_cast<Core::uint32>(sizeof(float));
|
||||
const Core::uint32 coefficientCount = floatCount > kGaussianSplatSHCoefficientCount
|
||||
? kGaussianSplatSHCoefficientCount
|
||||
: floatCount;
|
||||
return ResolveGaussianSplatSHOrderFromCoefficientCount(coefficientCount);
|
||||
}
|
||||
|
||||
GaussianSplat::GaussianSplat() = default;
|
||||
|
||||
GaussianSplat::~GaussianSplat() = default;
|
||||
@@ -69,6 +101,11 @@ const GaussianSplatSHRecord* GaussianSplat::GetSHRecords() const {
|
||||
return static_cast<const GaussianSplatSHRecord*>(GetSectionData(GaussianSplatSectionType::SH));
|
||||
}
|
||||
|
||||
Core::uint32 GaussianSplat::GetSHOrder() const {
|
||||
const GaussianSplatSection* shSection = FindSection(GaussianSplatSectionType::SH);
|
||||
return shSection != nullptr ? ResolveGaussianSplatSHOrderFromSectionStride(shSection->elementStride) : 0u;
|
||||
}
|
||||
|
||||
bool GaussianSplat::ValidateSections(const Containers::Array<GaussianSplatSection>& sections,
|
||||
size_t payloadSize) const {
|
||||
for (size_t index = 0; index < sections.Size(); ++index) {
|
||||
|
||||
Reference in New Issue
Block a user