請按照下列最佳做法為 Android 遊戲的紋理呈現最佳顯示效果和效能。
紋理是 3D 藝術的核心元素。能在大部分裝置上順利執行的 3D 遊戲,會先採用專為充分利用圖像處理器而設計的 3D 藝術。本指南特別介紹行動裝置的紋理最佳化及最佳做法,藉此提高遊戲的效能並盡可能降低耗電量,同時維持較高的視覺品質。
本文部分內容以 Arm Limited 的著作為基礎,並受版權保護。
建立紋理圖集
紋理圖集是一種內含多個圖形物件的影像資料的紋理,例如 3D 網格或 2D 精靈。有別於每個物件有自己的紋理,而是使用圖集紋理合併每個物件的影像。
如果想達成最佳算繪效能,盡可能減少遊戲影格的繪製呼叫次數相當重要。針對不同物件使用相同紋理,是將物件合併為單一繪製呼叫的一個因素。對於受 CPU 限制的遊戲,減少繪製呼叫次數特別重要,因為每次繪製呼叫都是由繪圖驅動程式處理,進而給 CPU 造成負擔。紋理圖集也會減少遊戲執行階段資料中的紋理資產檔案數量。您可以將數百甚至數千個紋理合併為數量較少的紋理圖集檔案中。
建立 3D 網格時,應規劃紋理圖集版面配置。如果在製作網格資產之前編寫圖集,網格資產必須根據紋理圖集展開 UV。如果是在編寫後使用繪製軟體中的合併或圖集建立工具建立圖集,則 UV 島必須根據紋理重新安排。
引擎專屬的繪製呼叫批次
Unity 遊戲引擎提供繪製呼叫批次功能,可自動合併物件。只有在可共用一般材質 (包括紋理) 及標示為靜態的情況下,物件才有資格自動批次處理。
如要使用 Unreal Engine 4,則必須手動設定批次。您可以在 3D 軟體中合併物件,再將物件匯入 Unreal。Unreal 也包含 UE4 Actor Merging 工具,可合併網格及建立紋理圖集檔案。
產生 mipmap
mipmap 是解析度較低的紋理版本。指定紋理的 mipmap 集合稱為 mipmap 鏈結。鏈結中的每個後續 mipmap 層級都會低於先前層級的解析度。mipmap 用來在轉譯期間實作紋理 LOD (細節層級)。將 mipmap 紋理與紋理階段結合在一起時,圖形硬體會使用片段所占用的紋理空間,從 mipmap 鏈結中選擇一個層級。算繪 3D 場景時,與靠近相機的物件相比,遠離相機的同一物件會使用較低解析度的 mipmap。
與非 mipmap 紋理相比,mipmap 紋理會耗用較多記憶體。額外的 mipmap 層級會將紋理的記憶體足跡提高 33%。如果在距相機固定距離處繪製紋理,則生成 mipmap 不需要用到記憶體。
正確使用 mipmap 可提高 GPU 效能。提供較低解析度的 mipmap 層級不僅會降低記憶體頻寬用量,也能改善紋理快取駐留。
mipmap 也能減少紋理鋸齒,進而提升視覺品質。在遠離相機的區域,紋理鋸齒看起來可能會像閃爍效果。
引擎專屬的 mipmap 詳細資料
Unreal Engine 4 需要為 2 的冪次方的紋理尺寸 (例如 512x1024 和 128x128),才能使用 mipmap。如果一個或兩個紋理尺寸不是 2 的冪次方,則不會產生 mipmap 鏈結。
Unity 引擎會自動調整尺寸不是 2 的冪次方的紋理,以建立 mipmap。請確保來源紋理檔案的尺寸是 2 的冪次方,以避免這種縮放。
選取適當的紋理篩選模式
紋理篩選是一項硬體轉譯功能,會影響轉譯三角形的視覺外觀。正確使用紋理篩選功能,有助於提升情境的視覺品質。系統提供多個紋理篩選模式,每種模式在轉譯改善和耗費之間都有不同的平衡。耗費包括計算時間和記憶體頻寬。三種常用的紋理篩選模式包括:臨近 (或點)、雙線性和三線性。非均質是額外的紋理篩選方法,可與雙線性或三線性篩選功能結合使用。
臨近
「臨近」是最簡單也是耗費最低的紋理篩選模式。「臨近」使用來源紋理中的指定座標對單個紋素進行採樣。使用「臨近」篩選轉譯的三角形將具有塊狀外型或像素化外觀,尤其在靠近相機轉譯時,會更明顯。
雙線性
雙線性篩選會對來源紋理中的指定座標周圍的四個紋素進行採樣。對這四個紋素進行平均處理以確定片段的紋理顏色。雙線性過濾可讓像素之間的過渡更平滑,避免最近鄰過濾時出現的塊狀物。靠近相機轉譯的三角形會顯示模糊效果,而非像素化效果。由於額外的紋素採樣和平均處理,雙線性篩選的耗費高於「臨近」篩選。
三線性
當您算繪網格時,如果各頂點與相機的距離有所不同,可以在算繪期間選取多個 mipmap 層級。兩個 mipmap 層級之間的變化可能會導致在轉換點出現明顯的銳減。三線性篩選會對兩個不同的 mipmap 層級執行雙線性篩選功能,並內插結果,藉此柔化這些轉換。使用多個 mip 層級和插值的做法,使三線性篩選在計算方面的成本比雙線性篩選的更高。
非均質
非均質篩選會提高以相對於相機的極端角度轉譯的紋理網格的視覺品質。地平面是這類網格的常見範例。非均質篩選必須使用 mipmap 紋理來運作。您可以設定在轉譯期間套用的非均質篩選比率或層級。非均質篩選的耗費會隨著層級的增加而增加。
模式選取策略
雙線性篩選通常是指效能和視覺品質的最佳平衡。三線性篩選需要額外的記憶體頻寬,因此請選擇性使用。在許多情況下,相較於三線性過濾搭配 1 倍非均質過濾,雙線性過濾搭配 2 倍非均質過濾所呈現的效果和效能較佳。將非均質層級提升超過 2 倍時耗費極高,而且能為重要遊戲資產進行選擇性操作。
紋理篩選可能占 GPU 總能源用量的一半,請視情況選擇較簡單的紋理篩選條件,以減少遊戲的電力需求。
最佳化紋理大小
在達成所需的影像品質的同時,盡量縮小紋理尺寸。查看紋理資產,檢查紋理是否過大。這個原則同時適用於離散紋理和圖集紋理。如果您的遊戲支援許多裝置,而且這些裝置包含多種解析度和效能功能,您可以考慮為適用的裝置類別,建立低解析度和高解析度的紋理資產版本。
在轉譯材質中使用多種紋理的網格時,請考慮選擇性降低某些紋理的解析度。舉例來說,如果使用 1024 x 1024 的漫反射紋理,您或許可以將粗糙度或金屬貼圖紋理降低至 512 x 512,盡可能減少對影像品質的影響。確認所有這類規模實驗造成的影響,以免影響到理想的品質等級。
使用適當的色域
許多用於紋理製作的軟體套件都會使用 sRGB 色域運作和匯出。做為色彩處理的漫反射紋理可以使用 sRGB 色域。不作為色彩處理的紋理 (例如金屬、粗糙度或法線圖),不應以 sRGB 色域匯出。
遊戲引擎紋理設定包含一個紋理是否使用 sRGB 色域的參數。
這類紋理的像素資料不會當成色彩資料使用,因此採用 sRGB 色域會產生不正確的視覺效果。
使用紋理壓縮功能
「紋理壓縮」是一種圖像壓縮演算法,能夠用於未經壓縮的像素資料,進而產生可在算繪期間由繪圖硬體快速解壓縮的紋理。只要有效使用紋理壓縮功能,就能降低記憶體用量及提高效能,並盡量減少對視覺品質的影響。Android 最常見的紋理壓縮演算法有 3 種:ETC1、ETC2 和 ASTC。以現代化遊戲來說,ASTC 通常是最適合的主選項,如果您的遊戲目標裝置不支援 ASTC,則可選用 ETC2。
ETC1
所有 Android 裝置都支援 ETC1。ETC1 只支援 RGB 色彩資料的每像素四位元模式。ETC1 不支援 Alpha 管道。許多支援 ETC1 的遊戲引擎都可用來指定第二個 ETC1 紋理,以代表 Alpha 管道資料。
ETC2
超過 90% 的使用中 Android 裝置都支援 ETC2。不支援 OpenGL ES 3.0 API 的舊型裝置無法使用 ETC2。相較於 ETC1,ETC2 新增了:
- Alpha 管道同時支援 8 位元與單位元「punchthrough」
- sRGB 版本的 RGB 和 RGBA 紋理
- 單管道和雙管道,R11 和 RG11,紋理
ASTC
超過 75% 的使用中 Android 裝置都支援 ASTC。ASTC 提供可設定的壓縮區塊大小,方便您精細地掌控指定紋理的壓縮比率與影像品質之間的平衡。ASTC 通常能夠在採用與 ETC2 相同的記憶體大小時,獲得卓越的品質,或是以小於 ETC2 的記憶體大小提供類似的容量。
紋理壓縮速度
如果您的遊戲含有大量紋理,紋理壓縮作業可能需要較長的時間。ETC 和 ASTC 都提供可選取的壓縮品質設定。品質較高的設定需要更長的時間才能壓縮。在開發過程中,建議您先調低品質等級來縮短壓縮時間,並在建立重要版本前提高品質等級。
遊戲引擎的紋理壓縮
如果您使用遊戲引擎,可能需要在專案層級選擇紋理壓縮格式 (ETC 或 ASTC)。為了支援多個壓縮格式以獲得最大相容性,可能需要執行其他作業。透過 Google Play Asset Delivery 的紋理壓縮格式指定目標功能,您可以在遊戲中加入多種格式,也可以在安裝時只為個別裝置提供最佳格式。
展開 UV
盡可能將 UV 島保持直線。這可以透過以下方式幫助您的紋理:
- UV 島的裝設變得更容易,從而減少空間浪費。
- 直線 UV 降低了紋理的「階梯效應」。
- 良好的 UV 裝設可確保從紋理中取得最佳解析度。
- 提高紋理品質 (即使 UV 因拉直而略微變形)。
模型上呈現的紋理接縫效果不佳。試著將任何 UV 接縫放在較不顯眼的位置。為協助建立更優質的法線圖,請在銳邊處分割 UV 島,並在島周圍留出一些空間。
避免難以察覺的細節
創作圖片時,請勿加入看不到的細節,尤其是專為螢幕較小的裝置所設計的遊戲。對於房間一角幾乎無法看見的小椅子模型,製作精細的 4096x4096 紋理純屬浪費。在某些情況下,您可能需要放大邊緣 (增加額外亮點) 和陰影,藉此改善形狀感知。
烘焙細節
相較於個人電腦或遊戲主機,行動裝置的螢幕較小,其圖形硬體功能也更弱。因此,與其在執行階段中計算環境光遮蔽或鏡面高光等效果,不如考慮盡可能「烘焙」成漫反射紋理。這有助於確保效能以及細節的可見性。
使用顏色色調
如果您能夠建立自訂著色器,並網格具有類似或統一的色彩配置,請考慮在適用的網格上使用顏色色調。如果使用顏色色調,則會使用灰階紋理,使用的紋理記憶體會比 RGB 紋理的少。著色器會針對每個頂點套用色彩資料,為網格套用顏色。另一個著色方法是使用 RGB 遮罩,並根據遮罩的顏色範圍套用紋理。
包裝紋理管道
在轉譯具有多個紋理的材質時,尋找機會將僅使用單個顏色管道的紋理組合成使用所有三個顏色管道的單個紋理。這麼做可以降低記憶體用量,並減少片段著色器執行的紋理採樣作業次數。
包裝時,請將最詳盡的資料指派給綠色管道。由於人眼對綠色較為敏感,因此圖形硬體通常會為綠色管道指派更多位元。舉例來說,粗糙度/平滑度貼圖通常包含比金屬貼圖更多的細節,更適合指派給綠色管道。
針對使用 Alpha 管道的材質,如果您只是在打包好的紋理中使用兩個管道,請考慮將 Alpha 管道資料放入打包好的紋理中,而非漫反射紋理。視漫反射紋理的格式而定,這可協助您縮減紋理尺寸,或透過省略 Alpha 管道資料來提高視覺品質。
請務必將打包好的紋理設為線性 RGB 色域,而非 sRGB。
建立法線圖
「法線對應」是一種讓 3D 模型不用額外幾何圖形就能呈現細節的技術。可使用法線圖模擬褶皺或螺栓等可能需要許多三角形來建模的特徵。視遊戲的風格和方向而定,法線對應可能不一定適用。
法線貼圖會產生一些效能成本,在低端裝置上應謹慎使用。法線圖需要額外的紋理,因此需要額外的紋理採樣和片段著色器計算。
法線圖最佳做法
以下是一些製作法線圖的最佳做法:
使用 Cage
Cage 是低多邊形模型的較大或推出版本,並需要包含高多邊形模型才能在法線圖烘焙期間正常工作。Cage 用於限制法線圖烘焙期間的光線投射距離,並有助於避免法線圖上分割法線接縫的問題。
烘焙比對 (依網格名稱)
若烘焙軟體支援該功能,則烘焙比對 (依網格名稱)。這項功能可減少法線圖投影錯誤的問題。如果物件之間距離太近,就可能會意外地將法線圖投影到錯誤的面上。依網格名稱比對,可確保只能在正確的表面進行烘焙。如要進一步瞭解 Substance Painter 中的這項功能,請參閱這個網頁。如要進一步瞭解 Marmoset Toolpack 中的這項功能,請參閱這個網頁。
網格爆炸
如果進行烘焙時無法按網格名稱比對,請考慮網格爆炸。探索網格可移動各部分的位置,讓法線圖不會投影到錯誤的表面上。如果您還要烘焙環境光遮蔽,您可能需要使用未爆炸的網格單獨執行該烘焙。
盡量減少接縫
持續在硬邊使用 UV,可能會導致可見接縫,將硬邊的 UV 分割,以盡量減少這種效果。設定平滑群組時,原則上角度應小於 90 度。UV 接縫需要在三角形上使用不同的平滑群組。