Unity-特定于平臺(tái)的覆蓋的紋理壓縮格式
Unity 支持許多常見(jiàn)的圖像格式作為導(dǎo)入紋理的源文件(例如 JPG、PNG、PSD 和 TGA)。但是,3D 圖形硬件(例如顯卡或移動(dòng)設(shè)備)在實(shí)時(shí)渲染期間不會(huì)使用這些格式。這種硬件要求紋理以專門(mén)格式進(jìn)行壓縮,這些格式針對(duì)快速紋理采樣進(jìn)行了優(yōu)化。不同的平臺(tái)和設(shè)備分別都有自己的專有格式。
默認(rèn)情況下,Unity Editor 會(huì)自動(dòng)將紋理轉(zhuǎn)換為最合適的格式,以匹配您選擇的構(gòu)建目標(biāo),而且構(gòu)建中僅包含轉(zhuǎn)換后的紋理。源資源文件保留為原始格式,位于項(xiàng)目的?Assets
?文件夾中。但是,大多數(shù)平臺(tái)支持多種紋理壓縮格式,可供您進(jìn)行選擇。
Unity 為每個(gè)平臺(tái)設(shè)置了默認(rèn)格式,但您可以覆蓋默認(rèn)格式并為某些紋理選擇不同的壓縮格式(例如,如果使用紋理作為遮罩,只有一個(gè)通道,則可以選擇使用 BC4 格式來(lái)降低文件大小,但同時(shí)保持質(zhì)量)。
本頁(yè)包含以下信息:
紋理壓縮概念
受支持平臺(tái)的默認(rèn)格式
所有支持的紋理壓縮格式
移動(dòng)端和 WebGL 特有格式
關(guān)于 iOS 的注意事項(xiàng)
關(guān)于 tvOS 的注意事項(xiàng)
關(guān)于 Android 的注意事項(xiàng)
有關(guān)導(dǎo)入紋理以及如何設(shè)置覆蓋的一般信息,請(qǐng)參閱紋理導(dǎo)入設(shè)置 (Texture Import Settings)。
紋理壓縮概念
本頁(yè)用到了以下概念:
RGB?是一種顏色模型,其中紅色、綠色和藍(lán)色通過(guò)各種方式疊加在一起以再現(xiàn)各種顏色。
RGBA?是具有 Alpha 通道的?RGB?版本,支持混合和不透明度更改。
每像素位數(shù) (bpp)?表示單個(gè)像素所需的存儲(chǔ)量。該值越低,可以在 GPU 的緩存中存儲(chǔ)的像素越多,從而可以更快地訪問(wèn)紋理。
可變比特率 (VBR)?表示每像素的位數(shù)不是固定值,而是取決于實(shí)際內(nèi)容。VBR 僅適用于?Crunch 壓縮,僅限于磁盤(pán)上的紋理大小。內(nèi)存中的大小與使用基礎(chǔ)紋理格式時(shí)的大小相同(例如,RGB Compressed DXT1 對(duì)應(yīng) RGB Crunched DXT1)。
Crunch 壓縮是一種基于 DXT 或 ETC 紋理壓縮的有損壓縮格式(壓縮過(guò)程中會(huì)丟失部分?jǐn)?shù)據(jù))。在運(yùn)行時(shí),紋理在 CPU 上解壓縮為 DXT 或 ETC,然后上傳到 GPU。Crunch 壓縮有助于紋理在磁盤(pán)上使用盡可能少的空間,但對(duì)于運(yùn)行時(shí)內(nèi)存使用量沒(méi)有影響。Crunch 紋理可能需要很長(zhǎng)時(shí)間進(jìn)行壓縮,但在運(yùn)行時(shí)的解壓縮速度非???。
受支持平臺(tái)的默認(rèn)格式
下表顯示了每個(gè)平臺(tái)使用的默認(rèn)格式。

