相关文章推荐
独立的皮带  ·  java ...·  9 月前    · 
呐喊的槟榔  ·  使用makefile复制文件。·  1 年前    · 
很酷的大蒜  ·  Put Bucket请求返回403 ...·  1 年前    · 

10.3 球面函数和半球函数

为了不仅仅是用常数项来表面环境光照,我们需要一种方法来表示从任何方向入射到物体上的radiance,首先,我们将radiance认为是方向上积分的函数,而不是表面位置上的函数,这样做是由于我们假设环境光照是无限远的。

在每个入射方向上到达某个给定点的radiance是不同的,从左边入射的光可能为红色,从右边入射的光为绿色,或者从顶部入射的光被遮挡,而从侧面入射的光却不被遮挡。这些类型的量可以用球函数来表示,它们定义在单位球表面上或者在 R^3 的空间的方向上。我们将这个域表示为S, 这些函数的工作方式不受它们计算出单个值还是多个值的影响。例如,通过为每个颜色通道存储单独的标量函数,用于存储标量函数也可以用于编码颜色值。

对于Lambertian表面,球形函数可以通过存储一个预先计算的irradiance函数来计算环境光照,例如,对每个可能的法线方向,计算radiance与cosine lobe的卷积。更复杂的方法是存储radiance,并在运行时计算每个着色点的BRDF 积分。球面函数也广泛用于全局光照算法(第11章)。

与球面函数相关的是那些半球函数,在这种情况下,只有一半方向的值是被定义的。例如,这些函数用于描述在没有来自下面的光的表面入射的radiance。

我们将把这些表示称为球基,因为它们是定义在球上的函数的向量空间的基。即使环境/高光/方向形式(章节10.3.3)在技术上不是数学意义上的基,我们也将使用这项来指代它。将函数转换为给定的表示形式称为投影,从给定的表示形式求函数的值称为重建。

每种表示都有自己的一组trade-offs, 我们可以在给定的基上找到的特性是:

  • 高效的编码(投影)和解码(查找)。
  • 能够用较少的系数和较低的重建设误差来表示任意的球面函数。
  • 投影的旋转不变性,它是旋转一个函数的投影的结果和旋转这个函数然后投影是一样的。这种等效性意味着函数也类似,例如,球谐的函数在旋转时不会改变。
  • 易于计算编码函数的和与乘积。
  • 易于计算球面积分和卷积。

10.3.1 简单表格

表示球形(或半球形)函数的最直接方法是选择几个方向,并为每个方向存储一个值。 对函数的求值涉及到在求值方向周围找到一些样本,然后用某种形式的插值来重建这个值。

这种表示很简单而高效, 添加或相乘这样的球形函数就像添加或相乘相应的表项一样简单。 我们可以根据需要,通过添加更多的样本,以任意低的误差编码许多不同的球面函数。

在球面上分布点的几种不同方法。 从左到右:随机点,立方体网格点,球面t-design。

以一种允许高效检索的方式将样本分布在一个球体上(上图),同时相对平等地表示所有方向,这不是一件简单的事情。最常用的技术是首先将球体展开成一个矩形域,然后用网格点对这个域进行采样。由于二维纹理恰好代表了一个矩形上的点(像素)网格,我们可以使用像素作为样本值的存储。这样做可以让我们利用gpu加速的双线性纹理过滤来进行快速查找(重建)。在本章的后面,我们将讨论环境映射(第10.5节),它是这种形式的球形函数,并讨论展开球形的不同选项。

表格也有缺点, 在低分辨率下,硬件滤波后的画质通常是不可接受的。处理光照常用的操作是使用卷积计算,它与样本的数量成正比,此外,投影在旋转下不是不变的,这在某些应用中可能是有问题的。例如,想象从一组方向照射到物体表面的光的radiance的编码, 如果物体旋转,编码的结果可能会以不同的方式重建, 这可以导致编码的辐射能数量的变化,这会使场景动画表现出artifact效果。通过在投影和重建过程中使用与每个样本相关的精心构造的核函数,可以减轻这些问题。不过,更常见的是,仅仅使用足够密集的采样就足以掩盖这些问题。

