Derive gaussian splat SH order from resource layout

This commit is contained in:
2026-04-11 06:57:47 +08:00
parent 785377bc9b
commit b3acb5afc2
5 changed files with 82 additions and 1 deletions

View File

@@ -328,6 +328,7 @@ void GaussianSplatSceneTest::PrepareRuntimeProject() {
ASSERT_NE(m_gaussianSplat.Get(), nullptr);
ASSERT_TRUE(m_gaussianSplat->IsValid());
ASSERT_GT(m_gaussianSplat->GetSplatCount(), 0u);
ASSERT_EQ(m_gaussianSplat->GetSHOrder(), 3u);
m_subsetGaussianSplat = CreateGaussianSplatSubset(
*m_gaussianSplat.Get(),
kBaselineSubsetSplatCount,
@@ -335,6 +336,7 @@ void GaussianSplatSceneTest::PrepareRuntimeProject() {
ASSERT_NE(m_subsetGaussianSplat, nullptr);
ASSERT_TRUE(m_subsetGaussianSplat->IsValid());
ASSERT_GT(m_subsetGaussianSplat->GetSplatCount(), 0u);
ASSERT_EQ(m_subsetGaussianSplat->GetSHOrder(), 3u);
}
void GaussianSplatSceneTest::BuildScene() {

View File

@@ -8,6 +8,14 @@ using namespace XCEngine::Math;
namespace {
TEST(GaussianSplat, ResolvesSHOrderFromCoefficientCount) {
EXPECT_EQ(ResolveGaussianSplatSHOrderFromCoefficientCount(0u), 0u);
EXPECT_EQ(ResolveGaussianSplatSHOrderFromCoefficientCount(9u), 1u);
EXPECT_EQ(ResolveGaussianSplatSHOrderFromCoefficientCount(24u), 2u);
EXPECT_EQ(ResolveGaussianSplatSHOrderFromCoefficientCount(45u), 3u);
EXPECT_EQ(ResolveGaussianSplatSHOrderFromCoefficientCount(46u), 0u);
}
TEST(GaussianSplat, CreateOwnedStoresMetadataSectionsAndPayload) {
GaussianSplat gaussianSplat;
@@ -48,6 +56,29 @@ TEST(GaussianSplat, CreateOwnedStoresMetadataSectionsAndPayload) {
EXPECT_NE(gaussianSplat.GetSectionData(GaussianSplatSectionType::Positions), nullptr);
}
TEST(GaussianSplat, GetSHOrderUsesSHSectionStride) {
GaussianSplat gaussianSplat;
GaussianSplatMetadata metadata;
metadata.splatCount = 1u;
XCEngine::Containers::Array<GaussianSplatSection> sections;
sections.PushBack(GaussianSplatSection{
GaussianSplatSectionType::SH,
GaussianSplatSectionFormat::SHFloat32,
0u,
96u,
1u,
96u
});
XCEngine::Containers::Array<XCEngine::Core::uint8> payload;
payload.Resize(96u);
ASSERT_TRUE(gaussianSplat.CreateOwned(metadata, std::move(sections), std::move(payload)));
EXPECT_EQ(gaussianSplat.GetSHOrder(), 2u);
}
TEST(GaussianSplat, RejectsInvalidSectionLayout) {
GaussianSplat gaussianSplat;