所有支持的紋理壓縮格式
下表顯示了每個(gè)平臺(tái)上可用的紋理壓縮格式選項(xiàng)以及磁盤(pán)上生成的壓縮文件大小(基于 256x256 像素圖像)。
選擇紋理壓縮格式需要在文件大小、質(zhì)量和壓縮時(shí)間之間取得平衡:質(zhì)量越高,文件越大。為了獲得最佳性能,尤其是在移動(dòng)設(shè)備上,請(qǐng)使用應(yīng)用程序的目標(biāo)硬件所支持的每像素位數(shù)最少的格式,只要該格式能夠提供足夠的視覺(jué)質(zhì)量即可。
不同平臺(tái)有不同的硬件,并經(jīng)優(yōu)化后可最有效地處理特定壓縮格式。使用目標(biāo)平臺(tái)支持的紋理壓縮格式時(shí),GPU 可以直接使用該格式,并且平臺(tái)不用消耗任何資源即可將紋理解壓縮為支持的格式。這樣可以提高應(yīng)用程序的性能。
如果使用目標(biāo)平臺(tái)不支持的紋理壓縮格式,紋理將解壓縮為 RGBA 32 位(除非另有說(shuō)明)并與壓縮紋理一起存儲(chǔ)在內(nèi)存中。這會(huì)增加紋理加載時(shí)間并使用額外的內(nèi)存,這意味著選擇不兼容的格式可能會(huì)影響應(yīng)用程序的性能。
下表顯示了每種壓縮格式支持的平臺(tái)。
注意:在內(nèi)存中的大小基于 256x256 像素紋理。

僅限在 Nvidia Tegra GPU 上。
在不支持 sRGB DXT 的 Web 瀏覽器上使用線性渲染,紋理在運(yùn)行時(shí)被解壓縮為 RGBA32。
Windows Direct3D 11、Windows OpenGL 4 和 macOS Metal。在具有 Direct3D 10 著色器模型 4 和 OpenGL 3 GPU 的平臺(tái) (Windows) 上以及在 macOS OpenGL 上,BC6H 紋理被解壓縮為 RGBA Half,而 BC7 紋理被解壓縮為 RGBA32。
在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或 Nvidia Tegra;WebGL 2。
在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或?GL_EXT_texture_rg?擴(kuò)展;需要 WebGL 2。
在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 和?GL_EXT_texture_norm16?擴(kuò)展。
在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或?GL_OES_texture_half_float?擴(kuò)展;需要 WebGL 2 或 WebGL 上的?OES_texture_half_float?擴(kuò)展。
可從 DDS 文件導(dǎo)入紋理,但僅支持 DXT、BC 壓縮格式或未壓縮像素格式。
移動(dòng)端和 WebGL 特有格式
下表中的格式僅在 Android、iOS、tvOS 和 WebGL 上受支持。
注意:大小基于 256x256 像素紋理。

