球面几何与方向参数化
Spherical Geometry & Direction Parameterizations
渲染中大量计算发生在单位球面上:方向就是球面上的点,一组方向就是球面上的一块区域。本页按 PBRT 4e 3.8 节整理立体角、球面多边形面积、三种球面参数化(球坐标、八面体编码、等面积映射)以及用于剔除光源的方向锥,并附原书一处公式问题。
立体角(3.8.1)
平面角是物体投影到单位圆上的弧长(整圆 rad);立体角 (Solid Angle) 是物体投影到单位球面上的面积,单位球面度 (sr),整个球面 sr,半球 sr。微分立体角 就是单位球面上的面积测度,所以对方向积分就是在球面上积分(辐射度量中的用法见 辐射度量学与光度学)。
球面多边形与球面三角形面积(3.8.2)
平面多边形投影到单位球上得到球面多边形:顶点是指向原多边形顶点的单位向量,边是过球心和两顶点的平面与球面相交得到的大圆弧(两点间的球面最短路径)。顶点处的角是两条边所在平面的二面角。球面三角形三个角之和不是 ,而是 ,由 Girard 定理:
直接实现要调用多次反三角函数,还有浮点相消误差。更快更准的是 Van Oosterom & Strackee (1983) 的公式:
本页用随机球面三角形验算:取分子绝对值、结果为负时加 (即用 atan2),与 Girard 公式一致到 。球面四边形面积为 。用途:求面光源(多边形)对一点所张的立体角,见 面光源。
球坐标(3.8.3)
SphericalDirection()接收 而不是 ,因为调用方通常已经有了;SphericalTheta()用SafeACos防止 因舍入略大于 1;SphericalPhi()把atan2的结果调整到 。- 在法线对齐 轴的局部坐标里,;(防止舍入出负数);,,全都不需要反三角函数。BSDF 代码大量依赖这些函数。
- 球坐标就是经纬度 (equirectangular) 映射,两极畸变大,不适合存规则采样的数据(与 环境贴图 中经纬度贴图的缺点一致)。
八面体编码(3.8.3)
Vector3f 存单位向量要 12 字节,而且能表示任意长度,大部分取值浪费;球坐标要三角函数,并且精度集中在两极。OctahedralVector 用 4 字节(两个 16 位整数)存单位向量,精度分布均匀,所有 32 位取值都对应合法单位向量:
- 除以 L1 范数 投影到八面体表面;
- 上半球 () 直接取 ;下半球用 、 把四个三角形翻折到正方形外角,整个过程不需要分支;
- 把 量化为 16 位:。解码反向执行再归一化。
本页按书中代码对 20 万个随机方向编码再解码,最大角误差约 ,平均约 。Meyer 等 (2010) 指出该表示用 52 位时精度与归一化的 Vector3f 相当;方法源自 Praun & Hoppe (2003),pbrt 还采用了 Cigolle 等 (2014) 的改进。实时渲染里同一方法用于 G-buffer 法线和顶点法线压缩,见 顶点压缩与精度;RTR4 给出的八面体环境贴图公式(见 环境贴图)以 为"上"轴、输出 纹理坐标,pbrt 以 为上轴、输出 ,本质相同。
等面积映射(3.8.3)
用于在球面上制表(如环境光的采样分布):连续、畸变较低,且每个存储值代表相同的立体角。它把八面体映射与 Shirley–Chiu 同心圆盘映射的变体结合 (Clarberg 2008):
- 正方形第一扇区(、)映射到圆盘:,,;其余三个扇区类似。
- 圆盘到上半球: 本页数值验证两步都保面积:正方形到圆盘的面积放大率恒为 ,圆盘到半球恒为 2(半球面积 除以圆盘面积 )。
- 扩展到整个球面:先做八面体映射;上半球对内部正方形套用式 3.9(要补偿 旋转);下半球先沿所在象限的对角线镜像,再套映射并把 取负。pbrt 的实现取 把四个象限折到第一象限,用到对角线 的有符号距离求 与上下半球,最后用
copysign恢复 的符号,全程无分支(对 GPU 有利)。WrapEqualAreaSquare()处理双线性插值时略出界的坐标。
方向锥(3.8.4)
DirectionCone 用中心方向 和扩展角的余弦 cosTheta 表示一组方向的包围锥(存余弦是为了用点积代替三角函数);空锥用 cosTheta = ∞ 表示。用途:光源只朝某些方向发光时,可剔除肯定照不到的着色点(第 12 章 BVH 光源采样)。
- 包含测试:
cosTheta。 BoundSubtendedDirections(b, p):先求包围盒的包围球, 在球内则返回整个球面( 可能在球内却在盒外,此时过于保守,习题要求改进);否则中心方向指向球心,,。- 两锥合并: 为扩展角, 为两轴夹角。若 则 已包含 ;否则新扩展角 ( 则返回整个球面),新轴由 绕 旋转 得到;叉积为零(两轴相反)时返回整个球面。不能直接用两轴的平均方向作为新轴,否则需要更大的扩展角。
原书问题
| 位置 | 原书说法 | 核对结果 |
|---|---|---|
| 3.8.4 两锥合并 | 用平均方向作轴"需要扩展角 "(解码在线版 SVG 字形确认绘出的就是 、) | 平均轴与两条原轴各成 ,要包住锥 只需 ,所以应为 。本页对 2000 组随机锥数值验证此式与实际所需角度一致(误差约 )。"它不小于 "的结论不受影响,因为 。来源:https://pbr-book.org/4ed/Geometry_and_Transformations/Spherical_Geometry (3.8.4 节)及本页推导 |
| 式 3.6 | 在线版曾把分子显示为 | 已修正,当前版本为 (pbr-book-website issue #21 已关闭,#17 仍为 open 状态但内容相同) |
取舍
| 参数化 | 优点 | 缺点 | 典型用途 |
|---|---|---|---|
| 球坐标 / 经纬度 | 直观,BSDF 局部坐标中 等很便宜 | 两极畸变、精度不均,转换需三角函数 | 解析推导、BSDF 角度计算 |
| 八面体 | 4 字节、精度均匀、编解码只用加减和符号 | 不保面积,不适合直接计算 | 大量单位向量的存储、法线压缩 |
| 等面积 | 每个纹素立体角相同、连续、低畸变 | 实现较复杂 | 球面函数制表与采样分布 |
出处
- PBRT 4e source excerpt: chapter 03 (Geometry and Transformations)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 3 章 3.8 节,pbr-book.org/4ed/Geometry_and_Transformations