通常,当我们需要存储复杂的、高频的函数,这些函数需要许多数据点以低错误进行编码时,就会使用表格,如果我们需要对球函数进行紧凑的编码,只有几个参数,可以使用更复杂的基。

环境立方体(ambient cube: AC)是一种流行的基选择,它是最简单的表格形式之一,由沿长轴方向的6个平方余弦lobes构成。它被称为环境“立方体”,因为它相当于将数据存储在一个立方体的表面上,在我们从一个方向移动到另一个方向时进行插值。对于任何给定的方向,只有三个lobes是相关的,所以其他三个lobes的参数不需要从内存中提取。数学上,环境立方体可以定义为: F_{AC}(\mathrm{d}) = \mathrm{d}d \cdot sel_+(c_+, c_-, \mathrm{d}) \tag{10.16}

其中, c_+ c _- 包含立方体面的6个值, sel_+ ( c_+, c_− ,d)是一个向量函数,每个分量根据d中的分量的正负确定取 c_+ 还是 c _-

环境立方体类似于cube map(章节10.4),每个立方体表面只有一个纹素, 在某些系统中,针对这种特殊情况,在软件中执行重建可能比在立方体映射上使用GPU的双线性滤波要快。Sloan推导出一个简单的公式,用于在环境立方和球谐基之间进行转换(第10.3.2节)。

使用环境立方体重建的质量相当低。通过存储和插值8个值而不是6个值(对应于立方体顶点),可以获得稍微更好的结果。最近,Iwanicki和Sloan提出了一种称为ambient dice(AD)的替代方法, 基由沿二十面体顶点方向的平方和四次方余弦lobes组成。存储的12个值中有6个用于重建,确定检索哪6个值的逻辑比环境立方体的对应逻辑稍微复杂一些,但结果的质量要高得多。

10.3.2 球形基

有无数种方法可以将(编码)函数投射到使用固定数值(系数)的表示上。我们所需要的是一个数学表达式,它在球域上,并有一些我们可以改变的参数, 然后,我们可以通过拟合来近似任何给定的函数,即,找到参数的值,使表达式和给定函数之间的误差最小化。

最简单的选择是使用一个常量: F_c(\theta, \phi) = c \cdot 1 \\

我们可以通过求函数 f 在单位求上的表面积的平均值得到函数 f 在这个基上的投影: c = \frac{1}{4\pi}\int_\Omega f(\theta, \phi) , 周期函数的平均值c 也称为 DC分量,这种基具有简单的优点,甚至考虑了我们需要的一些性质(易重建、加法、积、旋转不变性)。然而,它不能很好地表达大多数球形函数,因为它只是用它们的平均值来代替它们。我们可以用两个系数a和b构造一个稍微复杂一点的近似: F_{hemi}(\theta, \phi) = a + \frac{cos(\theta) +1}{2} (b - a) \\

这种近似可以在极点编码精确的值,并可以在穿过球体的表面之间进行插值,这种选择更具表现力,但现在投影变得更加复杂,并不是对所有旋转都是不变的。事实上,这个基可以看作是一个表格形式,只有放在极点的两个样本。

一般来说,当我们讨论函数空间的基时,我们的意思是我们有一组函数,它们的线性组合(加权求和)可以用来表示给定域中的其他函数,这个概念的示例如下图所示。本节的其余部分探讨了一些可用于在球面上近似函数的基的选择。

基函数的一个基本例子,在本例中,空间是“输入在0到5之间的值在0到1之间的函数”。左边的图显示了这样一个函数的示例。中间的图显示了一组基函数(每种颜色都是一个不同的函数)。右边的图显示了目标函数的近似值,它是通过将每个基函数乘以一个权重并对其求和而形成的。基函数按其各自的权重按比例表示,黑线表示求和的结果,它是原始函数的近似,用灰色表示。