注意:
只有少部分瀏覽器在 WebGL 上支持 ETC1 和 ETC2/EAC。
運(yùn)行 OpenGL ES 2 時(shí),Android 不支持ETC2。在這種情況下,紋理在運(yùn)行時(shí)解壓縮為?Android Build Settings?中的?ETC2 fallback?指定的格式,或者?Platform-specific overrides?面板的 Android 選項(xiàng)卡上指定的格式。
運(yùn)行 OpenGL ES 2 時(shí),iOS 和 tvOS 不支持 ETC2。
需要?GL_KHR_texture_compression_astc_ldr?擴(kuò)展或 Vulkan 支持。
需要 A8 GPU 或更高版本。
需要?WEBGL_compressed_texture_astc?擴(kuò)展。
需要?GL_KHR_texture_compression_astc_hdr?擴(kuò)展。如果不支持此擴(kuò)展,則紋理將在運(yùn)行時(shí)解壓縮為 RGB9E5 格式,從而失去了 Alpha 通道。
所有 PVRTC 格式都需要具有二次冪尺寸的正方形紋理。
僅限在 PowerVR GPU 上。
關(guān)于 iOS 的注意事項(xiàng)
選擇默認(rèn)的紋理壓縮設(shè)置 (PVRTC) 可獲得更大的兼容性。如果您的應(yīng)用程序不包含 OpenGL ES 2 支持,則可以選擇一種 ASTC 格式。這些格式提供更好的質(zhì)量和靈活性,并且壓縮速度比 PVRTC 快。
關(guān)于 tvOS 的注意事項(xiàng)
Unity 僅支持具有 Metal 支持的 tvOS 設(shè)備。該平臺(tái)上的默認(rèn)紋理壓縮格式是 ASTC。如果手動(dòng)添加 OpenGL ES 2,請(qǐng)確保將紋理壓縮格式更改為 PVRTC 或 ETC,以免在運(yùn)行時(shí)進(jìn)行紋理解壓縮。
關(guān)于 Android 的注意事項(xiàng)
常規(guī)紋理
除非您的應(yīng)用程序針對(duì)的是特定硬件(例如 Nvidia Tegra 或 Imagination PowerVR),否則必須在幾種壓縮格式和未壓縮格式之間進(jìn)行選擇,這種情況下需要考慮不同的取舍因素:

HDR 紋理
對(duì)于高動(dòng)態(tài)范圍 (HDR) 紋理,請(qǐng)從以下格式中進(jìn)行選擇:
ASTC HDR 是 Android 設(shè)備上唯一可用于 HDR 紋理的壓縮格式。這種格式需要 Vulkan 或?GL_KHR_texture_compression_astc_hdr?支持。與低動(dòng)態(tài)范圍紋理一樣,這是最靈活的格式。
RGB9e5 是一種打包格式,不含 Alpha 通道。所有運(yùn)行 Vulkan 或 OpenGL ES 3.0 的設(shè)備以及搭載 Nvidia Tegra GPU 的設(shè)備都支持這種格式。
RGBA Half 是半精度的未壓縮浮點(diǎn)格式。這種格式占用的內(nèi)存是 RGB9e5 的兩倍,但具有一個(gè) Alpha 通道,并且受到大多數(shù)設(shè)備的支持。
以不同的 APK 發(fā)布到多種設(shè)備
您可以發(fā)布以不同硬件為目標(biāo)的多個(gè)?Android 包?(APK)。例如,要發(fā)布兩個(gè)單獨(dú)的 APK(一個(gè)適用于支持 OpenGL ES 3.0 及更高版本的設(shè)備,另一個(gè)適用于僅支持 OpenGL ES 2.0 的設(shè)備),請(qǐng)按照以下步驟操作:
1.構(gòu)建一個(gè)以 OpenGL ES 3 為目標(biāo)的 APK。
訪問(wèn) Android 的?Player Settings(菜單:Edit > Project Settings > Player Settings,然后選擇 Android 類別)。
向下滾動(dòng)到?Graphics APIs?部分。
確保 OpenGL ES 2 不在列表中。
構(gòu)建 APK(菜單:File > Build Settings,然后單擊?Build)。
2.構(gòu)建一個(gè)以 OpenGL ES 2 為目標(biāo)的單獨(dú) APK。
訪問(wèn) Android Player Settings。
向下滾動(dòng)到?Graphics APIs?部分。
在列表中添加 OpenGL ES 2 并刪除 OpenGL ES 3 和 Vulkan。
構(gòu)建 APK。
3.將這兩個(gè) APK 發(fā)布到 Google Play 應(yīng)用商店。
當(dāng)用戶下載應(yīng)用程序時(shí),Google Play 應(yīng)用商店會(huì)自動(dòng)為其設(shè)備安裝最相關(guān)的 APK。
有關(guān)發(fā)布多個(gè) APK 文件的更多信息,請(qǐng)參閱 Android 開(kāi)發(fā)者文檔中的以下主題:
發(fā)布多個(gè) APK
Google Play 應(yīng)用商店 APK 過(guò)濾。