Microfacet model概述(监修中)
\[ \newcommand{\vec}{\bold} \newcommand{\w}{\pmb\omega} \]
BRDF
BRDF的定义式: \[ f_r = \frac{dL_o}{d E_i} \] 此前我疑惑过为什么不简单定义为 \(\frac{dL_o}{d L_i}\),在搞明白Radiance之后理解了。\(L_o\) 为反射方向的Radiance,贡献来自于整个上半球,\(dL_o\) 指 \(dw_i\) 方向的入射光对 \(L_o\) 的贡献;\(E\) 为表面接受到Irradiance,贡献来自于整个上半球, \(dE_i\) 指 \(dw_i\) 方向的入射光对 \(E\) 的贡献。
简单而言,他们都是微分量,都是对入射角的微分;而 \(dL_i\) 则说不清具体含义;也不可能定义成 \(\frac{dL_o}{L_i}\) 的形式,它是一个趋于0的值,需要除上一个微分立体角才能有意义。
\[ L_o = L_i \cdot f_r(i,o)\cdot cos(i) \\ L_i = L_o \cdot f_r(o,i)\cdot cos(o) \]
那为什么不定义为 \(\frac{dL_o}{L_i dw_i}\) 的形式呢?(相比正式定义少了个 \(cos\))
还可以从实际测量的角度理解,实际测量中 \(dL_o\)
....
除此之外,在最常见的微表面模型中,这种定义的BRDF是可逆的,带上cos之后就不可逆了。
Microfacet BRDF推导
下面推导微表面模型中的 \(f_r\) 具体形式,暂时忽略菲涅尔项和几何遮蔽。
我们用 \(cos(i,n)\) 这样的形式来表示两向量夹角的 \(cos\)。
设 \(D(h)\) 指代微法线在 \(dw_h\) 微立体角内的微表面面积与宏表面面积的比例,有 \[ \int D(h) \cdot cos(n,h) \cdot dw_h = 1 \] 先推导 \(dL_o\),它指 \(dw_i\) 方向的入射光对 \(L_o\) 的贡献。
首先,\(dw_h\) 方向的微表面面积为 \[ d^2A_h = dA \cdot D(h) \cdot dw_h \] 可以得出进入表面(且对 \(L_o\) 有贡献)的辐射通量(微平面视角下理解): \[ d^3\phi = L_i \cdot d^2A_h \cdot dw_i \cdot cos(h,i) \] \(\phi\) 是由输入到输出的不变量 \(\phi_i=\phi_o\),那么可以得到(回到宏观视角): \[ dL_o = \frac{d^3\phi}{dA\cdot dw_o \cdot cos(n,o)} \] 左侧是 \(dL_o\),因为右侧还是对 \(dw_i\) 微分的一个量,得到的正是 \(dw_i\) 方向对 \(L_o\) 的贡献。也可以从 \(d\) 的次数守恒来理解。
\(dE_i\) 比较简单: \[ E_i = \int L_i \cdot cos(n,i) \cdot dw_i \\ dE_i = L_i \cdot cos(n,i) \cdot dw_i \] 那么展开上述式子,得到: \[ f_r = \frac{D(h) \cdot cos(h,i) \cdot dw_h}{cos(n,o) \cdot cos(n, i) \cdot dw_o} \] \(dw_h\) 与 \(dw_o\) 之间存在一个几何上的关系(想象对 \(h\) 产生一个扰动 \(dw_h\),然后 \(o\) 将产生的扰动 \(dw_o\) 与 \(dw_h\) 的关系如下)
另一个理解是,首先有 \(d_{\theta o} = 2d_{\theta h}\),\(d_{\phi o} = 2d_{\phi h}\)
从立体角定义的角度,\(dw_h = d_{\theta h} d_{\phi h}cos(\theta_h)\),我们将 \(h\) 摆到竖直的位置上,就有了 \[ \begin{gather*} dw_h = d_{\theta h} d_{\phi h} \\ dw_o = d_{\theta o} d_{\phi o} |w_o\cdot w_h| = 4|w_o\cdot w_h|dw_h \end{gather*} \] 于是有: \[ f_r = \frac{D(h)}{4cos(n,i) \cdot cos(n,o)} \]
再加上几何项G与菲涅尔项F,就得到了经典的Cook-Torrance BRDF
形式: \[
f_r=\frac{DFG}{4cos(n,i) \cdot cos(n,o)}
\]
当然,这里只考虑了reflect,通常的反射模型还要再加一个diffuse部分。
可逆性:\(f_r(w_r\rightarrow w_i)=f_r(w_i\rightarrow w_r)\)
能量守恒:理想的BRDF是能量守恒的(不考虑吸收啥的),但实际上由于多次散射很难计量,次一级的要求是能量保守(可能衰减,但不会增加)的BRDF,这决定了能量是否能够收敛。 \[ \int f_r cos(n,i) dw_i \le 1 \] 这也是白炉测试的基础,如果来自四面八方的 \(L_i\) 一致,那么从任一方向观察散射表面,能量应该与环境光一致(若不损失能量)。
Diffuse
- 最简单的Lambert均匀漫反射:\(f_{lambert}=\frac{q}{\pi}\)
因为需要能量守恒: \[ \int_{\Omega^+} f_p cos\theta d_w = 1 \] 得 \(f_p = \frac{1}{\pi}\),再加上albedo系数即可。
- Disney经验模型,在漫反射部分也加上了菲涅尔因子,公式如下:
\[ \begin{gather*} f_d = \frac{baseColor}{\pi}(1+(F_{D90} - 1)(1 - cos_{NL})^5)(1+(F_{D90} - 1)(1 - cos_{NV})^5)\\ F_{D90} = 0.5 + 2roughness \times cos_{VH}^2 \end{gather*} \]
- 次表面散射也属于Diffuse,暂略。
D项
\(D(h)\) 指微表面中法线为 \(h\) 的微表面面积比例,是微表面模型中最重要的一个统计量。
它指的是微表面面积 / 宏观面积,故乘上余弦项后积分才为1。 \[ \begin{gather*} \int_{\Omega^+} D(h)(h\cdot n)dw_h = 1\\ \int_{\Omega^+} D(h)(h\cdot v)dw_h = v\cdot n \end{gather*} \] 关于2式的理解:
比较常用各项同性GGX分布: \[ D_{GGX}(h)=\frac{\alpha^2}{\pi(cos_{NH}^2(\alpha^2-1)+1)^2} \]
式子中 \(\alpha\) 表示粗糙度
roughness
,其值越大,反射越不集中。
除此之外还有许多中分布模型,大多公式不是推导出来的,而是凭借经验和直觉拟合测量结果得出的。
形状不变性:缩放 \(\alpha\) 时,等价于拉伸微观几何。GGX具备形状不变性,而另一个常见的GTR模型不具备。
各向异性:暂略
G项
几何项,微表面模型中,一部分微表面会被遮挡,导致即使其法线方向符合,也没有产生贡献。我们用 \(G1(h,v)\) 表示沿视图 \(v\) 方向,可见的法线为 \(h\) 的微平面比例,作为对 \(D\) 项的补充。
之前的 \(D\) 项、漫反射项的常用分布,都是人们依据经验拟合的,而G项是依赖所选D项,可以推导的。
单D项还不能推导出G,因为D项仅定义了分布,未定义“轮廓”,还需要一个定义轮廓的模型。目前常用的轮廓模型是Smith遮蔽函数。
Smith模型将微表面看做若干不连续的表面(无自相关性,即任一点的高度和法线无关),单独考虑高度上的遮蔽和局部的法线遮蔽(\(w\cdot w_m > 0\)),这在表面随机的情况下表现很好,对于具备一定规律的表面材质(例如布料),一般使用专门的模型。
Smith遮蔽函数是常见遮蔽函数中,唯一既满足能量守恒又具有法线遮蔽独立性(即法线/高度都和相邻点无关)便利特性的函数。
几何函数的理论形式为 \(G(m, v)\),它表示朝向 \(m\) 的所有微平面中,在 \(v\) 方向上可见的比例。 \[ \int_\Omega G(w_o, w_m)<w_o, w_m>D(w_m)dw_m = 在w_o上的投影面积 = w_o\cdot w_n \] 然而在Smith模型的假设中,\(G\) 函数与 \(m\) 无关(有的会用 \(\chi^+(w_o \cdot w_m)\) 来剔除反方向的表面,但这未必要在几何项中完成),因此也经常看到 \(G(v)\) 的形式。
GGX导出的G项:Smith-GGX函数为 \[ G_{GGX}(v)=\frac{2(n\cdot v)}{(n\cdot v)+\sqrt{a^2+(1-a^2)(n\cdot v)^2}} \]
其中 \(v\) 为光线方向,显然角度越大,这个项越小(衰减越重)
其中 \(\alpha=(\frac{1+roughness}{2})^2\),也有其他形式的 \(\alpha\)。
我们通常使用的几何项是分离的遮蔽阴影函数,\(G=G_{GGX}(w_i) G_{GGX}(w_o)\),除此之外,也有高度相关的版本。
G项虽然基本都用Smith,但是有很多不同的近似方案,内容较多,具体见https://github.com/QianMo/PBR-White-Paper/blob/master/content/part%205/README.md
Kulla-Conty近似:
简单地乘以G项显然会导致能量丢失,事实上,被遮挡的部分会经过反弹再出去。
这里需要做一个fix【暂略】
不能单纯加上一个diffuse!
F项
菲涅尔项,指物体镜面反射的能量比例,入射角与法线夹角越大,反射率越大。通常用 \(F_0\) 表示0度角(垂直)入射时的反射率。金属的 \(F_0\) 值通常为 \(0.5-1\),非金属通常为 \(0.02-0.05\)。
在掠射(90度)时,菲涅尔项达到1(全反射),不过由于微表面的存在,宏观观察的菲涅尔项达不到1也很正常。
菲涅尔项的实际计算比较复杂,它与材质的折射率、波动光学相关,不同材质的菲涅尔项差别也很大。但是经过一些观察,人们发现了一些共性:
- 对于0-45度的入射角(与法线夹角),菲涅尔项几乎不变。
- 45-75度,菲涅尔项明显增大,75-90度,菲涅尔项总是快速达到1。
因此可以用 \(F_0\) 来近似地确定整个菲涅尔函数。
一种近似求法 SchlickFresnel: \[ F=F_0+(1-F_0)(1-cos\theta)^5 \] \(cos\theta\) 为入射方向与法线的夹角(\(w_i\cdot h\)),随角度增大逐渐拉到全部反射。
常见材质的 \(F_0\) 可以查表得出,也可以用 \(F_0=(\frac{n_1-n_2}{n_1+n_2})^2\) 来计算,这里看到 \(F_0\) 其实并不是一个属于材质的属性,而是与两边介质的折射率均有关,大多数情况下 \(n_1 = 1\)。
在相对IOR接近1时,上述式子误差较大,此时可以直接使用精确菲涅尔方程计算。
据人们观察,非金属的菲涅尔效应在光的各个波长上表现比较一致,而金属的菲涅尔效应随波长变化明显。因此实现上,金属的F0可以定义为彩色,非金属F0定义为白色,混合介质的
\(F_0\)
可以简单地线性估计:F_0=mix(vec3(0.04), albedo, metallic)
,这个式子中,非金属F0取典型值0.04,金属部分F0
=
albedo,这也是M/R工作流中的常见做法,albedo同时作为非金属的漫反射颜色和金属的F0。
菲涅尔项是可逆的(仅限目前的几何光学),就是说 \(F(w_i, w_o)=F(w_o, w_i)\),这一点无论是反射还是折射都成立。
Disney模型
首先给出一些基础的物理观念:
- 金属的折射光会被自由电子立刻吸收,几乎只有反射。非金属才有明显散射行为。
- 非金属的镜面反射是无彩色的(白色),金属才具有彩色的镜面反射。
- 光打中平面后,只发生反射(镜面反射)和折射,折射入物体内部后一部分被吸收,另一部分散射出来成为漫反射。其中漫反射部分又可以拆分出次表面散射,即散射距离显著大于像素大小时,散射影响到了附件的其他像素上,称为次表面散射。
Disney BRDF将物体视为金属部分和非金属部分,依据金属度
metallic
混合。由于仅非金属具有漫反射,我们为diffuse部分乘一个系数 \((1-metallic)\),右部specular为金属和非金属共同作用的,金属度体现在
\(F\) 项中的 \(F_0 = mix(0.04, albedo, metallic)\)。
漫反射属于折射后的散射,理应也具有与菲涅尔相关的系数,Disney没有使用简单的lambert模型也没有乘(1-F),而是单独加了一些菲涅尔因子(具体见上Diffuse)
\[ f_r = (1 - metallic)f_d + \frac{D_{GGX}F_{SchlickFresnel}G_{SchlickGGX}}{4cos_i cos_o} \]
BSDF
BSDF = BRDF + BTDF
BTDF(双向透射分布函数)的积分域是下半球面,与BRDF组合后就是一个完整的球面积分。
BTDF同样可以使用微表面模型,将微表面看做光滑的,只会朝固定方向折射。
那么BTDF前面的推导过程和BRDF完全一致,得到: \[ f_t = \frac{D(h) \cdot cos(h,i) \cdot dw_h}{cos(n,o) \cdot cos(n, i) \cdot dw_o} \] 最后的 \(\frac{dw_h}{dw_o}\) 和BRDF不同(仅仅是几何关系上不同),见Walter论文中的图,可以推出关系: \[ dw_h = \frac{dw_o \cdot \eta^2 \cdot cos(h,o)}{||h||^2} \] 这里的 \(\eta = \frac{\eta_o}{\eta_i}\),合并起来,得到 \(f_t\) 的表达式: \[ f_t =\frac{cos(h,i) \cdot cos(h,o)}{cos(n,o) \cdot cos(n, i)}\cdot \frac{D(h) \cdot \eta^2}{||h||^2} \] 再添加菲涅尔项(1-F)和几何项,定义都与BRDF中一致。
由于折射两边的介质不同,我们发现这个式子并不是可逆的,但幸运的是还有另一种可逆性存在: \[ f_t(i,o) \cdot \eta_i^2 = f_t(o,i) \cdot \eta_o^2 \]
Disney BSDF
原先的BRDF依据metallic划分为了散射和反射两部分,现在继续在散射中划分为折射(Specular BSDF)和漫反射两部分(Disney方法使用specTrans参数)。
折射部分和反射很接近,只不过菲涅尔项需要使用 \(1-F\) 以及 \(IOR\) 修正,此时的菲涅尔项可以直接用折射率算出来精确值。
折射下的半法向:\(h=normalize(wi+\frac{\eta_2}{\eta_1}wo)\)
它的分布 \(D(h)\) 可以按照和BRDF相同的方式得出。
实际应用中,我们通常以表面法线朝向作为外侧,定义介质内外两侧的折射率(外侧通常视为空气)
重要性采样
对D进行重要性采样
我们很难严格画出渲染方程的曲线,故通常只对法线分布函数进行重要性采样。
如上,\(D(h)\) 实际应满足 \(\int_{\Omega^+} D(h)cos\theta_hd_w=1\),\(\theta_h\) 为宏面法线和 \(h\) 的夹角,那太方便了,直接拿 \(D(h)cos\theta_h\) 当概率密度,采样 \(h\)。
将向量转化到球面坐标系 \(\theta,\phi\): \[ \int_0^{2\pi}\int_0^{\pi} D(\theta, \phi) cos_\theta sin_\theta d_{\theta}d_{\phi} \] 显然这里的式子与 \(\phi\) 无关,我们可以得到 \(pdf(\theta)=\frac{2\alpha^2cos\theta sin\theta}{(cos^2\theta(\alpha^2-1)+1)^2}\)
接下来的问题是如何生成一个符合这个概率的随机数:
逆分布函数方法
首先计算 \(pdf(x)\) 的累计分布函数 \(P(x)\),它的值域是 \([0, 1]\),然后利用反函数 \(P^{-1}(x)\) 。
这样就可以利用 \([0,1]\) 之间的均匀随机数生成符合 \(pdf(x)\) 的随机数。
为了方便起见,设 \(x=cos\theta\) \[ \begin{aligned} p(\theta)=&\frac{2\alpha^2cos\theta sin\theta}{(x^2(\alpha^2-1)+1)^2}, x\in[0,1]\\ P(t)=&\int_0^t\frac{2\alpha^2cos\theta sin\theta}{(x^2(\alpha^2-1)+1)^2}d\theta\\ =&\int_{..}\frac{\alpha^2}{(x^2(\alpha^2-1)+1)^2}dx^2\\ =&\int_{..}\frac{a^2}{u^2(a^2-1)}du,u=x^2(a^2-1)\\ =&\frac{a^2}{(a^2-1)(cos^2t(a^2-1)+1)}-\frac{1}{a^2-1}\\ P^{-1}(x)=&\arccos\sqrt \frac{1-x}{x(a^2-1)+1} \end{aligned} \] 故随机抽样 \(x\in [0,1]\),然后得出 \(\theta=P^{-1}(x)\)。\(\phi\) 这一项是均匀的, 在 \([0,2\pi]\) 上随机即可。注意pdf还需除以这个 \(2\pi\)
注意如此采样的是 \(h\),随后可以进行反射得到 \(wo\) 方向,此时还需要再次应用 \(wh,wo\) 之间的变换比例:\(pdf /= 4cos_{ih}\)。
对环境贴图重要性采样
以HDR环境贴图作为主要光源时,对其进行重要性采样。
首先将HDR贴图的颜色值归一化为概率密度
此时我们相当于有了一个函数 \(pdf(x, y)\),只不过没有解析式,求不出cdf,那就只能二分了。
可以求出边缘密度函数 \(F_x(x)=F(x,\infty)\),它相当于前缀和,我们可以在[0,1]间均匀抽样,然后在 \(F_x\) 上面二分得到采样的 \(x\)
然后在 \(x\) 列上求出每个 \(y\) 的条件概率密度 \(f_{Y|X}(y)\),在这个东西的CDF上同理二分得到 \(y\)。
在GPU中二分实在太慢,我们可以先预处理一个二维缓冲,在这个缓冲中以 \((u,v)\) 采样的值对应上述过程中,随机数为 \(u,v\) 时采得的 \(x,y\) 坐标。同时还需要传递这个位置的pdf,一共三个浮点数,正好利用三个通道。
显然这个cache和原图的关系基本上是“连续”的,被插值了也没有关系。
关于pdf:谨记它表示的是这个值被采样到的概率,而非此次采样发生的概率,不可忽略。
待合并:Microfacet
简单回顾一下微表面模型的一些性质: \[ \begin{gather*} \int_{\Omega^+} D(\w_m)(\w_m\cdot\w_g)d\w_m = 1 \\ \int_{\Omega^+} D(\w_m)(\w_m\cdot\w_o)d\w_m = cos(\w_o) \\ \end{gather*} \] 第二个式子包含了反向表面的负贡献,与正向表面能够抵消 \[ \begin{gather*} 设 \quad A^+ = \int_{\Omega^+} D(\w_m)<\w_m\cdot\w_o>d\w_m \\ A^- = \int_{\Omega^+} D(\w_m)<-\w_m\cdot\w_o>d\w_m \\ 则也有 \quad A^+ - A^-=cos(\w_o) \\ \end{gather*} \] 几何遮蔽项关注正向表面中,有多少是被挡住的,其定义为: \[ \int_{\Omega^+} G_1(\w_o, \w_m)D(\w_m)<\w_m\cdot\w_o>d\w_m = cos(\w_o) \] 事实上,这定义了一个约束,几何遮蔽函数必须满足这一约束。
Smith model
假设:微表面的高度和法线不相关,也就是可以分别用一个高度分布函数 \(P(h)\) 和一个法线分布 \(D(\w_m)\) 表示,直观来看,Smith假设下的表面是不连续的微平面,各个微平面与其领域完全不相关(这也使得它容易和microflake结合)。
几何遮蔽 \(G\) 项包括两个部分:\(G_1(\w_o,\w_m) = G_1^{dist}(\w_o)G_1^{local}(\w_o, \w_m)\),其中 \(G_1^{dist}\) 表示被其他微平面挡住的部分,与微法线 \(\w_m\) 无关;\(G_1^{local}\) 则表示自身法线的遮挡,即 \[ G_1^{local}(\w_o, \w_m) = \chi^+(\w_o \cdot \w_m) \] 将拆分的几何项带入定义,\(G_1^{local}\) 被合并,我们得到: \[ \begin{gather*} G_1^{dist}(\w_o)\int_{\Omega^+} D(\w_m)<\w_m\cdot\w_o>d\w_m = cos(\w_o) \\ G_1^{dist}(\w_o)A^+ = cos(\w_o) \end{gather*} \] 在斜率空间进行一番推导(这块很复杂,具体看论文Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs),最终得到 \[ G_1^{dist}(\w_o) = \frac{1}{1+\Lambda(\w_o)} \] \(\Lambda(\w_o)\) 的定义是一个复杂的斜率上的积分形式,各个NDF可以推导出不同的 \(\Lambda\),重要的是它的含义: \[ G_1^{dist} = \frac{A^+-A^-}{A^+}, \quad \Lambda = \frac{A^-}{A^+-A^-} \] 也就是被遮蔽的表面与可见表面的比例。
与microflake的联系
首先,smith模型将微平面看做不连续的小平面,我们可以把它们当成microflake;
在 [Heitz et al. 2016]
的方法中,微表面被等价为不均匀介质(密度变化),而
[Dupuy et al. 2016]
将微表面映射到半无限空间中的均匀介质中。具体映射为: \[
\begin{gather*}
z = log(C(\xi)) \\
\xi = C^{-1}(exp(z)) \\
\end{gather*}
\] 其中 \(z\in [0, -\infty)\)
表示volume的深度,\(\xi\)
表示microfacet的height field,\(C(\xi) \in [0,
1]\),介质密度 \(\rho(z) =
1\)。
在这种映射下,smith模型在高度 \(\xi\) 处对应的microsurface密度即为: \[
\rho_{smith}(\xi) = \rho(z)\frac{dz}{d\xi} = \frac{P(\xi)}{C(\xi)}
\] 符合 [Heitz et al. 2016]
的定义(虽然没看懂,为啥密度应该是这个)。
microflake的投影面积与shadowing-masking有很大的关联,有: \[ \begin{gather*} \sigma(\w_i) = \int_{S^2}<-\w_i, \w_m>D(\w_m)d\w_m = A^- = \Lambda(\w_i) cos(\w_i) \\ \sigma(-\w_i) = \int_{S^2}<\w_i, \w_m>D(\w_m)d\w_m = A^+ = (1+\Lambda(\w_i)) cos(\w_i) \end{gather*} \] 我们要证明这样的volume与microfacet等价,只需要证明任意方向的几何遮蔽 \(G_1^{dist}(\w)\) 是相同的(二者的散射性质都取决于NDF,可以认为相同)。
volume的平均遮蔽为: \[ \begin{align*} G_1^{volume}(\w_i) &= \int_0^1 exp(-|log(u)|\frac{\sigma(\w_i)}{cos\w_i})du \\ &= \frac{1}{1+\frac{\sigma(\w_i)}{cos\w_i}} \\ &= \frac{1}{1+\Lambda(\w_i)} \end{align*} \] 这时,我们已经完成了遮蔽项的对齐,同时我们发现 \(\sigma(\w_i) \neq \sigma(-\w_i)\),这并不是一个对称的经典微薄片,而是一种单向的。事实上,\(D\) 项也并不是对称的,它应该和microfacet对齐,这才能保证微表面和这种volume等价。
不理解的地方
Multiple-scattering microfacet BSDFs with the Smith model中提到了 \(G_1^{dist}(\w_o, h)\) 这一形式,它的含义是某一高度的微平面,在 \(\w_o\) 方向上可见的比例。 \[ \begin{gather*} G_1^{dist}(\w_o, h) = C(h)^{\Lambda(\w_o)} \\ G_1^{dist}(\w_o) = \int_{-\infty}^{+\infty} G_1^{dist}(\w_o, h)P(h)dh = \frac{1}{1+\Lambda(\w_o)} \end{gather*} \] 这里 \(P,C\) 分别是高度分布(pdf)和对应的CDF。
我的理解是先有下面的积分式子,再倒推得到的 \(G_1^{dist}(\w_o, h)\) 的定义。