- 图形学
【免费下载链接】glTF
glTF – Runtime 3D Asset Delivery
KHR_gaussian_splatting 是 Khronos Group 官方批准(Ratified)的 glTF 2.0 扩展,它为在 glTF 资产中存储 3D 高斯泼溅(3D Gaussian Splatting)数据定义了统一规范,将高斯泼溅场以点基元(point primitive)的形式接入 glTF 生态。读完本文,你将掌握该扩展的属性语义、Ellipse 内核的渲染数学(协方差重建、透视投影、球谐光照与 alpha 合成)、回退行为以及如何在其基础上定义扩展,从而能够在自己的渲染器、导出器或训练管线中实现或消费这一标准格式。文中所有结论均基于 KHR_gaussian_splatting 扩展规范 及其 JSON Schema 源码。
扩展概览与设计目标
3D 高斯泼溅技术使用高斯函数场表示场景,从存储角度看,这一高斯场可以被当作点云来处理。KHR_gaussian_splatting 扩展正是利用这一特性,将每个 3D 高斯泼溅定义为由以下要素构成的实体:
- 位置(position)
- 旋转(rotation)
- 缩放(scale)
- 不透明度(opacity)
- 球谐系数(spherical harmonics)——同时提供漫反射(diffuse)与镜面反射(specular)颜色
这些值全部作为点基元(point primitive)上的属性存储。由于扩展将高斯泼溅视为点基元,因此当渲染器不支持该扩展时,可以**优雅降级(graceful fallback)**为将数据渲染为稀疏点云,这也构成了本扩展的兼容性基石。
本扩展的关键设计目标是为 3D 高斯泼溅接入 glTF 资产奠定稳固基础,同时刻意设计为可被自身扩展:随着 3D 高斯泼溅技术演进,未来的扩展可以在不修改基础扩展的情况下引入新的内核类型(kernel types)、色彩空间(color spaces)、投影方法(projection methods)和排序方法(sorting methods),使其逐步成为 glTF 生态内的标准。
在 glTF 扩展前缀规范 中,KHR前缀保留给 Khronos Group 已批准或计划批准的扩展,本扩展即属此类。
在 Mesh Primitive 上使用扩展
当某个 mesh primitive 的extensions属性中包含KHR_gaussian_splatting时,即向客户端(渲染器)表明:该基元 SHOULD 被当作 3D 高斯泼溅场处理。
依赖本扩展的其他扩展(例如 3D 高斯泼溅压缩扩展)MAY 要求本扩展被列入 glTF 顶层的extensionsRequired数组,以确保不支持本扩展的渲染器不会错误渲染数据。
扩展对象包含以下四个属性:
| 属性 | 类型 | 说明 | 必填 |
|---|---|---|---|
| kernel | string | 用于生成高斯的内核类型。 | 是 |
| colorSpace | string | 重建颜色值所处的色彩空间。 | 是 |
| projection | string | 渲染高斯时使用的投影方法。 | 否,默认"perspective" |
| sortingMethod | string | 渲染高斯时使用的排序方法。 | 否,默认"cameraDistance" |
上述必填项与默认值可以从 Schema 源码 中得到直接印证:"required": ["colorSpace", "kernel"],且projection与sortingMethod两个属性各自声明了"default"值。此外,Schema 中对四个属性均采用anyOf结构:先匹配预定义的const取值(如"ellipse"、"srgb_rec709_display"、"perspective"、"cameraDistance"),否则接受任意字符串——这正是为"未来扩展可新增取值"预留的合法化通道。
kernel:内核类型
高斯泼溅可以具有多种形状,且这种形状可能随时间演进。kernel是必填属性,它定义一个确切的 Gaussian 类型,即其形状、属性、预期渲染技术以及与基础 glTF 特性的交互方式。
本扩展仅定义一种内核类型"ellipse":一种 2D 椭圆内核,用于投影三维空间中的椭球形状。其他内核类型可随时间推移由定义替代定义的扩展补充(见下文 扩展基础扩展 与 Ellipse 内核详解)。
colorSpace:色彩空间
colorSpace是必填属性,指定重建的 3D 高斯泼溅颜色值所处的色彩空间,通常由泼溅的训练过程决定。该值仅作用于 3D 高斯泼溅数据,不影响 glTF 中任何其他颜色数据。
除非其他扩展另行规定,此色彩空间信息针对的是重建后的泼溅颜色值,因此所有中间渲染步骤(包括但不限于 alpha 混合)MUST 在色彩色域或传递函数转换之前完成。
本扩展定义的可选色彩空间如下:
| 色彩空间 | 说明 |
|---|---|
srgb_rec709_display | BT.709 sRGB(显示参考,display-referred)色彩空间。 |
lin_rec709_display | BT.709 线性(显示参考)色彩空间。 |
[!NOTE] 这些字符串值遵循 ASWF 色彩互操作论坛(Color Interoperability Forum, CIF)推荐的色彩空间标识模式("Display Color Spaces" 建议)。更多取值可通过扩展随时间补充。
projection:投影方法
projection是可选属性,指定高斯如何被投影到内核形状上,通常由泼溅的训练过程提供。该属性被设计为未来可扩展,随着社区标准化新的投影方式而演进。
本基础扩展仅定义一种投影方法"perspective"(透视投影),这也是其默认值。
sortingMethod:排序方法
sortingMethod是可选属性,指定渲染过程中高斯粒子(particles)的排序方式,通常由泼溅的训练过程提供。该属性同样被设计为可扩展。
本基础扩展仅定义一种排序方法cameraDistance(相机距离),即默认值。此方法基于从泼溅到相机原点(观察者位置)的向量长度对泼溅进行排序,详见下文 Splat 合成。
Ellipse 内核详解
Ellipse(2D 椭圆)内核类型将 3D 高斯泼溅表示为椭球形状。
对 glTF 的依赖
使用 Ellipse 内核时,基元需满足以下约束:
- mesh primitive 的
mode属性 MUST 为POINTS(0)。 - 除非其他高斯泼溅扩展另行规定,基元引用的 glTF 材质(若存在)在泼溅渲染中 MUST 被忽略。
[!NOTE] 若本扩展不被支持,实现方将遵循基础 glTF 规范,将泼溅基元渲染为点云;此时引用的 glTF 材质会被正常使用。
包含泼溅基元的 mesh 所属节点的全局变换矩阵 SHOULD 满足以下全部条件:
- 最后一行是 $(0, 0, 0, 1)$(基础 glTF 规范已隐式强制)。
- 前三列的列长度均为有限的正数。
- 将每个矩阵元素除以其所在列的长度后,所得左上角 3x3 矩阵的行列式接近正一。
这些规则确保变换矩阵可分解为常规的平移、旋转与正缩放。使用不可分解的变换矩阵或负缩放值进行泼溅渲染是未定义行为(undefined)。
用于泼溅渲染的相机 SHOULD 使用透视投影;使用非透视投影进行泼溅渲染同样是未定义行为。
属性定义
Ellipse 内核为 mesh primitive 定义以下属性(规范原文见文档"Attributes"小节):
| 泼溅数据 | 属性语义(Attribute Semantic) | Accessor 类型 | 分量类型 | 必填 |
|---|---|---|---|---|
| 位置 | POSITION | VEC3 | 继承自 glTF 规范 | 是 |
| 旋转 | KHR_gaussian_splatting:ROTATION | VEC4 | float、signed bytenormalized、signed shortnormalized | 是 |
| 缩放 | KHR_gaussian_splatting:SCALE | VEC3 | float、unsigned byte、unsigned bytenormalized、unsigned short、unsigned shortnormalized | 是 |
| 不透明度 | KHR_gaussian_splatting:OPACITY | SCALAR | float、unsigned bytenormalized、unsigned shortnormalized | 是 |
| 球谐 0 阶 | KHR_gaussian_splatting:SH_DEGREE_0_COEF_0 | VEC3 | float | 是 |
| 球谐 1 阶 | KHR_gaussian_splatting:SH_DEGREE_1_COEF_[0-2] | VEC3 | float | 否(若使用 2、3 阶则为是) |
| 球谐 2 阶 | KHR_gaussian_splatting:SH_DEGREE_2_COEF_[0-4] | VEC3 | float | 否(若使用 3 阶则为是) |
| 球谐 3 阶 | KHR_gaussian_splatting:SH_DEGREE_3_COEF_[0-6] | VEC3 | float | 否 |
各属性的语义说明:
- 均值向量(mean):由基元的
POSITION提供,定义高斯泼溅椭球在局部空间的中心。高斯泼溅的有效全局均值向量由POSITION属性值与实例化该 mesh 的 glTF 节点的全局变换矩阵(按 glTF 规范定义)共同推导得出。 - 缩放(SCALE):属性值对应高斯沿其局部主轴的散布范围。缩放值是线性的,且 MUST 不为负。
- 旋转(ROTATION):属性值对应那些轴在局部空间中的朝向,以单位四元数按常规 glTF 顺序存储。
[!NOTE] 这保证了渲染器可以直接使用四元数值而无需重新归一化。
- 有效协方差矩阵:由
ROTATION、SCALE属性与实例化 mesh 的 glTF 节点的有效变换矩阵推导得出(推导公式见下文 Splat 重建)。 - 不透明度(OPACITY):存储归一化的线性值,范围 $[0.0, 1.0]$,0.0 表示透明、1.0 表示不透明。超出范围的值无效。
[!NOTE] 训练过程中应用的 sigmoid 激活函数可确保该值保持在有效范围内,从而保证渲染器可以直接使用存储的不透明度进行 alpha 混合,无需任何额外处理。
球谐属性
KHR_gaussian_splatting:SH_DEGREE_0_COEF_0属性语义提供球谐的漫反射分量系数。0 阶球谐系数始终必填。KHR_gaussian_splatting:SH_DEGREE_l_COEF_n($l > 0$)保存更高阶球谐数据;使用更高阶球谐时,所有更低阶 MUST 同时定义。
每递增一个球谐阶数都需要更多系数:1 阶需要 3 组系数,2 阶增加到 5 组,3 阶增加到 7 组。三阶全部使用共需45 个球谐系数,存储于SH_DEGREE_l_COEF_n属性中。
属性按每阶从最低阶数 $m$ 到最高阶数打包。例如:SH_DEGREE_1_COEF_0提供 $m = -1$ 系数,SH_DEGREE_1_COEF_1提供 $m = 0$ 系数,SH_DEGREE_1_COEF_2提供 $m = 1$ 系数。
每个系数包含三个值,分别对应球谐的红、绿、蓝通道。球谐阶数不允许部分定义:即某一阶及其所有更低阶的系数要么全部定义,要么全部不定义。
Ellipse 内核渲染流程
要渲染一个 3D 高斯泼溅场,渲染器使用与训练时相同的**前向传播算法(forward pass)**重建每个高斯泼溅,将其投影到 2D 平面,计算颜色,再与其他泼溅合成。
本内核假设正确的渲染采用3σ 截断(Mahalanobis 距离 3 个单位)。
[!NOTE] 这正是原始论文 "3D Gaussian Splatting for Real-Time Radiance Field Rendering" 所使用的形状。本扩展的渲染模型与之保持一致。
Splat 重建
每个高斯泼溅表示一个 3D 高斯,由如下方程定义:
G(x) = \exp\left(-\frac{1}{2}(x-\mu)^T \Sigma^{-1} (x-\mu)\right)其中:
- $G(x)$ 是位置 $x$ 处的高斯值。
- $x$ 是 3D 位置向量。
- $\mu$ 是均值向量,表示高斯的中心。
- $\Sigma$ 是 3x3 协方差矩阵,定义高斯的大小、形状与朝向。
第一步:将泼溅的缩放与旋转属性,结合包含该泼溅基元的 glTF 节点的全局变换矩阵,合成 3x3 协方差矩阵。
3x3 的 3D 协方差矩阵 $\Sigma$ 按如下方式构造:
\Sigma = \mathbf{M}\mathbf{C}\mathbf{C}^T\mathbf{M}^T其中:
- $\mathbf{M}$ 是节点全局变换矩阵的 3x3 左上子矩阵;
- $\mathbf{C}$ 是由泼溅的缩放与旋转属性组成的 3x3 矩阵,定义如下($s_x, s_y, s_z$ 为三个缩放分量,$q_w, q_x, q_y, q_z$ 为四元数分量):
\mathbf{C} = \begin{pmatrix} s_x (1 - 2(q_y^2 + q_z^2)) & s_y (2(q_x q_y - q_w q_z)) & s_z (2(q_x q_z + q_w q_y)) \\ s_x (2(q_x q_y + q_w q_z)) & s_y (1 - 2(q_x^2 + q_z^2)) & s_z (2(q_y q_z - q_w q_x)) \\ s_x (2(q_x q_z - q_w q_y)) & s_y (2(q_y q_z + q_w q_x)) & s_z (1 - 2(q_x^2 + q_y^2)) \end{pmatrix}Splat 投影
第二步:基于相机的透视变换,将每个泼溅投影到 2D 内核形状上。这包括投影泼溅的均值向量(使用常规透视投影数学)并将 3D 协方差矩阵 $\Sigma$ 变换为图像平面上的 2D 协方差矩阵 $\Sigma'$,该矩阵表示高斯在图像平面上的形状。协方差矩阵变换采用仿射近似(affine approximation):
\Sigma' = \mathbf{J}\mathbf{W}\Sigma\mathbf{W}^T\mathbf{J}^T其中:
- $\mathbf{W}$ 是执行从全局空间到相机空间的视相关变换的 3x3 矩阵;通常是相机视图变换的 3x3 左上子矩阵。
- $\mathbf{J}$ 是透视投影变换函数(含透视除法)的雅可比矩阵(Jacobian matrix);该矩阵通常包含相机的焦距,以及泼溅的 3D 均值向量经相机视图变换矩阵(旋转与平移)变换后的结果。
[!NOTE] 由于视图矩阵与透视投影矩阵的构造细节是**实现特定(implementation-specific)**的,本规范不提供 $\mathbf{W}$ 与 $\mathbf{J}$ 的形式化定义。
Splat 光照
每个泼溅的颜色由其球谐系数与归一化视线方向(全局空间中从相机位置指向泼溅均值的向量)计算得出,详见下文 光照模型与球谐颜色计算。
- 出于性能考虑,实现方 MAY 忽略高阶系数。
- 球谐系数 SHOULD 经实例化该 mesh 的 glTF 节点的全局变换矩阵的旋转分量进行变换。
[!NOTE] 该变换通常使用 Wigner-D 矩阵完成。
Splat 合成
在上述步骤之后,泼溅被排序并进行 alpha 混合以生成最终图像。alpha 混合是顺序相关的(order-dependent),因此正确的排序对准确渲染至关重要。
排序基于相机位置与泼溅全局空间均值向量之间的距离,按该深度值**从后到前(back-to-front)排序,通常使用基数排序(radix sort)**以保证性能(排序方法详见上文 sortingMethod)。
排序完成后,每个像素的最终颜色通过在排序顺序上对泼溅进行 alpha 混合计算,混合方程定义为:
C = \sum_{i \in \mathscr{N}} c_i \alpha_i \prod_{j=1}^{i-1} (1 - \alpha_j)其中:
- $C$ 是像素的最终颜色。该值 MUST 以实现特定的方式被钳制(clamp)或色调映射(tonemap),以适配泼溅的色彩空间。
- $\mathscr{N}$ 是对该像素有贡献的泼溅集合。
- $c_i$ 是第 $i$ 个高斯的颜色。除非其他扩展另行规定,负的 $c_i$ 值 MUST 被钳制为零。
- $\alpha_i = \alpha \cdot G(x)$,其中 $G(x)$ 是投影后 2D 高斯的概率密度函数在像素中心 $x$ 处的值,$\alpha$ 是泼溅的不透明度属性值。
- $\prod_{j=1}^{i-1} (1 - \alpha_j)$ 是累计透射率(accumulated transmittance)。
[!NOTE] 在光栅化器实现中,透射率通常由 GPU 的混合硬件处理。
由于泼溅合成中间结果并未显式限制在任何范围内,混合应使用浮点颜色缓冲格式执行——这更贴近原始论文的设计。
当因性能或内存原因改用归一化颜色缓冲格式时,应使用预乘 alpha(alpha-premultiplied)值进行混合:将 $c_i \alpha_i$ 乘积传给混合单元,并将源混合因子设为 1。这种方式虽然仍有损,但相比分别传递颜色与 alpha 值,能减少范围钳制。
若使用无符号归一化(unsigned normalized)颜色缓冲,$c_i < 0$ 与 $C > 1$ 的钳制会自动发生。
光照模型与球谐颜色计算
本扩展通过**实球谐(real spherical harmonics)**定义 3D 高斯泼溅光照。对应属性为每个泼溅存储球谐系数。0 阶球谐系数始终必填,更高阶可选。每个颜色通道有独立的系数,因此对于每一阶 $l$,有 $(2l + 1)$ 个系数,每个系数包含对红、绿、蓝颜色分量的贡献。
这些规则 MAY 被未来定义替代光照方法的扩展放宽,或由对压缩有特定需求的扩展放宽(例如压缩方法将漫反射颜色分量存储为线性颜色值而非 0 阶系数时)。
图像状态与重光照
**图像状态(image state)**由 ISO 22028-1:2016 定义,指示图像数据的渲染状态:
- 显示参考(display-referred)(ISO 22028-1:2016 中亦称 output-referred)图像状态:数据已进行了适合显示的色彩渲染。
- **场景参考(scene-referred)**图像状态:数据表示场景的实际辐射度。
本规范定义的 Ellipse 内核在训练与渲染中使用显示参考图像状态,这与 KHR_materials_unlit 扩展描述的材质模型类似,即glTF 场景光照、曝光设置与色调映射通常不影响渲染出的泼溅。
尽管如此,实现方仍可对泼溅进行重光照(relight),例如模拟阴影或附加光源,或为与训练环境不同的环境调整渲染结果。这自然可能导致与原始结果存在视觉差异。
从球谐计算颜色
颜色与镜面反射使用带Condon–Shortley 相位的实球谐计算。3D 高斯泼溅最多可使用 45 个球谐系数,每个系数被拆分为 3 个颜色通道,因此每一阶的系数总数为:
SH_{n} \times 3 = SH_{total}其中 $SH_{n}$ 表示第 $n$ 阶的系数个数:0 阶 3 个、1 阶 9 个、2 阶 15 个、3 阶 21 个。
泼溅的漫反射颜色可由 0 阶实球谐的 RGB 系数乘以归一化常数 $\approx0.282095$ 计算。该常数源自 0 阶 0 次实球谐的公式:
Y_{0,0}(θ, φ) = \frac{1}{2} \sqrt{\frac{1}{π}} ≈ 0.282095为使球谐保持在 $[0, 1]$ 范围内,训练过程的前向传播会对球谐的 0 阶分量施加0.5 偏置(bias);渲染过程在从球谐重建颜色时也应用该偏置。这使训练能够围绕 0 进行,保证球谐的数值稳定性,同时让系数保持在便于渲染的有效范围内。
因此,仅使用 0 阶分量计算漫反射 RGB 颜色的公式为:
Color_{diffuse} = SH_{0,0} * 0.2820947917738781 + 0.5其中 $SH_{0,0}$ 表示 0 阶实球谐的 RGB 系数向量。
Condon–Shortley 相位是某些球谐定义中包含的 $(-1)^m$ 符号因子,用于保持其代数与归一化性质的一致性。该约定确保球谐正交且在旋转下行为良好。按此定义,奇数阶数($m$)被取负,因此 2 阶与 3 阶的部分常数带负号。
更高阶球谐用于计算更复杂的光照效果(如环境光遮蔽与镜面高光):基于表面法线与光线方向在合适角度处求值球谐。例如,1 阶函数为:
\begin{aligned} Y_{1,-1}(θ, φ) &= -\sqrt{\frac{3}{4\pi}} \cdot \frac{y}{r}\\ Y_{1,0}(θ, φ) &= \sqrt{\frac{3}{4\pi}} \cdot \frac{z}{r}\\ Y_{1,1}(θ, φ) &= -\sqrt{\frac{3}{4\pi}} \cdot \frac{x}{r}\\ \end{aligned}所有球谐函数与常量(含 Condon–Shortley 相位)的完整列表见 附录 A:球谐参考。
上述函数中,$r$ 表示位置向量的大小,$r = \sqrt{x^2 + y^2 + z^2}$。在 3D 高斯泼溅中,归一化确保方向向量为单位向量,因此在光照计算中对球谐求值时 $r$ 等于 $1$。
将各阶函数与 0 阶分量结合,即可计算高斯完整颜色:
\begin{aligned} Color_{SH_{0}} =\,&SH_{0,0} \cdot 0.2820947917738781\\\\ Color_{SH_{1}} =\,&SH_{1,-1} \cdot y \cdot -0.4886025119029199\,+\\ &SH_{1,0} \cdot z \cdot 0.4886025119029199\,+\\ &SH_{1,1} \cdot x \cdot -0.4886025119029199\\\\ Color_{SH_{2}} =\,&SH_{2,-2} \cdot xy \cdot 1.092548430592079\,+\\ &SH_{2,-1} \cdot yz \cdot -1.092548430592079\,+\\ &SH_{2,0} \cdot (2z^2 - x^2 - y^2) \cdot 0.3153915652525200\,+\\ &SH_{2,1} \cdot xz \cdot -1.092548430592079\,+\\ &SH_{2,2} \cdot (x^2 - y^2) \cdot 0.5462742152960395\\\\ Color_{SH_{3}} =\,&SH_{3,-3} \cdot y(3x^2 - y^2) \cdot -0.5900435899266435\,+\\ &SH_{3,-2} \cdot xyz \cdot 2.890611442640554\,+\\ &SH_{3,-1} \cdot y(4z^2 - x^2 - y^2) \cdot -0.4570457994644657\,+\\ &SH_{3,0} \cdot z(2z^2 - 3x^2 - 3y^2) \cdot 0.3731763325901154\,+\\ &SH_{3,1} \cdot x(4z^2 - x^2 - y^2) \cdot -0.4570457994644657\,+\\ &SH_{3,2} \cdot z(x^2 - y^2) \cdot 1.445305721320277\,+\\ &SH_{3,3} \cdot x(x^2 - 3y^2) \cdot -0.5900435899266435\\\\ Color_{final} =\,&Color_{SH_{0}} + Color_{SH_{1}} + Color_{SH_{2}} + Color_{SH_{3}} + 0.5 \end{aligned}其中 $SH_{l,m}$ 表示特定阶($l$)与次($m$)的 RGB 球谐系数,$x$、$y$、$z$ 表示方向向量的独立分量。
- 0 阶球谐始终必填,以确保漫反射颜色可被准确重建;更高阶球谐可选。
- 若使用更高阶球谐,则必须同时提供更低阶球谐。
- 每一阶球谐 MUST 被完整定义,不允许部分定义。
- 扩展本扩展的扩展 MAY 定义替代光照方法、对压缩处理提出特定要求,或定义不同的球谐处理方式。
[!NOTE] 对于训练软件与导出器,当目标是 glTF 时,建议在glTF 坐标系内训练高斯(可参考基础 glTF 2.0 规范的"坐标系与单位"章节,见 规范目录)。否则,当把其他坐标系中预训练的数据转换到 glTF 坐标系时,位置、四元数与球谐在加载时都必须被旋转。
glTF JSON 示例
以下是一个部分 glTF JSON 示例,包含可选属性与属性(attribute):
{ "meshes": [{ "primitives": [{ "attributes": { "POSITION": 0, "COLOR_0": 1, "KHR_gaussian_splatting:SCALE": 2, "KHR_gaussian_splatting:ROTATION": 3, "KHR_gaussian_splatting:OPACITY": 4, "KHR_gaussian_splatting:SH_DEGREE_0_COEF_0": 5, "KHR_gaussian_splatting:SH_DEGREE_1_COEF_0": 6, "KHR_gaussian_splatting:SH_DEGREE_1_COEF_1": 7, "KHR_gaussian_splatting:SH_DEGREE_1_COEF_2": 8 }, "mode": 0, "extensions": { "KHR_gaussian_splatting": { "kernel": "ellipse", "colorSpace": "srgb_rec709_display", "sortingMethod": "cameraDistance", "projection": "perspective" } } }] }] }要点说明:
mode: 0对应POINTS,是 Ellipse 内核的强制要求。attributes中的键即上文 属性定义 中的语义名,值为对应 accessor 的索引(本例还通过COLOR_0提供了回退用漫反射颜色,见下文)。- 扩展对象同时给出了必填的
kernel、colorSpace与可选的sortingMethod、projection(此处显式写出默认值,也可省略后两项)。
回退行为
为支持回退功能,基础 glTF 规范的COLOR_0属性语义 MAY 被用来提供 3D 高斯泼溅的漫反射颜色,使渲染器在不支持 3D 高斯泼溅时能为稀疏点云中的点着色。COLOR_0的值通过将 3D 高斯泼溅的 3 个漫反射颜色分量与 0 阶球谐常数($l = 0$)相乘得出;其 alpha 通道 SHOULD 包含泼溅的不透明度。
[!NOTE] 若色彩空间为
"srgb_rec709_display"或"lin_rec709_display",适用于COLOR_0回退的 Ellipse 内核漫反射颜色可从KHR_gaussian_splatting:SH_DEGREE_0_COEF_0属性计算得到:将每个 RGB 分量乘以球谐常数值0.282095,加上0.5,并将和钳制到 $[0, 1]$ 范围;若色彩空间为"srgb_rec709_display",还需将钳制后的值从 sRGB 解码为线性,因为按 glTF 规范COLOR_0属性包含的是线性值。
扩展基础扩展
3D 高斯泼溅是一项不断演进的技术,新方法与技术层出不穷。为在 glTF 中为 3D 高斯泼溅提供稳固基础,同时允许未来成长与创新,本扩展被设计为可扩展(extensible):新的内核类型、色彩空间、投影方法与排序方法可随时间添加,而无需修改基础扩展。
扩展编写规则:
- 扩展 MAY 按需定义附加属性或自定义属性;属性语义 SHOULD 以其扩展名前缀开头以避免命名冲突。
- 扩展 MAY 为
kernel、colorSpace、projection、sortingMethod定义新取值。 - 自定义属性 SHOULD 被包含在新扩展对象的**主体(body)**中。
[!NOTE] 两个属性可通过引用相同的 accessor 索引共享数据,这可用于优化数据存储。
- 对 3D 高斯泼溅数据做压缩的扩展 SHOULD 扩展本基础扩展以保证兼容;压缩扩展 SHOULD 定义数据如何解码回本扩展定义的基础 3D 高斯泼溅格式,但 MAY 也允许针对其压缩方法的优化(例如直接将纹理或其他数据传给 GPU 解码)。
- 要使用扩展
KHR_gaussian_splatting的扩展,该扩展 MUST 被包含在KHR_gaussian_splatting扩展对象的extensions属性中,且新扩展 MUST 被列入 glTF 顶层的extensionsUsed。 - 鼓励扩展作者为不认识新扩展的渲染器定义回退行为(非强制);若无法回退,新扩展 SHOULD 同时列入
extensionsRequired,以确保不支持该扩展的渲染器不会错误渲染数据。
从 Schema 源码 可以印证:Schema 本身保留了"extensions": {}与"extras": {}字段以承接嵌套扩展对象,anyOf分支中的兜底"type": "string"为新增取值开放了通道。
示例:添加新的内核类型
本小节为非规范(non-normative)说明。
要添加新的内核类型,应定义一个扩展KHR_gaussian_splatting的新扩展,由新扩展定义新内核类型及其所需参数。识别新内核类型的渲染器即可使用新扩展中的参数正确渲染泼溅;不识别新内核类型的渲染器应回退到默认的ellipse类型。
例如,可定义一个扩展EXT_gaussian_splatting_kernel_customShape,添加带额外参数的新内核类型customShape:
"meshes": [{ "primitives": [{ // ...此处省略... "extensions": { "KHR_gaussian_splatting": { "kernel": "customShape", "extensions": { "EXT_gaussian_splatting_kernel_customShape": { "customParameter1": 1.0, "customParameter2": [0.0, 1.0, 0.0] } } }, } }] }]若新内核类型需要附加属性,这些属性应在新扩展中定义并使用唯一语义名以避免冲突:
"meshes": [{ "primitives": [{ "attributes": { "POSITION": 0, "KHR_gaussian_splatting:SCALE": 1, "KHR_gaussian_splatting:ROTATION": 2, "EXT_gaussian_splatting_kernel_customShape:CUSTOM_ATTRIBUTE": 3 }, // ...此处省略... "extensions": { "KHR_gaussian_splatting": { "kernel": "customShape", "extensions": { "EXT_gaussian_splatting_kernel_customShape": { "customParameter1": 1.0 } } } } }] }]新扩展还必须被列入 glTF 顶层的extensionsUsed:
"extensionsUsed" : [ "KHR_gaussian_splatting", "EXT_gaussian_splatting_kernel_customShape" ]附录 A:球谐参考
本附录为非规范内容,仅供参考。
实球谐基函数
0 至 3 阶,笛卡尔坐标表示,包含 Condon–Shortley 相位 $(-1)^m$。
\textbf{Degree 0, l = 0}\\ \begin{aligned} Y_{0,0}(θ, φ) &= \frac{1}{2} \sqrt{\frac{1}{\pi}}\\\\ \end{aligned}\textbf{Degree 1, l = 1}\\ \begin{aligned} Y_{1,-1}(θ, φ) &= -\sqrt{\frac{3}{4\pi}} \cdot \frac{y}{r}\\ Y_{1,0}(θ, φ) &= \sqrt{\frac{3}{4\pi}} \cdot \frac{z}{r}\\ Y_{1,1}(θ, φ) &= -\sqrt{\frac{3}{4\pi}} \cdot \frac{x}{r}\\\\ \end{aligned}\textbf{Degree 2, l = 2}\\ \begin{aligned} Y_{2,-2}(θ, φ) &= \frac{1}{2} \sqrt{\frac{15}{\pi}} \cdot \frac{xy}{r^2}\\ Y_{2,-1}(θ, φ) &= -\frac{1}{2} \sqrt{\frac{15}{\pi}} \cdot -\frac{yz}{r^2}\\ Y_{2,0}(θ, φ) &= \frac{1}{4} \sqrt{\frac{5}{\pi}} \cdot \frac{3z^2 - r^2}{r^2}\\ Y_{2,1}(θ, φ) &= -\frac{1}{2} \sqrt{\frac{15}{\pi}} \cdot -\frac{xz}{r^2}\\ Y_{2,2}(θ, φ) &= \frac{1}{4} \sqrt{\frac{15}{\pi}} \cdot \frac{x^2 - y^2}{r^2}\\\\ \end{aligned}\textbf{Degree 3, l = 3}\\ \begin{aligned} Y_{3,-3}(θ, φ) &= -\frac{1}{4} \sqrt{\frac{35}{2\pi}} \cdot \frac{y(3x^2 - y^2)}{r^3}\\ Y_{3,-2}(θ, φ) &= \frac{1}{2} \sqrt{\frac{105}{\pi}} \cdot \frac{xyz}{r^3}\\ Y_{3,-1}(θ, φ) &= -\frac{1}{4} \sqrt{\frac{21}{2\pi}} \cdot \frac{y(5z^2 - r^2)}{r^3}\\ Y_{3,0}(θ, φ) &= \frac{1}{4} \sqrt{\frac{7}{\pi}} \cdot \frac{z(5z^2 - 3r^2)}{r^3}\\ Y_{3,1}(θ, φ) &= -\frac{1}{4} \sqrt{\frac{21}{2\pi}} \cdot \frac{x(5z^2 - r^2)}{r^3}\\ Y_{3,2}(θ, φ) &= \frac{1}{4} \sqrt{\frac{105}{\pi}} \cdot \frac{z(x^2 - y^2)}{r^3}\\ Y_{3,3}(θ, φ) &= -\frac{1}{4} \sqrt{\frac{35}{2\pi}} \cdot \frac{x(x^2 - 3y^2)}{r^3}\\ \end{aligned}常量表
| 用于 | 表达式 | 近似常量 |
|---|---|---|
| $Y_{0,0}(θ, φ)$ | $\frac{1}{2} \sqrt{\frac{1}{\pi}}$ | $0.2820947917738781$ |
| $Y_{1,-1}(θ, φ)$、$Y_{1,1}(θ, φ)$ | $\sqrt{\frac{3}{4\pi}}$ | $-0.4886025119029199$ |
| $Y_{1,0}(θ, φ)$ | $\sqrt{\frac{3}{4\pi}}$ | $0.4886025119029199$ |
| $Y_{2,-2}(θ, φ)$ | $\frac{1}{2} \sqrt{\frac{15}{\pi}}$ | $1.092548430592079$ |
| $Y_{2,-1}(θ, φ)$、$Y_{2,1}(θ, φ)$ | $-\frac{1}{2} \sqrt{\frac{15}{\pi}}$ | $-1.092548430592079$ |
| $Y_{2,0}(θ, φ)$ | $\frac{1}{4} \sqrt{\frac{5}{\pi}}$ | $0.3153915652525200$ |
| $Y_{2,2}(θ, φ)$ | $\frac{1}{4} \sqrt{\frac{15}{\pi}}$ | $0.5462742152960395$ |
| $Y_{3,-3}(θ, φ)$、$Y_{3,3}(θ, φ)$ | $-\frac{1}{4} \sqrt{\frac{35}{2\pi}}$ | $-0.5900435899266435$ |
| $Y_{3,-2}(θ, φ)$、$Y_{3,2}(θ, φ)$ | $\frac{1}{2} \sqrt{\frac{105}{\pi}}$ | $2.890611442640554$ |
| $Y_{3,-1}(θ, φ)$、$Y_{3,1}(θ, φ)$ | $-\frac{1}{4} \sqrt{\frac{21}{2\pi}}$ | $-0.4570457994644657$ |
| $Y_{3,0}(θ, φ)$ | $\frac{1}{4} \sqrt{\frac{7}{\pi}}$ | $0.3731763325901154$ |
| $Y_{3,2}(θ, φ)$ | $\frac{1}{4} \sqrt{\frac{105}{\pi}}$ | $1.445305721320277$ |
已知实现
本小节为非规范内容,仅供参考。规范文档中列出的已知实现包括:
- CesiumJS(Cesium 官方 JavaScript 引擎)
- Cesium Native(Cesium 原生 C++ 引擎)
- JSplat(Java 实现的泼溅查看器)
- 3dgs_ply2gltf(Huawei 出品的 PLY 格式 3D 高斯泼溅转 glTF 导出工具)
这些实现从渲染器与导出器两侧验证了本扩展的可用性;实现方亦可参考 glTF 2.0 基础规范 与 KHR_materials_unlit 扩展(其图像状态模型与本扩展一致),并对照 Schema 定义 校验自己的资产与实现。
- 图形学
【免费下载链接】glTF
glTF – Runtime 3D Asset Delivery
相关推荐
XV3DGS-UEPlugin:UE5高斯泼溅渲染完整指南
XV3DGS UEPlugin:UE5高斯泼溅渲染完整指南 想要在Unreal Engine 5中实现惊艳的3D重建效果吗?XV3DGS UEPlugin这款高
图形学3D渲染计算机视觉深度学习3D高斯泼溅渲染插件:虚幻引擎5实时渲染技术完全指南
3D高斯泼溅渲染插件:虚幻引擎5实时渲染技术完全指南 想要将普通视频瞬间转化为惊艳的3D场景吗?XV3DGS UEPlugin基于前沿的3D高斯泼溅技术,为你带
图形学3D渲染计算机视觉深度学习Unity高斯泼溅技术完全指南:从零开始掌握实时3D渲染
传统3D渲染技术在处理大规模点云数据时常常面临性能瓶颈和存储压力。Unity Gaussian Splatting项目基于SIGGRAPH 2023的突破性研究
图形学3D渲染
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考