Vertex Baking

顶点颜色渲染是一种较早的渲染方法,它为模型的三维网格中的每个顶点提供一组单独的颜色值,然后在传入硬件进行光栅化渲染时GPU会根据顶点的颜色对每个像素进行相应的插值而得到Pixel上的颜色值,进而为多边形着上渐变色。由其操作模式可知,一个三角形内部的像素受到其关联的三个顶点上的颜色值所影响而不论三角形的大小,因而若三角形的密度较大时这种方法还是很不错的,但是,当整个网格中三角形的密度较小时(大面种区域上有较少的三角形),就会得到不够平滑的着色效果。不过使用顶点颜色的渲染方式来表示模型表面一些较为低频的信息还是蛮不错的,比如AO等。一些早期(包括现在)的游戏引擎中就选择以顶点颜色来存储AO信息从而取代LightMap的作用以节省各种空间并提高效率。

 

上左图为对一个场景进行基于RT的AO烘焙的结果;右图为使用顶点着色的方法得到的结果,从其中可以看出使用顶点颜色来进行AO效果的烘焙效果还是不错的。当然,顶点颜色并不只能存储AO信息,其它一些Mesh表面的信息均可以通过一定的方式向顶点中存储并在渲染时使用。
一般来说将外部信息向Mesh的顶点中进行烘焙主要以下几种方法:

  1. 从当前顶点处直接采样外部信息并做为其对应的颜色值。在此种方式下,比如对于AO的烘焙就是直接根据场景计算该点外的AO值即可;
  2. 在Mesh表面上使用某种方式的采样(一般是均匀采样)并根据不同采样点对当前顶点的权重来计算外部信息在当前顶点下的颜色均值。一个三角形在渲染插值时其内部的像素只会受到其三个顶点的影响,因而一个顶点处的颜色值在计算时也只需考虑其所关联的那些三角形上的采样点即可。每个采样点对于该顶点的权重则可以直接由其重心座标来计算。
  3. 类同于第二种方法,同样是在Mesh表面上设置采样点,只不过在由采样点计算顶点值时并不直接使用均匀权重综合的方法来计算,而是增加使用某些优化算法来进行,比如Least Square等(Least Square Vertex Baking中提出的这种方法)。

Least Square based Baking

接下来简单介绍下基于最小二乘法的顶点值烘焙方法(关于Least square介绍的资料也很多):给定Mesh表面的均匀采样点集P = (p1, ..., pm) ,对于其中的每个采样点p分别存储相应的信息值(AO或其它要烘焙的信息值)f(p)以及其所关联到的三角形索引Ti。假设,是采样点p在其关联的三角形Ti 中所对应的重心座标,rs t则是该三角形所对应的三个顶点的索引,c(k)网格中的顶点k所对应的烘焙信息值。采样点p 处最终得到的实际信息值I(p)则是在渲染时通过对三角形Ti三个顶点上的属性进行硬件(或软件)插值而得到,其插值计算公式如下所示:

其中的c(r(p)), c(s(p)), c(t(p))分别表示当前的采样点p所在的三角形对应的三个顶点上的颜色。然后,将此处的重心座标形式进行转化表示,用B(i, k)表示采样点pi相对于顶点k的重心座标(或直接表示采样点pk间的关系)。这里要注意:当采样点pi与顶点k处于同一个三角形上时则有,否则B(i,k)=0;也即在进行顶点颜色插值时(不管硬件还是软件)pi点的颜色只受其所在三角形的三个顶点颜色影响。如此一来原始I(p)即可以表示为下式:
[1]

此时关于采样位置上的采样值f(p)与目标值I(p)间的最小二乘关系就可以描述这下式所示:

此时原始问题即转化为解此最小二乘关系描述的式子即可。将式[1]代入到上式中可得

将上式中的均转化为下标的形式更加清晰:

[2]
上式给出了在具有n个顶点的模型上得到m个采样点时的最小二乘关系。根据多元函数的极值特性,在F取得最小值时的必要条件为:

由式[2]可得的推导式为:

而由= 0可得:

然后可得,对于中的所有= 0时有:

引入并构造矩阵形式可得:
[3]

其中有:

X则是我们要使用最小二乘法进行估值的目标对象,即网格中每个顶点处的烘焙值。其是一个n维的列向量(前面假设网格中有n个顶点),即:

在上式[3]中即得到一个关于X的超多维线性方程,但是注意其中的A:在一个采样点p只能出现在一个三角形内部或两个三角形的公共边上(在采样时避免直接采到网格的顶点上),那么其最多就关联到三个或四个顶点(即有影响权重的有效顶点),如此一来A就是一个相当稀疏的矩阵,但是即便如此直接求解也不不太容易。不过还好,可以借助于开源的矩阵计算库,这里使用UMFPACK(前面博客有过介绍),这是佛罗里达州立大学的一个开源项目,而且效率、效果都很不错。

如此一来就可以得到在最小二乘方法下的顶点烘焙值,之后进行相应的使用与渲染即可。这里有一些简单的结果,分别采用前述的后两种方法来将一张纹理的信息烘焙到一个细分的Qaud的顶点中(密度为50x50),其效果如下列所示:

原始图

 

Average                                                                                        

Least Square

注意其中的Average方法与Least square方法:直观上看起来后一种方法的结果并没有前一种方法的好,前者看起来更加平滑;但是实际上直接计算两张渲染结果图像的相似度(逐Pixel的距离计算)倒的确是Least Square方法会有所提高。Least Square方法是一种也比较常用的优化算法,可以根据情况用在不同的场合中,比如之前提到的Light Probe的操作就可以使用跟此处的顶点烘焙类似的方法来进行优化;此外,为了提升最小二乘法的结果还可以根据具体的情况来引入不同的正规矩阵来进行更进一步的优化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章