中EN
概念页

光线微分与纹理足迹

Ray Differentials & Texture Footprint

光线微分 (ray differentials) 给每条相机光线附带两条在图像上偏移一个像素样本的辅助光线,借此估计交点处 ∂p/∂x\partial p/\partial x、∂p/∂y\partial p/\partial y 和纹理坐标对屏幕坐标的导数,也就是纹理采样率(纹理足迹)。这是离线光线追踪器做纹理抗锯齿的基础;本页对应 PBRT 4e 10.1.1–10.1.3 及其延伸阅读,并对照实时光线追踪中的光线锥。

要解决的问题

纹理抗锯齿要回答两件事:纹理空间的采样率是多少;给定采样率后怎样去掉奈奎斯特极限以上的频率(见 纹理过滤与 Mipmap)。屏幕采样率已知,难的是把它换算到表面上。设 f(x,y)f(x,y) 把图像点映射到表面点,只需要它的偏导: f(x′,y′)≈f(x,y)+(x′−x)∂f∂x+(y′−y)∂f∂y.f(x',y')\approx f(x,y)+(x'-x)\frac{\partial f}{\partial x}+(y'-y)\frac{\partial f}{\partial y}. 例:正交相机正对单位四边形、图像分辨率 (xr,yr)(x_r,y_r) 时 ∂s/∂x=1/xr\partial s/\partial x=1/x_r、∂t/∂y=1/yr\partial t/\partial y=1/y_r,交叉项为 0。

用切平面估计 ∂p/∂x\partial p/\partial x(10.1.1)

假设表面在采样尺度上局部平坦:取过交点 pp、法线为 nn 的切平面 ax+by+cz+d=0ax+by+cz+d=0((a,b,c)=n(a,b,c)=n,d=−n⋅pd=-n\cdot p),把辅助光线 rxr_x、ryr_y 与它求交(射线–平面求交见 直线与平面求交): t=−(n⋅o)−dn⋅d,∂p∂x≈px−p,∂p∂y≈py−p.t=\frac{-(n\cdot o)-d}{n\cdot\mathbf d},\qquad \frac{\partial p}{\partial x}\approx p_x-p,\quad \frac{\partial p}{\partial y}\approx p_y-p. 辅助光线正好偏移一个像素样本,所以 Δ=1\Delta=1 不必再除。剪影边缘或高曲率处近似会失效,但很少造成可见误差。

由 ∂p/∂x\partial p/\partial x 解 ∂u/∂x\partial u/\partial x:最小二乘

链式法则 ∂p∂x=∂p∂ududx+∂p∂vdvdx\frac{\partial p}{\partial x}=\frac{\partial p}{\partial u}\frac{du}{dx}+\frac{\partial p}{\partial v}\frac{dv}{dx} 是 3 个方程 2 个未知数的超定系统,用最小二乘 x=(ATA)−1ATbx=(A^TA)^{-1}A^Tb,其中 A=[∂p/∂u    ∂p/∂v]A=[\partial p/\partial u\;\;\partial p/\partial v]: (ATA)−1=1∣ATA∣(∂vp⋅∂vp−∂up⋅∂vp−∂up⋅∂vp∂up⋅∂up),ATb=(∂up⋅∂xp∂vp⋅∂xp).(A^TA)^{-1}=\frac{1}{|A^TA|}\begin{pmatrix}\partial_vp\cdot\partial_vp&-\partial_up\cdot\partial_vp\\-\partial_up\cdot\partial_vp&\partial_up\cdot\partial_up\end{pmatrix},\qquad A^Tb=\begin{pmatrix}\partial_up\cdot\partial_xp\\\partial_vp\cdot\partial_xp\end{pmatrix}. 行列式倒数为无穷时把导数置 0(退化为点采样);结果过大时钳制,防止后续溢出和 NaN。

没有光线微分时(10.1.1)

光源出发的光线(光子映射、双向路径追踪)和漫反射之后的光线没有可靠的微分。pbrt 的 Camera::Approximate_dp_dxy()(Li 2018 的做法)把相机转向交点,用整幅图像上相机光线微分的最小值构造近似辅助光线,再与切平面求交。它宁可低估足迹(混叠,可用更多像素样本缓解)也不高估(模糊);不考虑中间表面的散射。正交相机的最小微分可直接算出,其他相机沿图像对角线采样求最小值。