球面径向基函数(Spherical Radial Basis Functions)

使用GPU硬件滤波的表格重建质量较低,至少在一定程度上是由用于插值样本的双线性函数造成的。 其他函数可以用来对重建样本进行加权。 这种函数可能比双线性滤波产生更高质量的结果,而且它们可能还有其他优点。 通常用于此目的的一组函数是球面径向基函数(SRBFs)。 它们是径向对称的,这使得它们只有一个参数,即它们所指向的轴与计算方向之间的角度。 基是由一组这样的函数组成的,这些函数被称为lobes,分布在整个球体上。 函数的表示由每个lobe的一组参数组成。 这个集合可以包含它们的方向,但这会使投影变得更加困难(需要非线性、全局优化)。 由于这个原因,lobe方向通常被假定是固定的,均匀地分布在整个球面上,并使用其他参数,如每个lobe的大小或它覆盖的角度。 重建是通过计算给定方向的所有lobes,并将结果相加来进行的。

球形高斯函数(Spherical Gaussians)

对于SRBF lobe,一个特别常见的选择是球形高斯(SG),在方向统计中也称为 von Mises-Fisher分布。 我们应该注意到von-Mises-Fisher分布通常包含一个归一化的常数,我们在公式中避免了这个常数。 单个lobe可定义为 : G(v, d, \lambda) = e^{\lambda (\mathrm{v} \cdot d -1)} \tag{10.17}

其中v为方向(单位向量),d为lobe方向轴(分布的均值,也归一化),λ≥0为lobe锐度(控制角的宽,也称为浓度参数或扩散)。

为了构造球面基,我们使用给定数目的球面高斯函数的线性组合: F_G(\mathrm{v})=\sum_{k}{ w_kG(\mathrm{v}, \mathrm{d}_k, \lambda_k) } \tag{10.18}

将球函数投影到这个表示法中需要找到一组参数 {w_k, \mathrm{d}_k , λ_k} ,使重建误差最小化。 这个过程通常是通过数值优化来完成的,通常使用非线性最小二乘法优化(如Levenberg-Marquardt)。 请注意,如果我们允许在优化过程中整组参数发生变化,我们就不会使用函数的线性组合,因此方程10.18并不代表一组基。 只有选择一组固定的lobe,才能得到一个合适的基,使整个域都能很好地覆盖,只通过权值 w_k 拟合进行投影。 这样做也极大地简化了优化问题,因为现在它可以表述为普通的最小二乘优化。 如果我们需要在不同的数据集(投影函数)之间进行插值,这也是一个很好的解决方案。 在这种情况下,允许lobe方向和锐度变化是有害的,因为这些参数是高度非线性的。

