基于物理的渲染 - 表面反射

本文最后更新于:2022年4月4日 上午

双向反射分布函数

考虑一张反射平面,在点 \(\mathbf{p}\) 处来自入射光的辐照度可以表示成 \[ E_i(\mathbf{p})=\int_{H^2} L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i, \]

其中 \(d\Omega_i=\sin\theta_i\: d\theta_i\:d\phi_i\).上式的直观理解是:将遍布半球的入射光分割成来自很多个小圆锥的入射光,其中 \(\boldsymbol{\omega}_i\) 方向上的小圆锥贡献的辐照度为 \(L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i\).将所有小圆锥贡献的辐照度加起来,就得到了来自入射光的总的辐照度 \(E_i(\mathbf{p})\).

上式有时也写作微分形式

\[ dE_i(\mathbf{p},\boldsymbol{\omega}_i)=L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i. \]

如果我们要考虑点 \(\mathbf{p}\) 处沿 \(\boldsymbol{\omega}_o\) 方向出射光的辐射率 \(L_o(\mathbf{p},\boldsymbol{\omega}_o)\),上述分割求和的思想依然可以沿用.假设 \(\boldsymbol{\omega}_i\) 方向上的小圆锥每增加 \(1\) 个单位的辐照度,就能为 \(\boldsymbol{\omega}_o\) 方向的出射光多贡献 \(f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\) 单位的辐射率,那么 \(\boldsymbol{\omega}_i\) 方向上的小圆锥对 \(L_o(\mathbf{p},\boldsymbol{\omega}_o)\) 的贡献就是

\[ f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)dE_i(\mathbf{p},\boldsymbol{\omega}_i)=f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i. \]

将所有小圆锥的贡献累加起来,就得到 \(L_o(\mathbf{p},\boldsymbol{\omega}_o)\) 的表达式

\[ L_o(\mathbf{p},\boldsymbol{\omega}_o)=\int_{H^2}f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)dE_i(\mathbf{p},\boldsymbol{\omega}_i)=\int_{H^2}f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i. \]

上式也可写作对应的微分形式

\[ dL_o(\mathbf{p},\boldsymbol{\omega}_o,\boldsymbol{\omega}_i)=f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)dE_i(\mathbf{p},\boldsymbol{\omega}_i), \]

\[ f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)=\frac{dL_o(\mathbf{p},\boldsymbol{\omega}_o,\boldsymbol{\omega}_i)}{dE_i(\mathbf{p},\boldsymbol{\omega}_i)}. \]

以上导出的函数 \(f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\),被称作** 双向反射分布函数**(bidirectional reflectance distribution function),简称为BRDF.上面推导出的方程

\[ L_o(\mathbf{p},\boldsymbol{\omega}_o)=\int_{H^2}f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i. \]

被称作** 反射方程**.

性质

基于物理的BRDF应该具有以下三条性质: 1. 非负性:\(f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\ge 0\); 2. Helmholtz互异性(Helmholtz reciprocity):\(f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)=f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_i, \boldsymbol{\omega}_o\right)\); 3. 能量守恒: \[ \forall\boldsymbol{\omega}_i,\quad\int_{H^2} f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\cos\theta_o\:d\Omega_o\le 1. \]

计算

处理积分

\[ L_o(\mathbf{p},\boldsymbol{\omega}_o)=\int_{H^2}f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)L_i(\mathbf{p},\boldsymbol{\omega}_i)\cos\theta_i\:d\Omega_i. \]

的常见方式有三种:

  1. 单位半球上的第一类曲面积分,用球坐标进行参数化 \[ L_o(\mathbf{p},\boldsymbol{\omega}_o)=\int_{0}^{2\pi}\:d\varphi_i\int_{0}^{\frac{\pi}{2}}f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i(\theta_i,\varphi_i)\right)L_{i}(\mathbf{p},\boldsymbol{\omega}_i(\theta_i,\varphi_i))\cos\theta_i\sin\theta_i\:d\theta_i. \]

  2. 转化为发光曲面 \(A\) 上的积分 \[ L_o(\mathbf{p},\boldsymbol{\omega}_o)=\int_{A} f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)L_i(\mathbf{p},\boldsymbol{\omega}_i) \cos \theta_{i} \frac{\cos \theta^\prime \mathrm{d} A}{r^{2}}, \]

其中 \(\theta^\prime\)\(A\) 上某点处的法向量与 \(-\boldsymbol{\omega}_i\) 之间的夹角.

实例:UE4 采用的 BRDF

