基於 Unity 的一種透明通道壓縮處理


由於 Android 平台各種硬件標准的不統一,為了開發的軟件項目能夠在大部分 Android 機上完美運行,我們需要以較差的硬件支持為基礎做准備。

Android 平台基本上都支持對不帶 Alpha 通道的圖片進行 ETC1 壓縮。Android 4.3 由於對 OpenGL ES 3.0 的支持,添加了對透明圖的 ETC2 壓縮。

為了實現在大部分 Android 機上以低容量低存儲以及處理圖片,我們希望把一些比較大的透明圖用RGB圖替代,簡言之就是把 PNG 圖換成 JPG 圖存儲。

如何實現呢。要么是把透明通道單獨提取出來作為另一張圖進行存放。這樣處理下可以節省 Android 平台下至少一半的開銷。但是對 iOS 平台來說,則多了一張圖的開銷。當然,如果在項目設立之初就想到這個問題,那么完全可以分開打包。

針對大圖往往是許多小圖合成的圖集 Atlas,且 GPU 在處理圖片是總是需要 POT (Power of Two)大小的紋理這兩個特性。另一種處理方式是把小圖擠到半張 Atlas 里面,另外半張放透明度信息。這樣處理, iOS 平台下的開銷也就不會太大。其實,由於小圖往往長寬比不規則,很多原本需要一張大圖的Atlas完全可以放在半張圖里面。

本文主要是介紹后面的處理方式。當然,也就講個思路。先把圖片排到半張圖得到半圖,再利用 Mali 的 TCT 工具獲得所需的全圖。最后寫一個 Shader 來得到完整的圖片信息。搞定。

Unity 相關知識點

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)。

Mali 的 TCT 工具

命令行需要在bin目錄下執行。覺得不方便可以把路徑添加到環境變量 PATH,並把 .dll 文件都放到 C:\Windows\System32\ 目錄下(不知道是不是這里,筆者沒這么干,這個步驟也是YY的。。)。

PNG 轉為一半 JPG ,一半灰度圖的 KTX 文件:

$ etcpack [文件名].png img -c etc1 -aa -ktx

KTX 轉 JPG 格式(放到當前目錄下的 myImage文件夾):

$ etcpack [文件名].ktx myImage -ext JPG

Shader

Shader 的框架部分抄的 Particle Add Scaling -AlphaBlended.shader 文件。在頂點着色中進行了簡單的 MVP 轉換。在片段着色中取圖片上部分的RGB值,取下半部分的R值作為透明度。


^^ 正(wéi)直(suǒ)的版權銜接線 vv     全文出處:http://www.cnblogs.com/tangyikejun/p/4696877.html

幾種主要的紋理格式

1. DXT

DXT 是 DirectX 提供的一種壓縮格式。只能針對 POT 格式紋理進行處理。DDS 文件采用此種壓縮方式進行文件存儲。

  支持的紋理格式              占用空間

DXT1 RGB5A1 4bpp 壓縮比 4:1
DXT2 RGBA4444 8bpp 壓縮比 2:1
DXT3 RGBA4444 同上 同上
DXT4 通過線性插值生成 Alpha 同上 同上
DXT5 同上 同上 同上

DXT紋理壓縮

2. ETC

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 的編碼

3. PVRTC

PVRTC 分 4bpp 和 8bpp。具體的編碼方式參見 Wiki

Understanding PowerVR Series5XT: PVRTC, PVRTC2 and texture compression (PVRTC的原理以及與其他壓縮格式的對比的那個連接找不到了,也是在這個網站。。)


參考鏈接

Mali TCT 工具下載地址
Shader 官方手冊入口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM