ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深入解析 Rerun 的 SphericalHarmonics3Rgb 组件:3D 高斯溅射视点相关颜色的球形谐波编码

深入解析 Rerun 的 SphericalHarmonics3Rgb 组件:3D 高斯溅射视点相关颜色的球形谐波编码 深入解析 Rerun 的 SphericalHarmonics3Rgb 组件3D 高斯溅射视点相关颜色的球形谐波编码【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun导读SphericalHarmonics3Rgb是 Rerun 数据模型中用于表达视点相关view-dependent颜色的核心组件它把 1 到 3 阶球形谐波Spherical HarmonicsSH系数编码为 15 个半精度 RGB 三元组与独立的零阶DC基色Color组件配合共同支撑GaussianSplats3D的逼真渲染。阅读本文后你将掌握该组件的系数排列规则、Arrow 数据类型布局、与 3D Gaussian Splatting PLY 文件格式的互操作细节含通道主序到系数主序的转置以及零填充/截断的数学语义并能从源码级理解其导入与渲染的完整链路。⚠️稳定性提示根据 类型参考文档该类型目前标记为unstable可能在数据不再向后兼容的情况下发生显著变化。一、为什么需要球形谐波视点相关颜色组件在 3D Gaussian SplattingKerbl 等人2023这类神经渲染场景中每个高斯gaussian的颜色并非恒定不变而是随观察视角变化从而呈现高光、光泽等光学效果。球形谐波是表达这种方向相关函数的标准数学工具。SphericalHarmonics3Rgb组件的职责正是承载度数为 1 到 3的视点相关颜色系数其完整语义在 组件定义文档 中给出View-dependent color, expressed as spherical harmonics coefficients of degrees 1 through 3.值得注意的是该组件刻意排除了零阶degree-0项。视点无关的 DC 基色被建模为一个独立的components.Color组件。这种职责分离意味着Rerun 中一个高斯溅射点的完整颜色表达 基色Color含 alpha 透明度 高阶视点相关项SphericalHarmonics3Rgb。从源码看这一设计在 Rust 端体现为两个层次的类型Encoding 层rerun.encodings.SphericalHarmonics3Rgb纯数据布局类型位于 crates/store/re_sdk_types/src/encodings/spherical_harmonics3rgb.rsComponent 层rerun.components.SphericalHarmonics3Rgb薄包装#[repr(transparent)]直接包裹 encoding实现WrapperComponenttrait位于 crates/store/re_sdk_types/src/components/spherical_harmonics3rgb.rs。// crates/store/re_sdk_types/src/components/spherical_harmonics3rgb.rs节选 #[repr(transparent)] pub struct SphericalHarmonics3Rgb(pub crate::encodings::SphericalHarmonics3Rgb); impl ::re_types_core::WrapperComponent for SphericalHarmonics3Rgb { type Encoding crate::encodings::SphericalHarmonics3Rgb; fn name() - ComponentType { rerun.components.SphericalHarmonics3Rgb.into() } }二、系数排列规则系数主序Coefficient-Major布局该组件的核心难点在于 15 个系数每个系数又是一个 RGB 三元组的排列顺序。编码参考文档 对此有精确定义系数主序存储内存布局为[c1.rgb, c2.rgb, …, c15.rgb]即每个系数的 RGB 三个通道紧邻存放按度数升序排列15 个系数c1…c15按度数l 1, 2, 3升序排列度内按阶数排列在每个度数内部按m -l … l升序排列度数 1c1…c33 个系数度数 2c4…c85 个系数度数 3c9…c157 个系数不分组暴露由于各度数系数个数不同3、5、7度数之间不设独立分组边界。Rust 侧的类型定义与文档完全一致——编码类型是一个定长二维数组// crates/store/re_sdk_types/src/encodings/spherical_harmonics3rgb.rs节选 /// Spherical harmonics coefficients of degrees 1 through 3, coefficient-major. pub struct SphericalHarmonics3Rgb( pub [[half::f16; 3usize]; 15usize], );编码层的扩展实现crates/store/re_sdk_types/src/encodings/spherical_harmonics3rgb_ext.rs还提供了两个实用能力/// The number of coefficients of degrees 1 through 3, i.e. the number of RGB triples. pub const NUM_COEFFICIENTS: usize 15; /// Create from 15 RGB coefficient triples of f32, converting each to half-precision. pub fn from_f32(coefficients: [[f32; 3]; Self::NUM_COEFFICIENTS]) - Self { Self(coefficients.map(|rgb| rgb.map(f16::from_f32))) }NUM_COEFFICIENTS 15是系数总数的单一权威常量并有编译期断言assert!确保它与数组长度同步from_f32允许以f32精度构造内部自动转换为half::f16半精度。三、Arrow 数据类型FixedSizeList 嵌套结构无论是组件还是编码SphericalHarmonics3Rgb在 Arrow 中的数据类型都是FixedSizeList(15 x non-null FixedSizeList(3 x non-null Float16))即外层是一个固定长度 15的列表内层是固定长度 3的列表最内层是Float16半精度浮点。该布局与系数主序一一对应——外层 15 对应 15 个系数内层 3 对应 RGB 通道。源码中该数据类型的构造逻辑位于 crates/store/re_sdk_types/src/encodings/spherical_harmonics3rgb.rs 的ArrowDataTypetrait 实现DataType::FixedSizeList( std::sync::Arc::new(Field::new( item, DataType::FixedSizeList( std::sync::Arc::new(Field::new(item, DataType::Float16, false)), 3, ), false, )), 15, )反序列化端FromArrow还会做严格的校验外层value_length()必须为 15、内层必须为 3否则抛出datatype_mismatch错误最终通过bytemuck::try_cast_slice将连续的Float16缓冲直接零拷贝重解释为[[f16; 3]; 15]数组。序列化ToArrow与反序列化方向完全对称并借助bytemuck::Pod/Zeroable保证内存布局的位级可移植性。选择Float16而非Float32是面向存储与传输体积的工程取舍单个高斯 45 个半精度标量仅占 90 字节这在动辄数十万高斯的场景下能显著降低数据量与内存带宽开销。四、与 3D Gaussian Splatting PLY 的互操作通道主序转置编码文档明确指出该组件的系数排列顺序与 3D Gaussian Splatting PLY 文件中的f_rest_*属性一一对应Kerbl 等人2023但存在一个关键差异需要处理3DGS PLY 按通道主序channel-major存储先是 R 通道全部 15 个系数再是 G 通道最后是 B 通道而 Rerun 需要系数主序因此导入时必须做转置transpose。这一点在GaussianSplats3D的扩展实现 中体现得淋漓尽致。from_ply_file_contents的文档注释完整描述了 PLY 属性到 Rerun 组件的映射/// * scale_* (logarithmic) becomes linear [Scale3D] /// * opacity (logit) becomes the alpha of the [Color] via the sigmoid /// * f_dc_* becomes the RGB of the [Color] by evaluating the degree-0 spherical harmonic /// * rot_* (wxyz) becomes a normalized xyzw [RotationQuat] /// * f_rest_* (channel-major) becomes coefficient-major [SphericalHarmonics3Rgb], /// zero-padded if the file is of a lower degree than 3, and truncated if of a higher one转置由slot_of函数gaussian_splats3d_ext.rs在读取计划阶段完成它把f_rest_index属性名解析为通道号channel index / num_sh_per_channel与系数号coefficient index % num_sh_per_channel再重排到目标槽位SH 3 * coefficient channel——这正是系数主序。由于该重命名在每个顶点处理之前只做一次read_plan而非逐顶点做字符串比较代码注释特别强调这对大文件的性能至关重要每个文件动辄数亿次set_property调用。导入时的两个边界处理策略也值得注意高于 3 阶若文件每通道系数数超过 15即阶数高于 3只保留每通道前 15 个系数即最佳的 3 阶近似其余丢弃并给出warn_once警告低于 3 阶按下一节所述的零填充规则补齐。此外color()方法gaussian_splats3d_ext.rs展示了零阶项的处理通过球形谐波常数sh_c0 0.5 * sqrt(1/π)评估 DC 系数得到基色 RGB同时将opacity以 logit 存储经 sigmoid 转换为 alpha——两者合并为Color::new((r, g, b, a))。五、零填充与截断正交基下的数学语义编码文档特别解释了处理“数据度数低于 3”时的规则及其数学依据Data of a lower spherical harmonics degree should be zero-padded, which represents the exact same function (the spherical harmonics basis is orthonormal).低度数数据应当零填充由于球形谐波基是**正交归一orthonormal**的把高阶系数补零并不改变所表示的函数本身——缺的项本来就不存在补零后仍是同一个方向颜色函数。反之在度数边界处3 个和 8 个三元组截断尾部系数得到的是该低度数函数的最优最小二乘近似optimal least-squares approximation。这意味着只保留前 3 个三元组度数 1 边界→ 仅用一阶项近似只保留前 8 个三元组度数 2 边界→ 用至二阶项近似保留全部 15 个三元组 → 完整的三阶表达。slot_of注释中也明确引用了这一策略当文件每通道系数数超过 15 时“keep the leading coefficients of each channel (the optimal degree-3 approximation) and drop the rest”。该语义还与配套组件SphericalHarmonicsDegree直接相关——后者表示渲染时实际求值的最高阶数0–3默认 3调低它可以大幅加速渲染求值系数从 15 个逐级降到 8、3 个直至只用基色。六、SDK 使用方式Python 与 Rust 实践该组件通常不单独手动构造而是通过GaussianSplats3D原型以批batch的形式随其他高斯属性一同下发。Python 侧在 rerun_py/rerun_sdk/rerun/archetypes/gaussian_splats3d.py 中构造参数为sh_coefficients类型encodings.SphericalHarmonics3RgbArrayLike与配套的spherical_harmonics_degreeGaussianSplats3D( positionspositions, colorscolors, # 零阶基色含 alpha sh_coefficientssh_coefficients, # 15 个半精度 RGB 三元组系数主序 spherical_harmonics_degree3, # 渲染时求值的最高阶数0–3 scalesscales, rotationsrotations, )其组件类型为components.SphericalHarmonics3RgbBatch组件描述符为GaussianSplats3D:sh_coefficients。若数据来自 3DGS 标准 PLYsh_coefficients的值通常由导入链路自动生成无需手工重排通道。Rust 侧Rust 中可通过编码层的from_f32直接构造spherical_harmonics3rgb_ext.rsuse rerun::encodings::SphericalHarmonics3Rgb; let sh: SphericalHarmonics3Rgb [[f32; 3]; 15] 的 15 个三元组.into(); // 或 let sh SphericalHarmonics3Rgb::from_f32(coefficients);同时支持From[[f16; 3]; 15]与反向FromSphericalHarmonics3Rgb的相互转换见 spherical_harmonics3rgb.rs便于与bytemuck兼容的数据管线集成。七、总结SphericalHarmonics3Rgb是 Rerun 类型系统中一个设计精巧的组件关注点规范数据内容度数 1–3 的视点相关颜色球形谐波系数系数个数15 个 RGB 三元组3 5 7存储顺序系数主序按度数升序、度内按m升序零阶项不包含由独立的Color组件承载Arrow 类型FixedSizeList(15 x FixedSizeList(3 x Float16))精度Float16半精度Rust 端half::f16PLY 互操作需将 3DGS 的通道主序f_rest_*转置为系数主序稳定性⚠️ unstable可能不向后兼容它在GaussianSplats3D中与Color基色 透明度、SphericalHarmonicsDegree渲染求值阶数协同工作构成了从 PLY 文件导入、Arrow 序列化到视点相关渲染的完整数据链路。理解其系数布局与转置语义是正确对接外部 3DGS 数据、以及调优渲染性能降低求值阶数的前提。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表