Chapter 10 – Local Illumination 局部光照

10.5 Specular Image-Based Lighting

虽然环境映射贴图最初是用于渲染类似镜子的表面,但是之后其被广泛地用来表现光滑材质的反射效果。当我们使用environment map来模拟距离无限远的光源所生成的镜面反射效果时,environment map也能作为specular light probes。这一类贴图能过在捕捉到所有方向上的radiance,同时我们能够使用该信息来计算出BRDF——并不单单局限在纯粹的镜子或者Lambertian表面。有时我们还会将其称为specular cube map,以此表示我们使用存储在环境光照的cube map来模拟光滑材质表面的反射。

为了模拟表面的粗糙效果(我们模拟的是光滑表面,而并非镜子),贴图中的环境表现会预先进行prefiltered。对环境映射贴图进行模糊处理之后,我们可以展现一种更为真实的镜面反射效果而不是那种镜子表面的反射效果。这一类模糊处理应该以非线性的形式进行,例如,贴图的不同部分应该有着不同的模糊效果。这是因为环境映射贴图将被映射到理想的球形空间中的各个方向上。也就是说,两个相邻的texel的中心之间的angular distance(角距离)并不是一个常量,每个texel所覆盖的立体角也不是一个常量。一般来说,专门对cube map进行预处理的工具,例如AMD的CubeMapGen,在进行filter时都会将这些因素考虑在内。如下图所示,上半部分是原始的environment map,而下半部分则是通过Gaussian kernel处理的environment map。

如果我们只是单纯地根据经验对environment map进行模糊处理,这回导致其表现不符实际的BRDF。理论上来说,更合理的方法需要考虑BRDF函数的形状。之后使用该分布对environment map进行filter处理。如下图所示,左侧部分表示,眼睛的射线从物体表面反射之后从environment map中得到了类似于镜子的反射。右侧部分则展示了视野射线反射后的specular lobe,其将用于对environment map进行采样。图片中绿色的边检代表cube map,上面红色的断点表示相邻的texel。

使用specular lobe对environment map进行filter并不是一件简单的事,因为BRDF能够模拟任何形状,其取决于表面的粗糙度参数以及视野向量和法线向量。所以,为了控制最终的lobe的形状,最少需要5个输入参数(粗糙度,视野方向与法线方向上各自需要两个极限角)。显然,基于这些变量来存储多个environment map是不现实的。

10.5.1 Prefiltered Environment Mapping

实践中,对于光滑材质表面的环境光照的prefilter操作一般会使用模拟的BRDF,最终的贴图并不会考虑视野向量与法线向量。如果我们只通过材质的光滑度来限制BRDF的形状变化,那么我们可以对应不同的粗糙度参数来计算并存储一些environment map,只需要在运行时选择最合理的environment map即可。实践中,这意味着限制我们所使用的模糊处理的中心点。

假设某些光来自于近似反射视野的方向。直接来自于反射视野方向的光对于最后的结果有最大的影响,与该方向偏离越大其影响就越小。environment map中texel的颜色值需要乘以该texel的BRDF对于该texel的影响(权重值)。最后加总求得q。此外我们还需要计算出总的权重值s。最后的结果是q/s,这就是反射视野向量方向上的lobe内积分后的颜色值,而该颜色值将存储在最终的reflection map中。

如果我们使用Phong材质模型,由于径向对称的存在,我们能够几乎准确地计算出环境光照。使用了径向对称的specular lobe,这意味着lobe的形状将取决于视野方向,因为它是horizon clipping(水平剪裁)。假设我们看向一个有光泽的球体(并非镜子)。如果我们的眼睛靠近球体的中心,那么就会生成一个对称的Phong lobe。如果我们的研究靠近球体的边缘,那么一部分lobe将会被裁剪,因为边缘的切面下方的光线并不能进入眼睛。如下图所示。这种情况在实践中通常会被忽略,但是这回造成切线角处的反射亮度过高。

Heidrich与Seidel使用了一个reflection map来模拟表面反射的模糊程度。为了适合不同的表面粗糙程度,一般我们会使用environment cube map的mipmap来实现这一特性。越高的mipmap等级存储在越是粗糙的物体表面的环境光照。在游戏运行时,我们将基于反射向量以及基于材质粗糙度的mipmap等级来读取cube map中的texel。如下图所示,物体表面的粗糙度从左至右依次递减。

