因爲 Android 平臺各類硬件標準的不統一,爲了開發的軟件項目可以在大部分 Android 機上完美運行,咱們須要以較差的硬件支持爲基礎作準備。php
Android 平臺基本上都支持對不帶 Alpha 通道的圖片進行 ETC1 壓縮。Android 4.3 因爲對 OpenGL ES 3.0 的支持,添加了對透明圖的 ETC2 壓縮。css
爲了實如今大部分 Android 機上以低容量低存儲以及處理圖片,咱們但願把一些比較大的透明圖用RGB圖替代,簡言之就是把 PNG 圖換成 JPG 圖存儲。html
如何實現呢。要麼是把透明通道單獨提取出來做爲另外一張圖進行存放。這樣處理下能夠節省 Android 平臺下至少一半的開銷。可是對 iOS 平臺來講,則多了一張圖的開銷。固然,若是在項目設立之初就想到這個問題,那麼徹底能夠分開打包。框架
針對大圖每每是許多小圖合成的圖集 Atlas,且 GPU 在處理圖片是老是須要 POT (Power of Two)大小的紋理這兩個特性。另外一種處理方式是把小圖擠到半張 Atlas 裏面,另外半張放透明度信息。這樣處理, iOS 平臺下的開銷也就不會太大。其實,因爲小圖每每長寬比不規則,不少本來須要一張大圖的Atlas徹底能夠放在半張圖裏面。tcp
本文主要是介紹後面的處理方式。固然,也就講個思路。先把圖片排到半張圖獲得半圖,再利用 Mali 的 TCT 工具得到所需的全圖。最後寫一個 Shader 來獲得完整的圖片信息。搞定。ide
Unity 對於平臺不支持的壓縮格式,會默認轉爲 RGBA 32bpp。而 Android 平臺廣泛支持的含透明度格式爲 RGBA 16bpp。若是採用 RGB ETC 4bpp 的兩幅圖,那麼須要 8bpp(使用該格式可能會致使遮罩出現問題)。若是可以把兩幅圖放在同一張紋理裏面,那麼可以再節省一半,大概4bpp(shader處理的時候會比較消耗GPU)。工具
Unity 在爲 Android 打包時,默認對JPG採用 ETC1,對PNG採用 RGBA 16。網站
NPOT 的圖最終會被轉爲 POT 的圖,並且 Unity 會把 NPOT 的圖會被轉爲 RGBA 32 格式 (GUI Texture 支持 NPOT,圖片格式不會改,可是最終送 GPU 的時候仍是會轉爲 POT)。編碼
命令行須要在bin目錄下執行。以爲不方即可以把路徑添加到環境變量 PATH,並把 .dll 文件都放到 C:\Windows\System32\
目錄下(不知道是否是這裏,筆者沒這麼幹,這個步驟也是YY的。。)。es5
PNG 轉爲一半 JPG ,一半灰度圖的 KTX 文件:
$ etcpack [文件名].png img -c etc1 -aa -ktx
KTX 轉 JPG 格式(放到當前目錄下的 myImage文件夾):
$ etcpack [文件名].ktx myImage -ext JPG
Shader 的框架部分抄的 Particle Add Scaling -AlphaBlended.shader
文件。在頂點着色中進行了簡單的 MVP 轉換。在片斷着色中取圖片上部分的RGB值,取下半部分的R值做爲透明度。
DXT 是 DirectX 提供的一種壓縮格式。只能針對 POT 格式紋理進行處理。DDS 文件採用此種壓縮方式進行文件存儲。
支持的紋理格式 佔用空間
DXT1 RGB5A1 4bpp 壓縮比 4:1
DXT2 RGBA4444 8bpp 壓縮比 2:1
DXT3 RGBA4444 同上 同上
DXT4 經過線性插值生成 Alpha 同上 同上
DXT5 同上 同上 同上
ETC1 (Ericsson Texture Compression) 僅僅支持 RGB 4bpp 的圖,不支持 Alpha 通道。
OpenGL ES 3.0 能支持 ETC2,可是 Android 4.3 纔開始支持 GLES 3.0。
ETC1 採用 4X4 的像素區域編入64位空間,也就是 4bpp。ETC 將像素區域分爲4X2(2X4)兩個部分。每一個部分有一個基色,在基色基礎上給兩個部分分別 444RGB 的偏移或者 555RGB/333RGB的偏移。每一個部分還有3位的亮度選擇。 Each pixel is then offset from the base color by adding one of four signed values to the base color for its half of the 4×4 group.
關於ETC2的官方介紹
ETC 紋理壓縮和 Alpha 通道處理
ETC 拼接圖 Shader 的編碼
PVRTC 分 4bpp 和 8bpp。具體的編碼方式參見 Wiki 。
Understanding PowerVR Series5XT: PVRTC, PVRTC2 and texture compression (PVRTC的原理以及與其餘壓縮格式的對比的那個鏈接找不到了,也是在這個網站。。)