这种表述的优点是SGs的许多操作都有简单的解析形式。 两个球面高斯函数的乘积是另一个球面高斯函数: G_1G_2=G(\mathrm{v}, \frac{\mathrm{d}'}{|| \mathrm{d}' ||} ,\lambda'), \\

其中: \mathrm{d}' =\frac{ \lambda_1 \mathrm{d}_1 + \lambda_2 \mathrm{d}_2 }{ \lambda_1 + \lambda_2 } , \lambda' =(\lambda_1+\lambda_2)|| \mathrm{d}' || \\

球面高斯函数的积分也可以通过解析计算: \int_\Omega G(\mathrm{v})d\mathrm{v} = 2 \pi \frac{1-e^{2\lambda}}{\lambda} \\

这意味着两个球面高斯积的积分也有一个简单的公式。

如果我们可以将光的radiance表示为球面高斯函数,那么我们可以将其乘积与以相同表示形式编码的BRDF进行照明计算。 由于这些原因,SGs在许多研究项目和工业应用中得到了应用。

各向异性高斯球面。 左:球面上的ASG和相应的自上而下的图。 右:ASG 的其他四个例子,显示了公式的表现力。

对于平面上的高斯分布,von Mises-Fisher分布可以推广到允许各向异性。 Xu等人引入了各向异性球面高斯(ASGs; 如上图所示),其定义为在单方向d上加上两个补充轴t和b,共同构成一个正交的切线坐标系: G(\mathrm{v} , [\mathrm{d}, \mathrm{t}, \mathrm{b}],[ \lambda, \mu ]) = S(\mathrm{v}, \mathrm{d}) e^{-\lambda(\mathrm{v} \cdot \mathrm{t})^2 - \mu(\mathrm{v} \cdot \mathrm{b})^2 } \tag{10.19}\\

其中λ,µ≥0控制lobes沿正切坐标系的两轴展开,S(v, d) = (\mathrm{v} \cdot \mathrm{d})^+ 为平滑项。 这个术语是方向统计中使用的Fisher-Bingham分布和计算机图形学中使用的ASGs之间的主要区别。 Xu等人还提供了积分、乘积和卷积算子的解析逼近。

尽管SGs有许多理想的属性,但它们的一个缺点是,与表格形式和一般有限范围(带宽)的内核不同,它们有全局支持。 对于整个球体来说,每个lobe都是非零的,尽管它的衰减相当快。 这种全局范围意味着,如果我们使用N个lobe来表示一个函数,我们将需要所有N个lobe来在任何方向上进行重建。

球谐函数(Spherical Harmonics)

球面调和函数(SH)是球面上的一组正交基函数。 基函数的正交集是这样一个集合: 它使得任意两个不同函数的内积为零。 内积是一个类似于点积的概念。 两个向量的内积是它们的点积:两个分量相乘的和。 类似地,我们可以通过考虑两个函数相乘的积分来推导出两个函数的内积的定义: < f_i(x),f_j(x) > \equiv \int f_i(x)f_j(x)dx \tag{10.20}

上式表示在x轴上进行积分, 对于球面函数,可以表示如下:

< f_i(n),f_j(n) > \equiv \int_{n\in \Theta} f_i(n)f_j(n)dn \tag{10.21}

其中n∈Θ表示在单位球上进行积分。

标准正交集是一个正交集,其附加条件是集合中任意函数与自身的内积等于1。 更正式地说,一组函数 { {f_j()} } 是标准正交的条件是 : <f_i(), f_j() > = \begin{cases} 0 & \text{where } i \neq j\\ 1 & \text{where } i = j \end{cases} \tag{10.22}\\

标准正交基函数。 左边是目标函数,中间是基函数的标准正交集,右边是缩放后的基函数。 对目标函数的近似结果用黑色虚线表示,原始函数用灰色表示以供比较。

上图所示的标准正交基函数不重叠。 这个条件对于非负函数的标准正交集是必要的,因为任何重叠都意味着一个非零内积。 在一定范围内具有负值的函数可以重叠,但仍然构成一个标准正交集。 这种重叠通常导致更好的近似,因为它允许基平滑。 不相交区域的基容易造成不连续。

标准正交基的优点是找到与目标函数最接近的近似的过程是直接的。 为了进行投影,每个基函数的系数是目标函数 f_{target}() 与相应基函数的内积: k_j =< f_{target}(), f_j() > \\ f_{target}() \approx \sum_{j=1}^{n}{ k_j f_j() } \tag{10.23}

在实践中,这个积分必须用数值计算,通常是通过蒙特卡罗采样,将分布在球体上的n个方向进行平均。

标准正交基在概念上类似于4.2.4节中介绍的三维向量的“标准基”。 标准基的目标不是函数,而是点的位置。 标准基由三个向量(每维一个)组成,而不是一组函数。 根据公式10.22中使用的相同定义,标准基是标准正交的。 将点投影到标准基上的方法也是一样的,因为系数是位置向量与基向量的点积的结果。 一个重要的区别是,标准基精确地再现了每一个点,而有限的基函数集只能近似它的目标函数。 结果永远不可能是精确的,因为标准基使用三个基向量来表示一个三维空间。 一个函数空间有无限多的维数,所以有限的基函数永远不能完美地表示它。

球谐是正交的和标准正交的,它们还有其他一些优点。 它们是旋转不变的,并且SH基函数的计算成本不高。 它们是单位长度向量的x、y和z坐标上的简单多项式。 然而,像球面高斯函数一样,它们具有全局特性,因此在重建过程中需要计算所有的基函数。 基函数的表达式可以在一些参考文献中找到,包括Sloan的陈述。 他的介绍值得注意的是,它讨论了许多使用球面谐波的实用技巧,包括公式,在某些情况下,着色器代码。 最近,Sloan还发现了进行SH重建的有效方法。

SH基函数按频率排列。 第一个基函数是常数,接下来的三个是线性函数,在球面上变化缓慢,接下来的五个是二次函数,变化稍微快一些,如下图。 低频函数(即在球体上缓慢变化的函数),如irradiance值,可以用相对较少的SH系数精确地表示(如我们将在第10.6.1节中看到的)。

球谐函数的前五个频率。 每个球谐函数都有正的区域(绿色)和负的区域(红色),当它们接近零时逐渐变黑。

球面谐波的许多运算在概念上很简单,可以归结为系数向量上的矩阵变换。在这些操作中,计算两个函数的乘积投影到球谐、旋转投影函数和计算卷积是最重要的。在实际中,SH中的矩阵变换意味着这些操作的复杂性是所使用的系数数量的二次方,这可能是一个巨大的代价。幸运的是,这些矩阵通常有特殊的结构,可以用来设计更快的算法。Kautz等人提出了一种优化旋转计算的方法,将它们分解为围绕x轴和z轴的旋转,Hable给出了一种流行的快速旋转低阶SH投影的方法, Green讨论了如何利用旋转矩阵的块结构来更快地计算。目前的技术状态是通过分解成带状(zonal)谐波来表示的,如Nowrouzezahrai等人所提出的。

球谱变换的一个常见问题,如下面描述的球谐和H-basis,是它们可以表现出一种视觉artifact,称为ringing(也称为Gibbs现象)。如果原始信号包含不能用带限近似表示的快速变化,重建将显示出振荡现象,在极端情况下,这个重建函数甚至可以产生负值,可以使用各种预过滤方法来解决这个问题。

其他球形表示

使用有限数目系数可以对球函数进行编码。 线性变换余弦(第10.1.2节)是一个例子,它可以有效地近似BRDF函数,同时具有在球体的多边形截面上易于积分的特性。

球面小波是一种空间局部平衡(具有紧密的支持)和频率(平滑)的基,允许高频函数的压缩表示。 球形分段常数基函数将球体划分成常值区域,以及依赖矩阵分解的双簇近似,也被用于环境光照。

10.3.3 半球形基

尽管上述基可以用来表示半球函数,但它们是非常浪费的, 因为信号的一半总是等于零。 在这些情况下,通常首选使用直接在半球域上构造的表示。 这对于定义在表面上的函数尤其相关:BRDF、入射radiance和到达物体给定点的irradiance都是常见的例子。 这些函数自然地局限于以给定曲面点为中心的半球,并与曲面法线对齐; 它们没有指向物体内部方向的值。

环境/高亮/方向 (Ambient/Highlight/Direction)

沿着这些线最简单的表述之一是一个常数函数和一个单一方向的组合,在这个方向上,信号在半球最强, 它通常被称为环境/高光/方向(AHD)基础,它最常见的用途是存储irradiance。AHD的名称代表了单个分量所代表的:一个恒定的环境光,加上一个方向光,该方向近似于“高光”方向的irradiance,以及大部分入射光集中的方向。AHD基通常需要存储八个参数, 两个角度用于方向向量,两种RGB颜色用于环境光和方向光强度。它的首次应用是在《雷神之锤3》中,即以这种方式存储动态对象的体积光, 从那时起,它便被用于许多游戏中,如《使命召唤》系列。

在这个表示法上的投影有点棘手。 因为它是非线性的,寻找近似给定输入的最优参数的计算非常昂贵。 在实践中,使用的是启发式, 首先将信号投影到球面谐波,并利用最优线性方向来定位余弦lobe, 给定方向,环境值和高亮值可以使用最小二乘最小化计算。 Iwanicki和Sloan展示了如何在非负向时执行这种投射。

辐射法向映射/半条命2 基(Radiosity Normal Mapping/Half-Life 2 Basis)

《半条命2》光照基。 三个基向量在切平面以上的仰角约26◦,他们的投影到那个平面的间隔120◦法线周围的间隔相等, 它们是单位长度,每一个都垂直于另外两个。

Valve为《半条命2》系列游戏使用了一种新的表示方法,即在辐射法向映射的背景下表示方向irradiance。 最初设计的目的是存储预计算的漫射光照,同时允许法线映射,现在它通常被称为《半条命2》的基。 它通过在切线空间的三个方向上采样来表示曲面上的半球函数, 参见上图。 这三个相互垂直的基向量在切空间中的坐标是 : m_0 = ( \frac{-1}{\sqrt{6}} , \frac{1}{\sqrt{2}} ,\frac{1}{\sqrt{3}} ) , m_1 = ( \frac{-1}{\sqrt{6}} , \frac{-1}{\sqrt{2}} ,\frac{1}{\sqrt{3}} ), m_2 = ( \frac{\sqrt{2}}{\sqrt{3}} , 0 ,\frac{1}{\sqrt{3}} ) \tag{10.24}

对于重建,给定切空间方向d,我们可以沿着三个基向量 E_0,E_1,E_2 插值: E(n)= \frac {\sum_{k=0}^2 max(m_x \cdot n, 0)^2 E_k} {\sum_{k=0}^2 max(m_x \cdot n, 0)^2 } \tag{10.25}

Green指出,如果改为在切空间方向d上预先计算以下三个值,则10.25式的代价会大大降低: d_k= \frac {max(m_k \cdot n, 0)^2} { \sum_{k=0}^2 max(m_k \cdot n, 0)^2 } \tag{10.26}

对于k = 0,1,2, 式10.25化简为 : E(n) = \sum_{k=0}^2 d_k E_k \tag{10.27}

Green描述了这种表示的其他几个优点,其中一些将在第11.4节中讨论。

《半条命2》的基可以很好地用于定向irradiance。Sloan发现这种表示产生的结果优于低阶球谐函数。

半球形谐波/ H-Basis

Gautron等人将球谐函数专门用于半球域,他们称之为半球谐波(HSHs)。 可以使用各种方法来执行这种处理。

例如,Zernike多项式是正交函数,类似于球谐函数,但定义在单位圆盘上。 与SH一样,这些可以用于在频域(频谱)上变换函数,这产生了许多方便的性质。 由于可以将一个单位半球转化为一个圆盘,因此可以用Zernike多项式来表示半球函数。 然而,用这些材质进行重建是相当昂贵的。 Gautron等人的解决方案既更经济,又允许系数向量上的矩阵乘法进行相对快速的旋转。

然而,HSH基的计算仍然比球谐函数更昂贵,因为它是通过将球体的负极移到半球的外边缘来构建的。 这种移位操作使得基本函数是非多项式的,需要计算除法和平方根,这在GPU硬件上通常是很慢的。 此外,基底在半球边缘始终是恒定的,因为它映射到球上的一个点之前的移动。 近似误差可能是相当大的附近的边缘,特别是如果只有几个系数(球谐带)使用。

Habel引入了H-basis,H基部分用于纵向参数化球谐基,部分用于纵向参数化HSH。 这个基,一个混合了移位和非移位的SH版本,仍然是正交的,同时允许有效的计算。

编辑于 2021-08-04 13:34

文章被以下专栏收录