可微渲染是逆向渲染的计算基础,它使得我们能够通过梯度下降优化场景参数。本章深入探讨如何使渲染过程可微,特别是处理可见性不连续性带来的挑战。我们将从可微光线追踪的基础开始,逐步深入到边缘采样、软阴影等高级主题,并讨论实际实现中的偏差-方差权衡。
渲染本质上是求解积分方程,但当我们需要对场景参数(几何、材质、光照)求导时,传统渲染算法面临根本性挑战。考虑像素强度的一般形式:
\[I(\boldsymbol{\theta}) = \int_{\Omega} f(\boldsymbol{x}, \boldsymbol{\theta}) \, d\boldsymbol{x}\]其中 $\boldsymbol{\theta} \in \mathbb{R}^n$ 是场景参数,$\Omega$ 是积分域(如光线空间、路径空间),$f$ 是被积函数。可微渲染的核心问题是计算梯度 $\nabla_{\theta} I = \frac{\partial I}{\partial \boldsymbol{\theta}}$。
从测度论的角度,渲染积分可以更严格地表述为:
\[I(\boldsymbol{\theta}) = \int_{\mathcal{M}} L(\boldsymbol{x}, \boldsymbol{\omega}; \boldsymbol{\theta}) \, d\mu(\boldsymbol{x}, \boldsymbol{\omega})\]其中 $\mathcal{M}$ 是相空间流形,$\mu$ 是其上的测度。当参数 $\boldsymbol{\theta}$ 变化时,不仅被积函数 $L$ 变化,测度 $\mu$ 和积分域 $\mathcal{M}$ 本身也可能变化,这导致了可微性的根本挑战。
从更一般的角度,渲染可以视为一个映射:
\[\mathcal{R}: \Theta \times \mathcal{S} \rightarrow \mathcal{I}\]其中 $\Theta$ 是参数空间,$\mathcal{S}$ 是场景描述空间,$\mathcal{I}$ 是图像空间。可微渲染要求这个映射关于 $\theta$ 是可微的,即存在 Fréchet 导数:
\[\lim_{\|\delta\theta\| \to 0} \frac{\|\mathcal{R}(\theta + \delta\theta) - \mathcal{R}(\theta) - D\mathcal{R}(\theta)[\delta\theta]\|}{\|\delta\theta\|} = 0\]分层积分表述
在实际渲染中,积分通常具有分层结构。例如,考虑直接光照和间接光照的分解:
\[I = I_{\text{direct}} + I_{\text{indirect}} = \int_{\mathcal{V}} \int_{\Omega} L_e V(\boldsymbol{x}, \boldsymbol{y}) G(\boldsymbol{x}, \boldsymbol{y}) \, d\omega_y d\boldsymbol{x} + \int_{\mathcal{P}_k} f_k(\bar{\boldsymbol{x}}) \, d\mu_k\]其中 $\mathcal{V}$ 是可见表面,$\mathcal{P}_k$ 是长度为 $k$ 的路径空间。这种分层结构允许我们对不同类型的光传输应用不同的微分策略。
主要挑战来自三个层面:
对于参数依赖的积分域,广义 Leibniz 积分规则给出:
\[\frac{\partial}{\partial \theta} \int_{\Omega(\theta)} f(x, \theta) \, dx = \int_{\Omega(\theta)} \frac{\partial f}{\partial \theta} \, dx + \int_{\partial \Omega(\theta)} f \cdot v_n \, ds\]其中 $v_n = \frac{\partial \boldsymbol{x}_{\text{boundary}}}{\partial \theta} \cdot \boldsymbol{n}$ 是边界的法向速度。第二项(边界项)在渲染中对应物体轮廓、阴影边界等几何不连续处的贡献。
分布理论的严格处理
更精确地,使用分布理论,可见性函数 $V$ 的导数包含 Dirac delta:
\[\frac{\partial V}{\partial \theta} = \sum_{i \in \text{silhouettes}} \delta(\boldsymbol{x} - \boldsymbol{x}_i(\theta)) \cdot v_{\perp,i}\]这解释了为什么朴素的点采样方法会遗漏边缘梯度——采样到零测集的概率为零。
从 Sobolev 空间的角度,可见性函数 $V \in L^{\infty}(\Omega)$ 但 $V \notin W^{1,p}(\Omega)$ 对任意 $p \geq 1$,即 $V$ 不属于任何 Sobolev 空间。这导致标准的微分算子不适用,必须在弱意义或分布意义下理解导数。
高维积分的维度诅咒
对于长度为 $k$ 的光路,相空间维度为 $d = 3k$(忽略方向的约束)。梯度的 Hessian 矩阵规模为 $\mathcal{O}(d^2)$,导致:
这促使我们寻找低秩近似或稀疏表示方法。
可微渲染的数学基础建立在以下框架上:
1. 路径积分表述
渲染方程的路径空间形式:
\[I_j = \int_{\mathcal{P}} f_j(\bar{x}) d\mu(\bar{x})\]其中 $\bar{x} = (\boldsymbol{x}_0, \boldsymbol{x}_1, …, \boldsymbol{x}_k)$ 是长度为 $k$ 的路径,$\mu$ 是路径测度。梯度计算需要:
\[\nabla_\theta I_j = \int_{\mathcal{P}} \nabla_\theta f_j(\bar{x}) d\mu(\bar{x}) + \int_{\mathcal{P}} f_j(\bar{x}) \nabla_\theta \log p(\bar{x}|\theta) d\mu(\bar{x})\]第二项来自测度的参数依赖性(重参数化梯度)。
路径测度的具体形式为: \(d\mu(\bar{x}) = dA(\boldsymbol{x}_0) \prod_{i=1}^{k-1} G(\boldsymbol{x}_i, \boldsymbol{x}_{i+1}) dA(\boldsymbol{x}_i)\)
| 其中 $G(\boldsymbol{x}, \boldsymbol{y}) = \frac{V(\boldsymbol{x}, \boldsymbol{y}) | \cos\theta_x | \cos\theta_y | }{ | \boldsymbol{x} - \boldsymbol{y} | ^2}$ 是几何项。当几何参数变化时,$G$ 和 $V$ 都会变化,导致复杂的梯度表达式。 |
2. 伴随方法
对于复杂系统,伴随方法提供高效的梯度计算。定义拉格朗日量:
\[\mathcal{L} = I(u, \theta) + \langle \lambda, G(u, \theta) \rangle\]其中 $G(u, \theta) = 0$ 是约束(如渲染方程),$\lambda$ 是伴随变量。最优性条件给出:
\[\frac{dI}{d\theta} = -\left\langle \lambda, \frac{\partial G}{\partial \theta} \right\rangle\]其中 $\lambda$ 满足伴随方程:$(\partial G/\partial u)^T \lambda = -\partial I/\partial u$。
在渲染中,$u = L(\boldsymbol{x}, \boldsymbol{\omega})$ 是辐射度场,约束 $G$ 是渲染方程: \(G(L, \theta) = L - L_e - \mathcal{T}[L] = 0\)
其中 $\mathcal{T}$ 是传输算子。伴随方程变为: \((\mathcal{I} - \mathcal{T}^*)[\lambda] = -\frac{\partial I}{\partial L}\)
这里 $\mathcal{T}^*$ 是 $\mathcal{T}$ 的伴随算子,在物理上对应重要性传输。
3. 变分原理
渲染可以表述为变分问题:
\[I = \min_L \mathcal{F}[L]\]其中 $\mathcal{F}$ 是某个泛函。参数变化引起的一阶变分:
\[\delta I = \int \frac{\delta \mathcal{F}}{\delta L} \delta L \, d\Omega\]这提供了另一种计算梯度的视角。
具体地,对于路径追踪,泛函可以取为: \(\mathcal{F}[L] = \frac{1}{2}\|L - L_e - \mathcal{T}[L]\|^2_{L^2(\mathcal{M})}\)
这导致梯度流方程: \(\frac{\partial L}{\partial t} = -\frac{\delta \mathcal{F}}{\delta L} = (\mathcal{I} - \mathcal{T})^*(\mathcal{I} - \mathcal{T})[L] - (\mathcal{I} - \mathcal{T})^*[L_e]\)
可微渲染在以下领域有重要应用:
| 场景理解:推断光照、材质分解,通常表述为贝叶斯推断 $p(\theta | I) \propto p(I | \theta)p(\theta)$ |
逆问题的正则化
逆渲染本质上是病态的(ill-posed),因为:
为此,我们需要正则化。常用方法包括:
优化景观的特性
可微渲染的损失函数通常具有复杂的优化景观:
这些特性要求专门的优化策略,如自适应学习率、预条件器和多尺度方法。
可微光线追踪是可微渲染的基础。我们需要计算光线-物体交点及相关量对场景参数的导数。这涉及到隐函数定理、微分几何和数值稳定性等核心数学工具。
考虑参数化光线 $\boldsymbol{r}(t) = \boldsymbol{o} + t\boldsymbol{d}$,其中 $\boldsymbol{o} \in \mathbb{R}^3$ 是原点,$\boldsymbol{d} \in \mathbb{S}^2$ 是单位方向。对于隐式表面 $F: \mathbb{R}^3 \times \mathbb{R}^n \rightarrow \mathbb{R}$,其中 $F(\boldsymbol{x}, \boldsymbol{\theta}) = 0$ 定义了表面,交点满足:
\[F(\boldsymbol{o} + t^*\boldsymbol{d}, \boldsymbol{\theta}) = 0\]隐函数定理的应用
假设 $F$ 是 $C^1$ 级且 $\boldsymbol{d} \cdot \nabla_x F \neq 0$(光线不与表面相切),则存在隐函数 $t^*(\boldsymbol{\theta})$ 使得:
\[G(\boldsymbol{\theta}, t) \equiv F(\boldsymbol{o} + t\boldsymbol{d}, \boldsymbol{\theta}) = 0\]对 $\boldsymbol{\theta}$ 求全微分:
\[\frac{\partial G}{\partial \boldsymbol{\theta}} + \frac{\partial G}{\partial t}\frac{\partial t^*}{\partial \boldsymbol{\theta}} = 0\]解得:
\[\frac{\partial t^*}{\partial \boldsymbol{\theta}} = -\frac{\partial F/\partial \boldsymbol{\theta}}{\boldsymbol{d} \cdot \nabla_x F} = -\frac{\partial F/\partial \boldsymbol{\theta}}{\partial F/\partial t}\]几何解释与退化情况
从几何角度,分母 $\boldsymbol{d} \cdot \nabla_x F$ 表示光线方向与表面法线的点积(缩放后)。当此值接近零时:
| 掠射情况:光线几乎平行于表面,$ | \boldsymbol{d} \cdot \nabla_x F | \ll 1$ |
为处理退化,我们引入正则化:
\[\frac{\partial t^*}{\partial \boldsymbol{\theta}} = -\frac{\partial F/\partial \boldsymbol{\theta}}{\boldsymbol{d} \cdot \nabla_x F + \epsilon \|\nabla_x F\|}\]其中 $\epsilon \sim 10^{-6}$ 提供数值稳定性,同时保持物理意义。
交点位置的全导数
交点 $\boldsymbol{x}^* = \boldsymbol{o} + t^*\boldsymbol{d}$ 的导数使用链式法则:
\[\frac{\partial \boldsymbol{x}^*}{\partial \boldsymbol{\theta}} = \frac{\partial t^*}{\partial \boldsymbol{\theta}} \boldsymbol{d} + \frac{\partial \boldsymbol{o}}{\partial \boldsymbol{\theta}} + t^* \frac{\partial \boldsymbol{d}}{\partial \boldsymbol{\theta}}\]对于不同的参数化方式:
高阶导数与曲率效应
二阶导数揭示了曲率对交点的影响:
\[\frac{\partial^2 t^*}{\partial \boldsymbol{\theta}^2} = -\frac{1}{\boldsymbol{d} \cdot \nabla F}\left[\frac{\partial^2 F}{\partial \boldsymbol{\theta}^2} - \frac{\partial t^*}{\partial \boldsymbol{\theta}} \otimes \frac{\partial}{\partial \boldsymbol{\theta}}(\boldsymbol{d} \cdot \nabla F)\right]\]这在优化中用于:
数值稳定性考虑
当 $\boldsymbol{d} \cdot \nabla F \approx 0$(掠射角度)时,导数计算不稳定。实际实现中使用:
\[\frac{\partial t^*}{\partial \boldsymbol{\theta}} = -\frac{\partial F/\partial \boldsymbol{\theta}}{\max(\boldsymbol{d} \cdot \nabla F, \epsilon)}\]其中 $\epsilon \sim 10^{-6}$ 避免除零。
更精细的处理使用自适应正则化: \(\epsilon_{\text{adaptive}} = \epsilon_0 \cdot \max(1, \|\nabla^2 F\| \cdot \Delta t)\)
其中 $\Delta t$ 是光线步长,$|\nabla^2 F|$ 估计局部曲率。
| 表面法线 $\boldsymbol{n} = \nabla F / | \nabla F | $ 的导数涉及归一化操作的微分。 |
直接计算方法
| 设 $\boldsymbol{g} = \nabla_x F$,则 $\boldsymbol{n} = \boldsymbol{g}/ | \boldsymbol{g} | $。使用链式法则: |
整理后:
\[\frac{\partial \boldsymbol{n}}{\partial \boldsymbol{\theta}} = \frac{1}{|\nabla F|}\left(\boldsymbol{I} - \boldsymbol{n} \otimes \boldsymbol{n}\right)\frac{\partial \nabla F}{\partial \boldsymbol{\theta}}\]其中 $(\boldsymbol{I} - \boldsymbol{n} \otimes \boldsymbol{n})$ 是到切平面的投影算子。
几何意义与 Weingarten 映射
法线导数与微分几何中的 Weingarten 映射(形状算子)密切相关。对于参数曲面 $\boldsymbol{x}(u,v)$,Weingarten 映射定义为:
\[\mathcal{W} = -d\boldsymbol{n} = \begin{bmatrix} \frac{\partial \boldsymbol{n}}{\partial u} & \frac{\partial \boldsymbol{n}}{\partial v} \end{bmatrix}\]主曲率 $\kappa_1, \kappa_2$ 是 $\mathcal{W}$ 的特征值。当参数 $\boldsymbol{\theta}$ 改变时,曲率的变化为:
\[\frac{\partial \kappa_i}{\partial \boldsymbol{\theta}} = \boldsymbol{e}_i^T \frac{\partial \mathcal{W}}{\partial \boldsymbol{\theta}} \boldsymbol{e}_i\]其中 $\boldsymbol{e}_i$ 是主方向。这解释了为什么高曲率区域的法线对参数变化更敏感。
Hessian 矩阵的计算
混合偏导数 $\frac{\partial \nabla_x F}{\partial \boldsymbol{\theta}}$ 是一个 $3 \times n$ 矩阵:
\[\left[\frac{\partial \nabla_x F}{\partial \boldsymbol{\theta}}\right]_{ij} = \frac{\partial^2 F}{\partial x_i \partial \theta_j}\]对于特定几何形状:
几何意义
法线导数描述了表面弯曲如何随参数变化。其在切平面内的分量与曲率变化相关:
\[\kappa_{\text{change}} = \boldsymbol{t}^T \frac{\partial \boldsymbol{n}}{\partial \boldsymbol{\theta}}\]其中 $\boldsymbol{t}$ 是切向量,$\kappa_{\text{change}}$ 表示沿 $\boldsymbol{t}$ 方向的曲率变化。
对于参数化表面 $\boldsymbol{x}: \mathbb{R}^2 \times \mathbb{R}^n \rightarrow \mathbb{R}^3$,即 $\boldsymbol{x}(u, v, \boldsymbol{\theta})$,交点满足:
\[\boldsymbol{x}(u^*, v^*, \boldsymbol{\theta}) = \boldsymbol{o} + t^*\boldsymbol{d}\]这给出三个约束方程。
约束系统的微分
定义约束函数 $\boldsymbol{F}: \mathbb{R}^3 \times \mathbb{R}^n \rightarrow \mathbb{R}^3$:
\[\boldsymbol{F}(u, v, t, \boldsymbol{\theta}) = \boldsymbol{x}(u, v, \boldsymbol{\theta}) - \boldsymbol{o} - t\boldsymbol{d} = \boldsymbol{0}\]对 $\boldsymbol{\theta}$ 求全微分:
\[\frac{\partial \boldsymbol{F}}{\partial (u, v, t)} \begin{bmatrix} \frac{\partial u^*}{\partial \boldsymbol{\theta}} \\ \frac{\partial v^*}{\partial \boldsymbol{\theta}} \\ \frac{\partial t^*}{\partial \boldsymbol{\theta}} \end{bmatrix} + \frac{\partial \boldsymbol{F}}{\partial \boldsymbol{\theta}} = \boldsymbol{0}\]Jacobian 矩阵
Jacobian 矩阵为:
\[\boldsymbol{J} = \frac{\partial \boldsymbol{F}}{\partial (u, v, t)} = \begin{bmatrix} \frac{\partial \boldsymbol{x}}{\partial u} & \frac{\partial \boldsymbol{x}}{\partial v} & -\boldsymbol{d} \end{bmatrix}\]这是一个 $3 \times 3$ 矩阵。假设 $\det(\boldsymbol{J}) \neq 0$(非退化情况),则:
\[\begin{bmatrix} \frac{\partial u^*}{\partial \boldsymbol{\theta}} \\ \frac{\partial v^*}{\partial \boldsymbol{\theta}} \\ \frac{\partial t^*}{\partial \boldsymbol{\theta}} \end{bmatrix} = -\boldsymbol{J}^{-1} \frac{\partial \boldsymbol{x}}{\partial \boldsymbol{\theta}}\]特殊情况处理
过参数化: 对于过参数化表面(如 NURBS),使用最小二乘: \(\Delta \boldsymbol{p} = (\boldsymbol{J}^T\boldsymbol{J})^{-1}\boldsymbol{J}^T \Delta \boldsymbol{r}\)
反射方向的微分
反射定律:$\boldsymbol{r} = \boldsymbol{i} - 2(\boldsymbol{i} \cdot \boldsymbol{n})\boldsymbol{n}$,其中 $\boldsymbol{i}$ 是入射方向,$\boldsymbol{n}$ 是法线。
使用乘积法则和链式法则:
\[\frac{\partial \boldsymbol{r}}{\partial \boldsymbol{\theta}} = \frac{\partial \boldsymbol{i}}{\partial \boldsymbol{\theta}} - 2\frac{\partial}{\partial \boldsymbol{\theta}}[(\boldsymbol{i} \cdot \boldsymbol{n})\boldsymbol{n}]\]展开第二项:
\[\frac{\partial}{\partial \boldsymbol{\theta}}[(\boldsymbol{i} \cdot \boldsymbol{n})\boldsymbol{n}] = (\boldsymbol{i} \cdot \boldsymbol{n})\frac{\partial \boldsymbol{n}}{\partial \boldsymbol{\theta}} + \boldsymbol{n} \otimes \frac{\partial}{\partial \boldsymbol{\theta}}(\boldsymbol{i} \cdot \boldsymbol{n})\]其中: \(\frac{\partial}{\partial \boldsymbol{\theta}}(\boldsymbol{i} \cdot \boldsymbol{n}) = \frac{\partial \boldsymbol{i}}{\partial \boldsymbol{\theta}} \cdot \boldsymbol{n} + \boldsymbol{i} \cdot \frac{\partial \boldsymbol{n}}{\partial \boldsymbol{\theta}}\)
折射方向的微分
Snell 定律的向量形式:
\[\boldsymbol{t} = \frac{n_1}{n_2}\boldsymbol{i} + \left(\frac{n_1}{n_2}\cos\theta_i - \cos\theta_t\right)\boldsymbol{n}\]其中 $\cos\theta_t = \sqrt{1 - \left(\frac{n_1}{n_2}\right)^2(1 - \cos^2\theta_i)}$。
对 $\boldsymbol{\theta}$ 求导:
\[\frac{\partial \boldsymbol{t}}{\partial \boldsymbol{\theta}} = \frac{n_1}{n_2}\frac{\partial \boldsymbol{i}}{\partial \boldsymbol{\theta}} + \frac{\partial}{\partial \boldsymbol{\theta}}\left[\left(\frac{n_1}{n_2}\cos\theta_i - \cos\theta_t\right)\boldsymbol{n}\right]\]关键是计算 $\frac{\partial \cos\theta_t}{\partial \boldsymbol{\theta}}$:
\[\frac{\partial \cos\theta_t}{\partial \boldsymbol{\theta}} = \frac{(n_1/n_2)^2\sin\theta_i}{\cos\theta_t}\frac{\partial \cos\theta_i}{\partial \boldsymbol{\theta}}\]全内反射的处理
当 $(n_1/n_2)\sin\theta_i > 1$ 时发生全内反射。在临界角附近,导数变得不稳定。实际实现中:
可见性不连续是可微渲染的核心挑战。当物体移动时,其轮廓边缘导致积分域的变化,产生 Dirac delta 函数形式的梯度。本节深入探讨如何数学上严格处理这些不连续性。
Reynolds 传输定理的应用
考虑依赖于参数 $\theta \in \mathbb{R}$ 的时变积分域 $\Omega(\theta) \subset \mathbb{R}^d$:
\[I(\theta) = \int_{\Omega(\theta)} f(\boldsymbol{x}, \theta) \, d\boldsymbol{x}\]Reynolds 传输定理(也称为 Leibniz-Reynolds 定理)给出:
\[\frac{dI}{d\theta} = \int_{\Omega(\theta)} \frac{\partial f}{\partial \theta} \, d\boldsymbol{x} + \oint_{\partial\Omega(\theta)} f \, v_n \, ds - \int_{\Omega(\theta)} f \, \nabla \cdot \boldsymbol{v} \, d\boldsymbol{x}\]其中:
在渲染中,通常假设被积函数不随位置移动($\nabla \cdot \boldsymbol{v} = 0$),简化为:
\[\frac{dI}{d\theta} = \int_{\Omega(\theta)} \frac{\partial f}{\partial \theta} \, d\boldsymbol{x} + \oint_{\partial\Omega(\theta)} f \, v_n \, ds\]渲染中的具体形式
对于像素积分 $I_p = \int_{\mathcal{A}_p} L(\boldsymbol{x}, \boldsymbol{\omega}) \, dA$,其中 $\mathcal{A}_p$ 是像素覆盖区域:
\[\frac{\partial I_p}{\partial \theta} = \int_{\mathcal{A}_p} \frac{\partial L}{\partial \theta} \, dA + \sum_{e \in \text{edges}} \int_{e \cap \mathcal{A}_p} L \cdot v_{\perp} \, dl\]其中 $v_{\perp}$ 是边缘在图像平面上的垂直速度。
分布理论视角
可见性函数 $V: \mathbb{R}^3 \times \mathbb{R}^3 \rightarrow {0, 1}$ 定义为:
\[V(\boldsymbol{x}, \boldsymbol{y}) = \begin{cases} 1 & \text{如果射线 } \overline{\boldsymbol{xy}} \text{ 无遮挡} \\ 0 & \text{否则} \end{cases}\]在分布意义下,其导数为:
\[\frac{\partial V}{\partial \theta} = \sum_{i \in \mathcal{S}} \delta_{\Gamma_i} \cdot n_i(\theta)\]其中:
几何解释
对于光线 $\boldsymbol{r}(t) = \boldsymbol{x} + t(\boldsymbol{y} - \boldsymbol{x})$ 和遮挡物边缘 $\Gamma(\theta)$,定义:
其中 $\boldsymbol{v}{\Gamma} = \frac{\partial \Gamma}{\partial \theta}$ 是边缘速度,$\boldsymbol{n}{\perp}$ 是垂直于光线的单位向量。
则: \(\frac{\partial V}{\partial \theta} = \delta(d) \cdot v_{\perp} \cdot \|\boldsymbol{y} - \boldsymbol{x}\|^{-1}\)
最后一项来自射线参数化的 Jacobian。
轮廓边缘的检测
对于三角网格,轮廓边缘(silhouette edge)的数学定义为:
\[\mathcal{E}_{\text{sil}} = \{e \in \mathcal{E} : (\boldsymbol{n}_1 \cdot \boldsymbol{v})(\boldsymbol{n}_2 \cdot \boldsymbol{v}) < 0\}\]其中:
对于光滑曲面,轮廓满足: \(\boldsymbol{n}(\boldsymbol{x}) \cdot \boldsymbol{v}(\boldsymbol{x}) = 0\)
边缘的参数化
边缘可以参数化为曲线 $\boldsymbol{\gamma}: [0, 1] \rightarrow \mathbb{R}^3$。在图像平面上的投影为:
\[\boldsymbol{p}(t) = \Pi(\boldsymbol{\gamma}(t))\]其中 $\Pi$ 是投影算子。边缘积分变为:
\[\int_{\text{edge}} f \, ds = \int_0^1 f(\boldsymbol{p}(t)) \left\|\frac{d\boldsymbol{p}}{dt}\right\| dt\]重要性采样
为了高效采样,我们根据边缘对像素的贡献分配样本。定义重要性度量:
\[w(t) = \left\|\frac{d\boldsymbol{p}}{dt}\right\| \cdot |f(\boldsymbol{p}(t))| \cdot K(\boldsymbol{p}(t) - \boldsymbol{p}_{\text{pixel}})\]其中 $K$ 是像素滤波核。采样密度正比于 $w(t)$。
分层采样策略
实际实现中使用分层方法:
重参数化的数学基础
重参数化将不连续的采样决策转换为连续参数。考虑离散选择:
\[I = \sum_{i} \mathbb{1}[\text{condition}_i] \cdot f_i\]重参数化为:
\[I(\theta) = \sum_{i} w_i(\theta) \cdot f_i(\theta)\]其中 $w_i$ 是连续权重函数。
边缘积分的重参数化
对于边缘积分,我们将变化的积分域转换为固定域:
\[\int_{\Gamma(\theta)} f \, ds = \int_0^1 f(\boldsymbol{\gamma}(t, \theta)) \left\|\frac{\partial \boldsymbol{\gamma}}{\partial t}\right\| dt\]关键是找到合适的参数化 $\boldsymbol{\gamma}(t, \theta)$ 使得:
具体重参数化方法
投影重参数化
将 3D 边缘投影到 2D 图像平面: \(\boldsymbol{p}(t, \theta) = \Pi(\boldsymbol{\gamma}(t, \theta))\)
边缘积分变为: \(\int_{\text{edge}} L \, ds = \int_0^1 L(\boldsymbol{p}(t)) J(t, \theta) dt\)
其中 $J$ 是 Jacobian 行列式。
解析积分
对于特定情况,可以解析计算。例如,三角形遮挡的线性边缘:
\[\int_{\text{linear edge}} f_0 + \boldsymbol{g} \cdot \boldsymbol{x} \, ds = f_0 L + \frac{L^2}{2} \boldsymbol{g} \cdot \boldsymbol{t}\]其中 $L$ 是边缘长度,$\boldsymbol{t}$ 是单位切向量。
基于采样的方法
使用重要性采样和控制变量:
\[\nabla_\theta I \approx \frac{1}{N} \sum_{i=1}^N \frac{f(\boldsymbol{x}_i)}{p(\boldsymbol{x}_i)} \nabla_\theta \log p(\boldsymbol{x}_i|\theta)\]这是 REINFORCE 算法在渲染中的应用。
阴影是可见性的特殊情况,涉及光源、遮挡物和接收表面三者的关系。可微阴影计算需要正确处理软阴影的连续变化。本节探讨如何使阴影计算在数学上可微且数值稳定。
硬阴影的可见性函数是二值的:
\[V_{\text{hard}}(\boldsymbol{x}, \boldsymbol{l}) = \begin{cases} 1 & \text{如果光线 } \boldsymbol{x} \to \boldsymbol{l} \text{ 无遮挡} \\ 0 & \text{否则} \end{cases}\]其梯度在阴影边界处包含delta函数。为了可微化,我们使用软化近似:
\[V_{\text{soft}}(\boldsymbol{x}, \boldsymbol{l}) = \sigma\left(\frac{d_{\text{signed}}}{\epsilon}\right)\]其中 $\sigma$ 是sigmoid函数,$d_{\text{signed}}$ 是到阴影边界的带符号距离,$\epsilon$ 控制软化程度。
对于面光源 $A_L$,阴影计算涉及光源上的积分:
\[L_{\text{shadow}}(\boldsymbol{x}) = \int_{A_L} L_e(\boldsymbol{y}) V(\boldsymbol{x}, \boldsymbol{y}) G(\boldsymbol{x}, \boldsymbol{y}) \, dA_{\boldsymbol{y}}\]其中 $G$ 是几何项。梯度计算需要考虑:
总梯度为:
\[\frac{\partial L_{\text{shadow}}}{\partial \theta} = \int_{A_L} L_e \frac{\partial V}{\partial \theta} G \, dA + \oint_{\partial A_V} L_e G v_n \, ds\]其中 $A_V$ 是光源的可见部分,第二项是边缘贡献。
对于球面光源,我们可以解析计算某些边缘积分。考虑半径为 $r$ 的球面光源,从点 $\boldsymbol{x}$ 观察时的立体角为:
\[\Omega = 2\pi\left(1 - \cos\alpha\right)\]其中 $\alpha$ 是半锥角。当球被部分遮挡时,可见立体角的梯度为:
\[\frac{\partial \Omega_{\text{vis}}}{\partial \theta} = \oint_{\mathcal{C}} \sin\phi \, v_{\phi} \, d\phi\]其中 $\mathcal{C}$ 是遮挡轮廓在球面上的投影。
当存在多个遮挡物时,可见性函数变为:
\[V(\boldsymbol{x}, \boldsymbol{y}) = \prod_{i=1}^N V_i(\boldsymbol{x}, \boldsymbol{y})\]使用对数空间避免数值问题:
\[\log V = \sum_{i=1}^N \log V_i\]梯度计算使用链式法则:
\[\frac{\partial V}{\partial \theta} = V \sum_{i=1}^N \frac{1}{V_i} \frac{\partial V_i}{\partial \theta}\]这种形式在 $V_i \approx 0$ 时数值稳定。
可微渲染中的梯度估计器在偏差和方差之间存在基本权衡。理解这种权衡对于设计高效的优化算法至关重要。
理想的梯度估计器满足:
\[\mathbb{E}[\nabla_{\theta} \hat{I}] = \nabla_{\theta} I\]对于连续被积函数,标准蒙特卡洛估计器是无偏的:
\[\nabla_{\theta} I \approx \frac{1}{N} \sum_{i=1}^N \nabla_{\theta} f(\boldsymbol{x}_i, \theta)\]但对于包含可见性的积分,边缘项使得无偏估计器的方差极高:
\[\text{Var}[\nabla_{\theta} \hat{I}] = \mathcal{O}(1/\sqrt{N})\]收敛速度慢,因为需要采样到罕见的边缘事件。
通过引入系统性偏差,我们可以显著降低方差。常见方法包括:
软化可见性: \(V_{\epsilon}(\boldsymbol{x}, \boldsymbol{y}) = \sigma(d/\epsilon)\) 偏差为 $\mathcal{O}(\epsilon)$,方差降低到 $\mathcal{O}(\epsilon^2)$
有限差分: \(\nabla_{\theta} I \approx \frac{I(\theta + h) - I(\theta - h)}{2h}\) 偏差为 $\mathcal{O}(h^2)$,但避免了边缘采样
平滑聚合: \(I_{\text{smooth}} = \int I(\theta') K(\theta - \theta') d\theta'\) 其中 $K$ 是平滑核
控制变量通过引入相关但易计算的辅助函数减少方差:
\[\nabla_{\theta} \hat{I}_{\text{CV}} = \nabla_{\theta} \hat{I} - \beta(\nabla_{\theta} \hat{C} - \nabla_{\theta} C)\]其中 $C$ 是控制变量,$\beta$ 是最优系数:
\[\beta^* = \frac{\text{Cov}[\nabla_{\theta} \hat{I}, \nabla_{\theta} \hat{C}]}{\text{Var}[\nabla_{\theta} \hat{C}]}\]常用控制变量包括:
根据梯度估计的不确定性动态分配样本:
重要性度量: \(w(\boldsymbol{x}) = |\nabla_{\theta} f(\boldsymbol{x})| \cdot \sigma_{\text{local}}(\boldsymbol{x})\)
样本分配: \(N_i \propto \sqrt{w_i \sum_j w_j}\)
早停准则: \(\frac{\sigma[\nabla_{\theta} \hat{I}]}{|\nabla_{\theta} \hat{I}|} < \tau\)
结合多种方法的优点:
\[\nabla_{\theta} I_{\text{hybrid}} = \alpha \nabla_{\theta} I_{\text{edge}} + (1-\alpha) \nabla_{\theta} I_{\text{interior}}\]其中:
现代可微渲染框架提供了不同层次的抽象和优化。我们介绍主要框架的设计理念和使用场景。
Mitsuba 3 是基于 Dr.Jit 的可微渲染器,支持多种后端(CPU、CUDA、LLVM):
核心特性:
梯度计算模式:
典型工作流:参数化场景 → 渲染 → 计算损失 → 反向传播
PyTorch3D 将可微渲染集成到深度学习框架:
光栅化管线:
关键算法: \(I_p = \sum_{k=1}^K w_k(\boldsymbol{p}) C_k \prod_{j=1}^{k-1} (1 - w_j(\boldsymbol{p}))\)
其中 $w_k$ 是软化的覆盖权重。
JAX 提供函数式编程范式的可微渲染:
优势:
典型实现模式:
render_fn = jit(vmap(ray_trace, in_axes=(0, None)))
grad_fn = jit(grad(loss_fn, argnums=1))
可微渲染通过使渲染过程可微,为逆向渲染和场景优化提供了计算基础。关键概念包括:
核心挑战是处理可见性导致的不连续性,解决方案包括边缘积分、重参数化和混合估计器。
练习 12.1:推导球体的光线-表面交点对球心位置的导数。 提示:使用隐函数定理,球体方程为 $|\boldsymbol{x} - \boldsymbol{c}|^2 - r^2 = 0$。
练习 12.2:证明软化可见性函数 $V_\epsilon(d) = \sigma(d/\epsilon)$ 的梯度在 $\epsilon \to 0$ 时收敛到 Dirac delta 函数。 提示:考虑 sigmoid 函数的导数性质。
练习 12.3:计算三角形边缘在图像平面上的投影长度对顶点位置的导数。 提示:使用透视投影公式和链式法则。
练习 12.4:设计一个混合梯度估计器,结合边缘采样和有限差分,证明其收敛性。 提示:考虑不同区域使用不同方法,分析整体误差。
练习 12.5:推导球面光源软阴影的解析梯度公式。 提示:使用立体角和球面几何。
练习 12.6:分析路径追踪中高阶反射的梯度计算复杂度,提出优化策略。 提示:考虑路径长度和梯度传播。
log1p 或裁剪