Texture UV Atlas

UV的Atlas操作在某些場合下還是很有用途的,比如很常見的對於場景進行的LightMap烘焙時。這時就需要對於整個場景中的幾何體元進行Light Map UV的生成,也即是將其投影到了一張Texture中去,且要求所有的幾何體元對應唯一的Light Map UV(即在這一張紋理中沒有相互重疊,以便取到正確的烘焙信息)。UV Atlas其實是一個傳統的NP hard問題,一般來說都是通過某些最優化方法來實現,而且牽涉的面也較廣。在DX SDK中也有實現該操作的API:D3DXUVAtlasCreate

D3DXUVAtlasCreate方法的具體使用就是給它傳入一個D3DXMESH類型的數據源,然後它處理後返回一個包含UV Atlas結果的Mesh。其中有以下兩點需要一些特別的注意:

  • 傳入的源Mesh至少需要包含兩個基本信息:位置信息與一個UV通道。不過這裏源Mesh中的UV通道中的數據並不需要在D3DXUVAtlasCreate進行處理進使用,而主要是因爲返回的Mesh與傳入的Mesh含有相同的頂點描述結構,因而需要一個UV通道在結果Mesh中保存Atlas後的UV值。而其它的一些參數多是一些功能性設置,如結果Texture的大小,兩塊UV之間的間距等,具體可以參考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb205479(v=vs.85).aspx
  • 結果Mesh與源Mesh一定包含相同的三角形數量,但卻可能包含不同的頂點數量(結果Mesh中的頂點數量大於等於源Mesh中的頂點數量)。這個其實還是比較容易理解的,因爲可能有很多頂點在空間上處於相同的位置因而合併後成爲一個頂點,但是atlas後其對應的UV可能並不相同,因而就需要對頂點進行分割。
  • D3DXUVAtlasCreate處理的Mesh規模爲:頂點與三角形的數量均不超過65535。這個限制的影響其實還是比較大的,特別是對於較大一些規模的場景生成Light Map UV時。這樣的話就需要需要對整個場景進行再劃分,對於每塊兒單獨操作處理;然後操作完成以後再對每塊兒的Atlas texture進行合併等,這裏可以需要對UV進行一些再修改操作

其實D3DXUVAtlasCreate的使用還是比較簡單的,但是其得到的結果卻並不是很理想,比如說對於上面的這樣一個場景使用D3DXUVAtlasCreate進行UV生成以後得到的結果如下圖所示,其中的碎面較多,而且在Mesh表面分佈較爲複雜時atlas後的UV並不是很整齊,而且排布也不是太工整,這樣在場景使用貼圖時再加紋理的讀取插值問題可能會變得更加難看。

而較好的排布得到的結果就應該下圖所示:

關於UV的Atlas,這也是一個獲得廣泛研究的問題(Mesh Parameterization),比較經典的就是一種叫做Least Square Conformal Map的解決方法(將問題用Conformal Map參數化後用Least Square方法來計算得到較爲優化的解),而且也有不少的開源幾何算法庫已經實現了該算法,如OpenNLCGAL等(好像都是INRIA做的),可以嘗試使用。另外,以下這些網站也比較有用,可以參考一下:

http://www.inf.usi.ch/hormann/parameterization/index.html

http://the-witness.net/news/2010/03/graphics-tech-texture-parameterization/

http://www.fseraph.com/?p=408

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