上一章我们介绍了表面反射公式,这一张我们介绍具体的反射模型。来自许多表面的散射最好的描述是多个BRDF和BTDF的空间混合。
表面反射模型实际上可以来自于很多资料:
- 测量数据:许多现实世界的表面的反射分布属性都在实验室中被测量了。这些数据可以直接以表格形式使用。
- 现象学模型:用公式来模仿现实世界物体表面的定性特性。这种类型的BSDF非常容易使用
- 模拟:有时候表面组成的底层信息可以获取到,例如我们知道颜料由带颜色的附着于某些介质的粒子组成,每种粒子的反射特性我们可以知道。这种情况下我们可以模拟微观层面的光散射来模拟产生反射数据。这个过程既可以在渲染过程完成也可以作为预处理。
- 物理光学:这是计算复杂度相当高的一种方法,将光当作波来看待,计算麦克斯韦方程求解。并且未必比集合光学效果更好
- 几何光学:如果知道了表面的底层散射和几何属性,反射模型可以直接从描述中构造出来。几何光学使得光和表面的交互可追踪,许多情况下都是非常好的选择。之前我们介绍的公式都是基于几何光学建立的
光线追踪算法中一般的着色过程是:对于每条光线,找到其最近的和物体相交的点。然后找到物体上该点的表面属性(例如材质)来确定该点的BSDF。然后我们利用之前介绍的积分公式使用BSDF基于输入光照来计算该点的散射光。
基本术语
为了能够比较不同反射模型的视觉效果不同,我们这里介绍一些描述表面反射的基本术语。
表面反射可以分为四个大类别:漫反射(diffuse),光滑镜面反射(glossy specular),完美镜面反射(perfect specular)
以及复古反射(reto-reflective)。与下图所示分别对应。大多数现实表面都是上述四种类型反射的混合。
- 漫反射所有方向都均匀散射光。理想的漫反射表面几乎不存在,但是诸如无光泽的黑板和无光油漆都可以看做近乎理想的漫反射(考虑一下黑板不管从哪个方位看基本颜色几乎都是一样的(不考虑高光等))。
- 光滑镜面表面(包括塑料制品或者高光泽度涂料)会在一组反射方向散射光,因而会显示其他物体的模糊反射。(因为某个视角看过去光可以来源于多个输入方向的光来源,也就是多个物体的表面可以在同一个观察点被观察到,这就带来了模糊。实际上这个我的理解和采样是一样的。当对一个像素点进行采样的时候,一个像素点的像素值来源于就会来源于多个物体。所以一个像素点的值可以认为是多个物体表面的混合值。但是当像素点足够小的时候,这种模糊效果也足够小。当像素点大的时候(分辨率很低),这种模糊效果就很明显了)。当然,采样和这种光滑镜面反射带来的模糊本质上还是有点区别的。单个人觉得有很多相似点。
- 完美镜面表面在一个反射方向散射输入光。镜子和玻璃都是完美镜面表面的例子。
- 复古反射包面诸如丝绒或者月球表面,他们会将大部分光延沿着输入方向的周围反射。
给定一类特定的反射,反射分布函数可以是各向同性或者各向异性。大多数物体都是各向同性的。各向异性的表面包括刷过的金属,多种衣服以及光盘,他们表面某点反射的光随着该点位置的不同而不同。
几何设置
我们采用反射坐标系来计算反射。
上图中s,t是和表面相切的向量,n则是和表面垂直的向量。他们分别和x,y,z轴对齐,组成了单位正交基。世界坐标系下面的方向向量
ω
\omega
ω首先转化到该坐标系下面,然后再进行BRDF和BTDF的计算。该反射坐标系也可以成为着色坐标系。
着色坐标系可以方便表达球形坐标的方向
(
θ
,
ϕ
)
(\theta,\phi)
(θ,ϕ)。给定该坐标系下面的方向向量
ω
\omega
ω,其与法向量n的夹角的余弦值为:
cos θ = ( n ⋅ ω ) = ( ( 0 , 0 , 1 ) ⋅ ω ) = ω z \cos\theta=(\boldsymbol{n}\cdot\omega)=((0,0,1)\cdot\omega)=\omega_z cosθ=(n⋅ω)=((0,0,1)⋅ω)=ωz
在此基础上我们可以轻松得到 sin θ \sin\theta sinθ以及 tan θ \tan\theta tanθ。
类似的, ϕ \phi ϕ也可以轻松得到。如下图,
cos ϕ = x r = x sin θ \cos\phi=\frac{x}{r}=\frac{x}{\sin\theta} cosϕ=rx=sinθx
sin ϕ = y r = y sin θ \sin\phi=\frac{y}{r}=\frac{y}{\sin\theta} sinϕ=ry=sinθy
反射率
有的时候表达4D的BRDF或者BTDF比较麻烦,我们更愿意将他们降维到在一个单独方向上面的2D函数,甚至是一个可以描述所有散射行为的常量。
半球方向反射率(hemisphererical-directional reflectance)是一个2D函数,它会给出由于整个半球的常量光照引起的特定方向的反射。
p h d ( ω 0 ) = ∫ H 2 ( n ) f r ( p , ω o , ω i ) ∣ c o s θ i ∣ d ω i p_{hd}(\omega_0)=\int_{H^2(\boldsymbol{n})}f_r(\boldsymbol{p},\omega_o,\omega_i)|cos\theta_i|\mathrm{d}\omega_i phd(ω0)=∫H2(n)fr(p,ωo,ωi)∣cosθi∣dωi
上式实际上就是rho,我的理解是reflectance hemisphere outogoing,即某个输出方向的半球反射率。需要注意以下几点:
- 这是个2D函数,如何理解2D呢??因为变量可以理解为就是输出方向,对应公式也就是只有一个 ω o \omega_o ωo。但是右边式子又需要 p p p点,所以该函数的输入是:起源于p点的方向 ω o \omega_o ωo,输出是这个方向上面的来自半球所有方向的光照造成的反射。
- 由于BRDF的互易性,rho也可以理解为来自某个特定方向的光导致的整个半球的反射。
还有一种情况就是给定 p p p点,但是不指定出射方向 ω o \omega_o ωo,这是另外一种反射率,我们称之为hemispherical-hemispherical reflectance 。它描述的是当来自所有输入方向的光一样的时候被表面反射的输入光的比率:
p h h = 1 π ∫ H 2 ( n ) ∫ H 2 ( n ) f r ( p , ω o , ω i ) ∣ cos θ o cos θ i ∣ d ω o d ω i p_{hh}=\frac{1}{\pi}\int_{H^2(n)}\int_{H^2(n)}f_r(p,\omega_o,\omega_i)|\cos\theta_o\cos\theta_i|\mathrm{d}\omega_o\mathrm{d}\omega_i phh=π1∫H2(n)∫H2(n)fr(p,ωo,ωi)∣cosθocosθi∣dωodωi
如何理解rho呢??
- 这是一个反射率,当给定反射方向的时候,这个反射率沿着该反射方向的能量和整个半球的输入能量的比值。当没有给定反射方向的时候,这个反射率是整个半球的所有反射方向和所有入射方向的光的能量的比值。
- 当rho为1的时候,可以认为是没有任何能量损耗的反射
- 一般用蒙特卡洛积分来求解rho的积分。