材质表面越粗糙,其模糊的区域也就越大,所以其需要的分辨率也越低,这完美地适应了mipmap的结构。此外,由于GPU将对mipmap进行trilinear filter,采样点可能会在两个mipmap之间blend。当该技术与菲涅尔项相结合时,reflection map能非常好地表现出光滑表面。

由于性能以及锯齿的原因,我们在选择mipmap等级时不但需要考虑着色点的材质粗糙度,还需要考虑到屏幕像素所覆盖的物体表面区域上的法线与粗糙度的变化量。Ashikhmin与Ghosh指出,如果有两个候选的mipmap等级,那么我们应该使用分辨率较低的那个mipmap level。

上述filtering技术都假设,基于一个给定的反射视野方向,所有的lobe有着相同的形状与高度。这一假设意味着lobe必须是径向对称的。除了之前我们提到的horizon clipping问题,大多数的BRDF在不同的角度有着不同的lobe。例如,在切线角处的lobe会变得更薄。同样,不同角度下,lobe的长度也会各有不同。

Convolving the Environment Map

生成prefiltered的environment map意味着我们需要为每一个texel,基于方向v,以specular lobe D来计算环境radiance的积分:

该积分方程属于spherical convolution,而我们将使用蒙特卡洛法进行解析:

lk中的k=1,2,…,N,其表示单位球体(方向)内离散的采样点,而p(lk,v)则是方向lk上的采样点的概率函数。如果对球体进行均匀的采样,那么p(lk,v)永远等于1。虽然求出的总和对于我们想要积分的每个方向向量v来说是正确的,但是当我们将结果存储在environment map中时,我们还需要考虑投影所造成的变形。

虽然上述蒙特卡洛法非常简单也能提供正确的结果,但是其需要大量的采样点,即使对于离线渲染,该过程也太慢了。尤其是对于environment map所组成的mipmap的最上层(分辨率最高)。需要计算的纹理太多,而且许多specular lobe可能近乎为0,也就是说大多数采样点都是“浪费的”,因为D(lk,v)≈0。

为了避免上述情况,我们可以使用重要性抽样,也就是说,我们通过一个概率分布来生成方向,使其能最好地匹配specular lobe的形状。这对于蒙特卡洛积分来说是一个常用的variance reduction(方差缩减)技术。如果想要进一步改进采样技术,我们可以将environment map中radiance的分布与specular lobe的相结合。但是,这些技术基本上都用于离线渲染,因为一般来说最少也会需要数百个采样点。

为了进一步降低样本方差,我们可以评估采样点与积分之间的差距,而不是比较采样点与单一方向。使用椎体对environment map进行采样可以通过对更底层的mipmap进行点采样来模拟。这么做虽然会引入误差,但是其大大减少了采样点的数量。

高效的卷积技术使得我们能够实施更新预先filter的cube map,这对于那些动态生成的environment map来说非常必要。使用environment map通常会使得其对应的物体很难在多个光照环境中移动,例如,从一个房间到另一个房间。如果我们每一帧或者相隔几帧就能动态地生成新的environment map且我们拥有高效的filter技术,那么在specular reflection map之间的切换也并不会产生过高的开销。

还有一个办法是为静态environment map动态添加动态光源的specular高亮效果。这么做可以避免游戏运行时大量的filtering。但其也有一定的限制,因为其前提条件是光以及被反射的物体离物体无限远(对于environment map的假设)。

如果几何体是静止的,但是有些光源(例如,太阳)会移动,那么我们可以将表面的属性(坐标,法线,材质)存储在G-buffer environment map中,以此来避免动态地渲染cube map中的场景。而我们将在第二十章中学习G-buffers。之后,我们使用这些参数来物体算表面在environment map中射出的radiance。

10.5.2 Split-Integral Approximation for Microfacet BRDFs

由于环境光照对于画面表现非常重要,我们可以找到许多用来缓解cube map的prefilter中的一些固有问题。

到现在为止,我们已经学习了通过Phong lobe并乘以镜子的菲涅尔项的替代方式:

其中,ʃΩDPhong(r)是基于environment cube map中的每一个r预先计算的。如果一个specular microfacet BRDF fsmf使用下列等式,

很明显,即使假设D(h)≈DPhong(r),我们也把大部分的BRDF运算从光照的积分运算中进行了移除。阴影项G2(l,v,h)与half-vector的菲涅尔项F(h,l)被移除了。Lazarov发现,使用基于n·v而不是n·h的菲涅尔项将会造成更大的错误(与完全不使用菲涅尔项相比)。Gotanda,Lazarov与Karis提出了一个相似的split-integral approximation

page421 – page424… 

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据