概念页
光线微分与纹理足迹
Ray Differentials & Texture Footprint
光线微分 (ray differentials) 给每条相机光线附带两条在图像上偏移一个像素样本的辅助光线,借此估计交点处 ∂p/∂x、∂p/∂y 和纹理坐标对屏幕坐标的导数,也就是纹理采样率(纹理足迹)。这是离线光线追踪器做纹理抗锯齿的基础;本页对应 PBRT 4e 10.1.1–10.1.3 及其延伸阅读,并对照实时光线追踪中的光线锥。
要解决的问题
纹理抗锯齿要回答两件事:纹理空间的采样率是多少;给定采样率后怎样去掉奈奎斯特极限以上的频率(见 纹理过滤与 Mipmap)。屏幕采样率已知,难的是把它换算到表面上。设 f(x,y) 把图像点映射到表面点,只需要它的偏导:
f(x′,y′)≈f(x,y)+(x′−x)∂x∂f+(y′−y)∂y∂f.
例:正交相机正对单位四边形、图像分辨率 (xr,yr) 时 ∂s/∂x=1/xr、∂t/∂y=1/yr,交叉项为 0。
用切平面估计 ∂p/∂x(10.1.1)
假设表面在采样尺度上局部平坦:取过交点 p、法线为 n 的切平面 ax+by+cz+d=0((a,b,c)=n,d=−n⋅p),把辅助光线 rx、ry 与它求交(射线–平面求交见 直线与平面求交):
t=n⋅d−(n⋅o)−d,∂x∂p≈px−p,∂y∂p≈py−p.
辅助光线正好偏移一个像素样本,所以 Δ=1 不必再除。剪影边缘或高曲率处近似会失效,但很少造成可见误差。
由 ∂p/∂x 解 ∂u/∂x:最小二乘
链式法则 ∂x∂p=∂u∂pdxdu+∂v∂pdxdv 是 3 个方程 2 个未知数的超定系统,用最小二乘 x=(ATA)−1ATb,其中 A=[∂p/∂u∂p/∂v]:
(ATA)−1=∣ATA∣1(∂vp⋅∂vp−∂up⋅∂vp−∂up⋅∂vp∂up⋅∂up),ATb=(∂up⋅∂xp∂vp⋅∂xp).
行列式倒数为无穷时把导数置 0(退化为点采样);结果过大时钳制,防止后续溢出和 NaN。
没有光线微分时(10.1.1)
光源出发的光线(光子映射、双向路径追踪)和漫反射之后的光线没有可靠的微分。pbrt 的 Camera::Approximate_dp_dxy()(Li 2018 的做法)把相机转向交点,用整幅图像上相机光线微分的最小值构造近似辅助光线,再与切平面求交。它宁可低估足迹(混叠,可用更多像素样本缓解)也不高估(模糊);不考虑中间表面的散射。正交相机的最小微分可直接算出,其他相机沿图像对角线采样求最小值。
介质边界与镜面反射/折射(10.1.2–10.1.3)
- 只分隔两种介质、不散射的表面:新光线的辅助光线原点取原辅助光线在交点 t 处的位置,足迹相当于没发生散射。
- Igehy(1999):对镜面反射 ωi=−ωo+2(ωo⋅n)n 求导,
∂x∂ωi=−∂x∂ωo+2((ωo⋅n)∂x∂n+∂x∂(ωo⋅n)n),∂x∂(ωo⋅n)=∂x∂ωo⋅n+ωo⋅∂x∂n,
辅助光线方向取 ωi+∂ωi/∂x,原点取 p+∂p/∂x;∂n/∂x 由链式法则从 ∂n/∂u、∂n/∂v 得到。
- 折射写成 ωi=−ωo/η+μn,μ=(ωo⋅n)/η−cosθi(n 翻到 ωo 一侧),对 Snell 关系平方再求导得
∂x∂μ=∂x∂(ωo⋅n)(η1+η21ωi⋅nωo⋅n).
自行核对符号:n 与 ωo 同侧时 ωi⋅n=−cosθi<0,由 ∂cosθi/∂x=η2cosθi(ωo⋅n)∂x∂(ωo⋅n) 代入正好得到书中的加号,式子正确。
- 多次镜面反弹后微分可能发散;任一微分长度平方超过 1016 时 pbrt 丢弃微分。
- 镜面以外(光泽、漫反射)的散射没有明确定义的微分,下一个交点改用
Approximate_dp_dxy()。Suykens 与 Willems(2001)的路径微分把思路推广到光泽反射,Belcour 等(2017)用傅里叶分析追踪足迹。
存储代价与实时替代
光线微分要额外存 12 个浮点数(两条辅助光线的原点和方向),CPU 上无所谓,GPU 上会显著增加存储和带宽。Akenine-Möller 等(2019,Ray Tracing Gems)提出更省空间的光线锥 (ray cones) 等方案,后续改进见 Akenine-Möller 等 2021 与 Boksansky 等 2021(折射光线锥)。早期的面积型光线方法还有 Amanatides 1984 的锥追踪、Heckbert–Hanrahan 1984 的束追踪、Shinya 等 1987 的笔形追踪;Elek 等 2014 把微分扩展到波长维(光谱渲染)。
取舍
| 方法 | 精度 | 存储 | 适用 |
|---|
| 光线微分(Igehy) | 镜面链上准确 | 每条光线 +12 float | 离线 CPU 渲染器 |
相机近似(Approximate_dp_dxy) | 忽略中间散射,偏小 | 无 | 光源路径、漫反射后的光线 |
| 光线锥 | 各向同性近似 | 每条光线 +2 float 左右 | GPU 实时光线追踪的 mip 选择 |
| 光栅化的屏幕空间导数(ddx/ddy) | 2×2 像素四元组的有限差分 | 硬件免费 | 只适用于主可见性 |