Chapter 10 – Local Illumination 局部光照

10.3 球形与半球形函数

为了使环境光照不单单是等式中一个恒定的项,我们需要找到一种方法来表示物体上任意方向上的入射radiance。首先,我们将只考虑方向的影响,也就是只对方向进行积分,先不考虑表面的位置。这么做的前提是我们假设环境光照位于无穷远的地方。

不同方向上到达某一个点的radiance可能各有不同。例如,左侧的光照为红色,右侧的为绿色,或者顶部的光照被遮蔽而侧面的光照成功照射到物体。这一类参数可以由spherical function来表示,其定义了单位球体的表面,或者说定义了方向的空间R3。而我们使用S来表示。

假设对象是Lambertian表面,那么spherical function能够用于计算环境光照,只需要存储一个预先计算的irradiance函数即可,例如,为每一种可能的表面法线方向所卷积的radiance。更能为复杂的方法则会存储radiance之后在运行时为表面上每一个着色点计算BRDF的积分。Spherical function也同样运用于全局光照的算法中。

除了spherical function,相对应的还有hemisphere function,其针对那些只需要定义一半的方向的值。例如,我们可以使用hemisphere function来绘制某些表面只会接收上方入射的radiance。

我们会将这些方法统称为spherical bases,因为它们都是基于球体内的向量空间函数。将一个函数转换为一个表达式,这一过程就是所谓的projection。从一个给定的表达式计算函数的值,这就是reconstruction

每一个表达式都有其取舍与优劣。但总体来说,我们需要保证以下这几点:

  • 高效率的encoding(projection)与decoding(lookup)。
  • 通过有限的因子较为准确地表示任意spherical function。
  • 投影的rotation invariance,也就是说projection与rotation的顺序并不会影响函数的结果。
  • 计算总和以及计算encoded函数乘积较为简单
  • 计算球形积分与卷积较为简单

10.3.1 Simple Tabulated Forms

表示一个spherical或者hemispherical function最为简单的方法就是选取几个方向,并为每个方向存储一个值。计算这一类函数,我们要做的就是在给定的方向上选取一些采样点,再通过对采样点进行插值来重构最后的结果。

这种方法虽然简单但是非常直接。对spherical function进行加法运算或者乘法运算将会非常简便。只要我们有足够多的采样点,就能对不同的spherical function进行encoding,且误差较小。

对于这一种方法,最重要的就是找到一种方法在球体上分布我们的采样点(如下图所示,从左至右分别为随机分布,cubical grid point与spherical t-design),且程序能够进行高效的检索。其中最为常用的技术就是先将球体平铺为一个矩形,之后将采样点均匀地分布在“矩形”上,这也被称为cubical grid points。矩形上的grid points就对应二维贴图中的texel,因此我们能将采样值存储在texel中。这么做还能使我们利用GPU的bilinear texture filtering,这能够加快检索的过程(reconstruction)。在本章节的后半部分,我们还将学习environment maps(环境映射贴图),该技术所采用的spherical function就属于这一类型。

但是tabulated forms也有不足的地方。如果采样的分辨率较低,那么硬件filtering所带来的效果一般就会比较差。其计算过程的复杂程度则与采样点的数量成正比。此外,该方法下的projection并不是rotation invariance。例如,多个方向上的光撞击到物体表面,此时我们计算了入射的radiance。如果物体发生了旋转,那么我们先前的计算结果将不再适用。这可能就会导致场景中物体的显示错误。我们需要使用kernel函数来缓解这一问题。不过更常用的解决办法是使用密度足够高的采样点。

一般来说,当我们所处理的数据较为复杂,频率较高,且容错率较低,那么我们会使用tabulated form。

ambient cube(AC)是最简单的一种tabulated form,也是最为常用的一个选择,其由6个正方形的cosine lobe所组成。其被称为cube是因为我们将数据存储在cube的每一个面中,当我们从一个方向移动至另一个方向时将会进行插值。对于任意一个给定的方向,我们只需要cube的6个面中的3个即可,所以另外3个面的参数并不需要读取至内存。数学上,ambient cube能定义为:

其中,c+c包含了cube的6个面(也就是6个数据),而sel+(c+,c,d)是一个向量函数,其将会基于d中没个成员的正负,从c+或者c中选取一个值。

Ambient cube类似于cube map(我们将在下一小节学习)。在某些系统中,软件内部对于ambient cube的reconstruction会比GPU对cube map的bilinear filtering更快。

使用ambient cube进行reconstruction的效果非常差。通过存储8个值(代表8个顶点)并且在对应的值之间进行插值能够提供略微改善的效果。最近,Iwanicki与Sloan提出了ambient dice(AD)。这一技术基于二十面体的顶点方向的四次方cosine lobe。需用6个值进行重构(总共会存储12个值),如果选取相对应的6个值将会比ambient cube更复杂,但是其最终的效果会更好。

10.3.2 Spherical Bases

有无数种方法能将函数转换为使用有限个因子的表达式。而我们要做的就是通过几个参数(因子)来“测量”球体的范围。

其中可能性最小的选择就是使用一个常量:

上述等式最大的好处是简便性。但是,我们无法通过这一等式来表现大多数的spherical function,因为其只是使用他们的平均值进行替代。而我们可以使用一个略微复杂的,由两个因子a和b组成的等式:

page395-page404…

留下评论

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