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

本文最后更新于:2021年8月6日 凌晨

双向反射分布函数

考虑一张反射平面,在点 $\mathbf{p}$ 处来自入射光的辐照度可以表示成

其中 $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})$.

上式有时也写作微分形式

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

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

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

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

被称作 反射方程

性质

基于物理的BRDF应该具有以下三条性质:

  1. 非负性:$f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\ge 0$;
  2. Helmholtz互异性(Helmholtz reciprocity):
  3. 能量守恒:

计算

处理积分

的常见方式有三种:

  1. 单位半球上的第一类曲面积分,用球坐标进行参数化

  2. 转化为发光曲面 $A$ 上的积分

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

实例:UE4 采用的 BRDF

UE4 引擎使用了如下 BRDF

其中

上式中,$\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)分布

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

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

几何函数 $G$

GGX-Smith Correlated Joint 近似公式

菲涅尔项 $F$

Fresnel-Schlick 近似公式

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


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