介质边界与镜面反射/折射(10.1.2–10.1.3)

  • 只分隔两种介质、不散射的表面:新光线的辅助光线原点取原辅助光线在交点 tt 处的位置,足迹相当于没发生散射。
  • Igehy(1999):对镜面反射 ωi=−ωo+2(ωo⋅n)n\omega_i=-\omega_o+2(\omega_o\cdot n)n 求导, ∂ωi∂x=−∂ωo∂x+2((ωo⋅n)∂n∂x+∂(ωo⋅n)∂xn),∂(ωo⋅n)∂x=∂ωo∂x⋅n+ωo⋅∂n∂x,\frac{\partial\omega_i}{\partial x}=-\frac{\partial\omega_o}{\partial x}+2\Big((\omega_o\cdot n)\frac{\partial n}{\partial x}+\frac{\partial(\omega_o\cdot n)}{\partial x}n\Big),\quad \frac{\partial(\omega_o\cdot n)}{\partial x}=\frac{\partial\omega_o}{\partial x}\cdot n+\omega_o\cdot\frac{\partial n}{\partial x}, 辅助光线方向取 ωi+∂ωi/∂x\omega_i+\partial\omega_i/\partial x,原点取 p+∂p/∂xp+\partial p/\partial x;∂n/∂x\partial n/\partial x 由链式法则从 ∂n/∂u\partial n/\partial u、∂n/∂v\partial n/\partial v 得到。
  • 折射写成 ωi=−ωo/η+μn\omega_i=-\omega_o/\eta+\mu n,μ=(ωo⋅n)/η−cos⁡θi\mu=(\omega_o\cdot n)/\eta-\cos\theta_i(nn 翻到 ωo\omega_o 一侧),对 Snell 关系平方再求导得 ∂μ∂x=∂(ωo⋅n)∂x(1η+1η2ωo⋅nωi⋅n).\frac{\partial\mu}{\partial x}=\frac{\partial(\omega_o\cdot n)}{\partial x}\Big(\frac1\eta+\frac{1}{\eta^2}\frac{\omega_o\cdot n}{\omega_i\cdot n}\Big). 自行核对符号:nn 与 ωo\omega_o 同侧时 ωi⋅n=−cos⁡θi<0\omega_i\cdot n=-\cos\theta_i<0,由 ∂cos⁡θi/∂x=(ωo⋅n)η2cos⁡θi∂(ωo⋅n)∂x\partial\cos\theta_i/\partial x=\frac{(\omega_o\cdot n)}{\eta^2\cos\theta_i}\frac{\partial(\omega_o\cdot n)}{\partial x} 代入正好得到书中的加号,式子正确。
  • 多次镜面反弹后微分可能发散;任一微分长度平方超过 101610^{16} 时 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 像素四元组的有限差分硬件免费只适用于主可见性
  1. PBRT 4e source excerpt: chapter 10 (Textures and Materials)
  2. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 10 章 10.1 节、延伸阅读,pbr-book.org/4ed/Textures_and_Materials

相关页面

图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学抗锯齿Antialiasing渲染本质上是采样,采样频率不足就会混叠(锯齿、闪烁的"萤火虫"、车轮倒转)。屏幕空间抗锯齿在每个像素取多个样本并加权求和:超采样最直接但最贵,MSAA 每像素只着色一次,时间抗锯齿 (TAA) 把样本分散到多帧,形态学方法 (FXAA/SMAA) 作为后处理重建边缘。没有一种方法在所有方面最好。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。游戏数学直线与平面求交Line & Plane Intersections本页收录 RTR4 第 22.15~22.16 节的基础几何工具:二维直线/光线/线段求交(垂直点积法与无除法的早期拒绝法)、三维直线求交与异面直线最近点,以及三个平面的交点公式(可用于求 k-DOP 等平面围成凸体的角点)。这些在游戏中常用于射线检测、二维几何、碰撞与包围体构建。图形学波前路径追踪Wavefront Path Tracing波前 (wavefront) 架构把路径追踪拆成一串独立的 GPU 内核(生成相机光线、采样、求交、介质采样、逃逸光线、命中发光体、按材质分开的着色、阴影光线、写胶片),内核之间用工作队列传递数据;每个内核开始时线程都在做同一件事,执行是收敛的。代价是每个内核都要从显存读入、再写回全部状态,因此更受带宽限制。pbrt 4e 的 GPU 渲染路径 WavefrontPathIntegrator 就是这种结构,算法与 CPU 上的 VolPathIntegrator 完全相同(见 参与介质与体积散射),只改变计算的组织方式和数据布局。注意术语:这里的"波前"指整批光线按深度推进的处理方式,与 AM

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原