1. 游戲貼圖是什麼意思
游戲貼圖是給模型帶來可視化效果的,一個模型是沒有顏色的,游戲貼圖可以表現出各種各樣的顏色/紋理,描述物體表面的材質。
游戲模型製作中用到了很多貼圖類型,通過不同類型貼圖的組合使用以達到最終需要得到的模型效果。最常見的類型有Diffuse、Emissive、Normal、Opacity、Specular、Roughness。具體的貼圖分類可以參考以下:
1. 顏色貼圖
顏色貼圖主要為Diffuse、Albedo、Base Color三種。一般認為這三者是等同的;
2. 凹凸貼圖
凹凸貼圖主要為Bump、Normal和Displacement三種,三種貼圖都是為模型提供更多的細節。其中Displacement有時用於改變模型的頂點位置,而Bump和Normal則不會改變模型的頂點位置;
3. 反射貼圖
與顏色貼圖中的Diffuse和Base Color一樣,反射貼圖中根據工作流的不同也有不一樣的貼圖類型;
4. 結構貼圖
主要有Ambient?Occlusion(AO,環境光遮蔽貼圖)、Cavity Map(縫隙圖)、Bent Normal Map(環境法線貼圖);
5. 光照與環境貼圖
主要有Light Map(光照貼圖)、Spherical Environment Map(球面環境貼圖)、Cube Map(立方體貼圖)、Radiosity Normal Map(輻射度法線貼圖)。
2. 游戲中的Decal(貼花)
在游戲開發中,Decal(貼花)效果是一種常見的視覺表現手段,用於實現彈孔、血跡、塗鴉等動態效果。本文總結了Decal在游戲引擎中的實現方式,包含多個方法,以供開發者參考。
首先,基於面片實現是Decal效果的一種簡單方法。僅需一個Quat的mesh和一張貼圖,便能實現Decal效果。然而,這種方法的缺點在於只能在平面上貼花。
其次,修改貼圖的方法是將物體的材質貼圖替換成原貼圖與Decal貼圖的混合。這種方法適用於靜態批量的物體,但同樣存在只能處理靜態物體的局限。
基於SubMesh的方法更為復雜且高效,通過獲取與目標投影相交的mesh,以及裁剪這些mesh以適應特定投影框,實現Decal效果。此過程涉及獲取所有可能與投影框相交的mesh,然後將mesh頂點數據變換到投影框空間,以方便裁剪。接著,獲取相交的三角形片,合並成新的IndexBuffer,使用新的Decal紋理重新渲染。對於邊緣三角形,可進行裁剪,最後整理頂點生成新的mesh。
多Pass實現方法與基於SubMesh類似,包含獲取所有相交的mesh,但在渲染結束後,再渲染一次,使用Decal的shader,將映射到decal框中的坐標作為uv值渲染出decal。Unity內置管線中的Projector使用了此方法。缺點是若投影框與多個mesh相交或mesh很大,性能消耗會顯著增加。
修改渲染shader實現則涉及判斷mesh與decal框相交時,將decal標記為需要渲染。修改mesh的shader,傳入decal投影框矩陣和數張decal貼圖。在FS中得到原始輸出顏色後,根據decal的顏色進行混合。此方法需要大量調整shader,較為復雜,且當mesh上的decal數量在運行時發生變化時,需要動態編譯shader變體。
基於後處理實現方法將decal整體視為一個長方體,渲染兩次以實現貼花效果。首先正常渲染其他物體,拿到渲染buffer和深度buffer。接著,將投影框作為長方體渲染,關閉Face Cull,將深度測試設置為GreatEqual,將結果標記到stencil buffer。再次渲染投影框,打開Face Cull,根據stencil buffer測試通過的位置繪制decal。這種方法不支持光照。
Deferred實現方法與上述方法相似,例如UE4中的DeferredDecal,使用這種方式。缺點是僅適用於Deferred渲染,不支持烘培光,因為烘培光在渲染gbuffer時添加。
使用Depth Buffer的方法首先進行深度預渲染,然後使用上述提到的方法將decal渲染到類似gbuffer的Depth Buffer上。在渲染gbuffer或forward渲染時,直接應用從Depth Buffer的采樣,融合到gbuffer中。此方法支持烘培光、Deferred和Forward管線,但性能消耗較大。
常見的問題包括垂直角度投影時可能出現的拉伸問題,可通過增加角度判斷,丟棄角度超過閾值的像素解決。邊緣處可能需要加上fade off效果,以避免突兀的邊界。在混合方式上,Decal材質可以提供base color、normal等屬性,當decal半透明時,需要仔細考慮與原圖base color等的混合方式。此外,通常Decal無法支持帶有骨骼動畫的物體。