物理渲染学习笔记(三)——Cook-Torrance微表面模型

从 Phong 到 GGX, 光照模型林林总总,一直没能找机会梳理一遍, 这几天依次都自己实现了一遍,也正好总结下。

Microfacet

普通的着色模型假设着色的区域是一个平滑的表面,表面的方向可以用一个单一的法线向量来定义来定义。而 Microfacet 模型则认为 :

1、着色的区域是一个有无数比入射光线覆盖范围更小的微小表面组成的粗糙区域。

2、所有这些微小表
面都是光滑镜面反射的表面。因为这种模型认为着色区域的表面是由无数方向不同的小表面组成的,所以在 Microfacet 模型中,着色区域并不能用一个法线向量来表示表面的方向,只能用一个概率分布函数D来计算任意方向的微小表面在着色区域中存在的概率。


其中最常用的 Microfacet 是 Cook-Torrance

f(l,v)=D(h)F(v,h)G(l,v,h)4(nh)(nv)

概括性的解释大佬的专栏说的很到位,我这里就直接引用了

因为每一个微小表面都做完美镜面反射,上一节提到过完美镜面反射只在入射光和反射光根据发现镜面反射对称的时候才有能量,所以在计算微小表面的BRDF值时,只用先根据入射方向w_{o} 和出射方向w_{i}计算出中间向量w_{m}也就是微小表面的法线方向,然后用就可以用法线分布函数计算出这个能够完美镜面反射当前入射和出射光D(w_{m})。同样因为是完美镜面反射的缘故,Cook Torrance模型的另一个因素就是菲涅尔(Fresnel)项F(w_{o}, w_{m}),这个项和上一节镜面反射BRDF中通到的一样,用于计算不同入射角度的情况下反射的光线的强度,对于导体和电介材质记得使用不同的Fresnel公式。最后,为了更好的模拟着色区域的凹凸不平,G(w_{o}, w_{i}, w_{m})项则模拟了凹凸表面间的遮挡因素

通常菲涅尔项我们使用Schlick的近似,即:

Fschlick(v,h)=cspec+(1cspec)(1(vh)5)

很多BRDF都可以表达为这个框架下D或G的组合


Blinn-Phong:

D=e+22π(nh)n

G=(nl)(nv)


Cook-Torrance:
法线分布函数通常采用 Beckmann distribution ,即:

D=exp(tan2(α)/m2)πm2cos4(α),α=arccos(nh)

其中m表示材质的粗糙度
G=min(1,2(hn)(vn)vn,2(hn)(ln)vn)

在Unity中实现效果如下:


GGX

D=α2π((nm)2(α21)+1)2

G部分毕竟复杂,可参考 论文原文在Unity中实现效果如下(并不是太理想 :(, 跟大佬光追渲染的ip6一比简直一坨翔)


这里写图片描述

GGX参数分析效果比较


(两种各向异性模型都只是简单了过了一遍实现,还没有详细去分析其每一项)

Heidrich–Seidel anisotropic distribution

论文提供了一种基于Phong模型的各向异性法线分布,高光部分公式如下:

kspec=(1(LT)21(LT)2(LT)(LT))s

其主要思想为将单独针对表面上的每一条划痕(或发丝)去做光照分析,通过切线和光线方向在法平面重新计算法线方向,在Unity中实现效果如下:


Ward anisotropic distribution

论文
提供了 αx αy 两个参数来控制各向异性的方向,当两个参数相等的时候,及表示各向同性,高光部分公式如下:

kspec=ρs(nl)(nv)nl4παxαyexp[2(hXαx)2+(hYαy)21+(hn)]

其中X,Y表示切线空间的X,Y轴(也可以自己用其他的), ρs 则控制高光的总量,在Unity中实现效果如下:


这里写图片描述


to be continue……or not

猜你喜欢

转载自blog.csdn.net/notmz/article/details/75040825