UE4 引擎使用了如下 BRDF \[ f_{r}\left(\omega_{i}, \omega_{o}\right)=k_{d} f_{\text {lambert}}+f_{s} \] 其中 \[ \begin{array}{l} f_{\text {lambert}}=\dfrac{\text{base_color}}{\pi} \\ f_{s}=\dfrac{F\left(\mathbf{h}, \boldsymbol{\omega}_o\right) G(\boldsymbol{\omega}_i, \boldsymbol{\omega}_o) D(\mathbf{h})}{4(\mathbf{n} \cdot \boldsymbol{\omega}_o)(\mathbf{n} \cdot \boldsymbol{\omega}_i)} \\ k_{s}=F\left(\mathbf{h}, \boldsymbol{\omega}_o\right) \\ k_{d}=\left(1-k_{s}\right)(1-\text {metalness}). \end{array} \] 上式中,\(\mathbf{n}\) 为单位法向量,\(\boldsymbol{\omega}_i\) 为单位入射向量,\(\boldsymbol{\omega}_o\) 为单位反射向量,\(\mathbf{h}=(\boldsymbol{\omega}_i+\boldsymbol{\omega}_o)/\Vert\boldsymbol{\omega}_i+\boldsymbol{\omega}_o\Vert\) 为微平面单位法向量.下面描述函数 \(F,D,G\) 的具体形式.

法线分布函数 \(D\)

GGX(Trowbridge-Reitz)分布

\[ \begin{aligned} \alpha&=\text {roughness}^{2}\\ D(\mathbf{h})&=\dfrac{\alpha^{2}}{\pi\left((\mathbf{n} \cdot \mathbf{h})^{2}\left(\alpha^{2}-1\right)+1\right)^{2}}. \end{aligned} \]

一般地,设 \(\mathbf{n} \cdot \mathbf{h}=\cos\theta_{\mathbf{h}}\),法线分布 \(D(\mathbf{h})\) 应满足

\[ \int_{H^2_{\mathbf{n}}}D(\mathbf{h})\cos\theta_{\mathbf{h}} \:d\Omega_{\mathbf{h}}=1, \]

其中 \(H^2_{\mathbf{n}}\) 表示底部大圆与 \(\mathbf{n}\) 垂直的上半球面.可以验证 GGX 法线分布函数确实满足上述关系

\[ \begin{aligned} \int_{H^2_{\mathbf{n}}}D(\mathbf{h})\cos\theta_{\mathbf{h}} \:d\Omega_{\mathbf{h}} &=\int_{0}^{2 \pi} \mathrm{d} \varphi_{\mathbf{h}} \int_{0}^{\frac{\pi}{2}} \frac{\alpha^{2} \cos \theta_{\mathbf{h}} \sin \theta_{\mathbf{h}} }{\pi\left(\left(\alpha^{2}-1\right) \cos ^{2} \theta_{\mathbf{h}} +1\right)^{2}} d\theta_{\mathbf{h}}\\ &=2\pi\int_{0}^{\frac{\pi}{2}} \frac{ \alpha^{2} \cos \theta_{\mathbf{h}} \sin \theta_{\mathbf{h}} }{\pi\left(\left(\alpha^{2}-1\right) \cos ^{2} \theta_{\mathbf{h}} +1\right)^{2}} d\theta_{\mathbf{h}} \\ &=-\alpha^{2} \int_{0}^{\frac{\pi}{2}} \frac{1}{\left(\left(\alpha^{2}-1\right) \cos ^{2} \theta_{\mathbf{h}} +1\right)^{2}} d\cos ^{2} \theta_{\mathbf{h}} \\ &=\alpha^{2} \int_{0}^{1} \frac{1}{\left(\left(\alpha^{2}-1\right) t+1\right)^{2}} dt \\ &=\left.\frac{\alpha^{2}}{1-\alpha^{2}} \frac{1}{\left(\alpha^{2}-1\right) t+1}\right|_{0} ^{1} \\ &=1. \end{aligned} \]

几何函数 \(G\)

GGX-Smith Correlated Joint 近似公式

\[ \begin{aligned} \alpha&=\text {roughness}^{2} \\ \Lambda(\boldsymbol{\omega}_o)&=(\mathbf{n} \cdot \boldsymbol{\omega}_i)((\mathbf{n} \cdot \boldsymbol{\omega}_o)(1-\alpha)+\alpha) \\ \Lambda(\boldsymbol{\omega}_i)&=(\mathbf{n} \cdot \boldsymbol{\omega}_o)((\mathbf{n} \cdot \boldsymbol{\omega}_i)(1-\alpha)+\alpha) \\ G(\boldsymbol{\omega}_i, \boldsymbol{\omega}_o)&=\frac{2(\mathbf{n} \cdot \boldsymbol{\omega}_o)(\mathbf{n} \cdot \boldsymbol{\omega}_i)}{\Lambda(\boldsymbol{\omega}_o)+\Lambda(\boldsymbol{\omega}_i)} \end{aligned} \]

菲涅尔项 \(F\)

Fresnel-Schlick 近似公式

\[ \begin{aligned} F\left(\mathbf{h}, \boldsymbol{\omega}_o\right)&=F_{0}+\left(1-F_{0}\right)(1-(\mathbf{h} \cdot \boldsymbol{\omega}_o))^{5} \\ F_{0}&=\operatorname{lerp}(0.16\:\text{specular}^2, \text{base_color}, \text{metalness}) \end{aligned} \]

其中 \(\operatorname{lerp}(a,b,t)=(1-t)a+tb\) 为线性插值函数.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!