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的操作就可以使用跟此處的頂點烘焙類似的方法來進行優化;此外,爲了提升最小二乘法的結果還可以根據具體的情況來引入不同的正規矩陣來進行更進一步的優化。

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