基于物理的渲染 - 表面反射
本文最后更新于: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应该具有以下三条性质:
- 非负性:$f_{\mathrm{r}}\left(\mathbf{p}, \boldsymbol{\omega}_o, \boldsymbol{\omega}_i\right)\ge 0$;
- Helmholtz互异性(Helmholtz reciprocity):;
- 能量守恒:
计算
处理积分
的常见方式有三种:
单位半球上的第一类曲面积分,用球坐标进行参数化
转化为发光曲面 $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 协议 ,转载请注明出处!