Unity遊戲開發圖片紋理壓縮方案

Unity3D引擎對紋理的處理是智能的:不論你放入的是PNG,PSD仍是TGA,它們都會被自動轉換成Unity本身的Texture2D格式git

在Texture2D的設置選項中,你能夠針對不一樣的平臺,設置不一樣的壓縮格式,如IOS設置成PVRTC4,Android平臺設置成RGBA16等。github

嗯,很是的智能。算法

可是,在一些進階的使用中,一些狀況是難以知足的。工具

好比,咱們NGUI的圖集紋理,在Android平臺,使用ETC1紋理+Alpha通道圖的方式;iOS平臺,使用PVRTC4的紋理。性能

個別圖片紋理,要求清晰度較高的,使用RGBA16,可是使用RGBA16的漸變顯示圖片卻慘不忍睹;spa

一些要求高保真的,則須要直接使用最高質量的RGBA32格式。.net

不少時候,隨着項目的複雜需求發展,單純的Unity紋理管理已經沒法知足咱們的需求了。這時候,每每須要咱們作一些額外工做。命令行

總結一下我本身的紋理壓縮方案:code

紋理壓縮的策略

手遊開發(Android/iOS)中,我會使用3個級別的壓縮程度:高清晰無壓縮、中清晰中壓縮、低清晰高壓縮;4種壓縮方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。通常足夠應付大部分的需求了。orm

高清晰無壓縮 - RGBA32

 
Unity RGBA32 - 高清晰無壓縮.png

RGBA32等同於原圖了,優勢是清晰、與原圖一致,缺點是內存佔用十分大;對於一些美術要求最好清晰度的圖片,是首選。

要注意一些png圖片,在硬盤中佔用幾KB,怎麼在Unity中顯示卻變大?由於Unity顯示的是Texture大小,是實際運行時佔用內存的大小,而png倒是一種壓縮顯示格式;能夠這樣理解,png相似於zip格式,是一個壓縮文件,只不過在運行時會自動解壓解析罷了。

中清晰中壓縮 - RGBA16 + Dithering

RGBA16 + Dithering

 
Unity RGBA16,不抖動處理的漸變圖片慘不忍睹

既然叫RGBA16,天然就是RGBA32的閹割版。
對於一些採用漸變的圖片,從RGBA32轉換成RGBA16,能明顯的看出顏色的層疊變化,如上圖。

 
採用Floyd Steinberg抖動處理後,除非放大,不然肉眼基本看不出區別

RGBA16的優勢,內存佔用是RGBA32的1/2;搭配上Dithering抖動,在原尺寸下看清晰度如出一轍;

缺點,Unity原生不支持Dithering抖動,須要本身作工具對圖片作處理;對於須要放大、拉伸的圖片,Dithering抖動的支持很差,會有很是明顯的顆粒感。

如何進行Dithering抖動?

 
Texture Packer工具中Image Format選擇RGBA4444,Dithering選擇FloydSteinberg

在個人項目中,TexturePacker具備很是重要的做用,像UI的圖集生成,預先生成好正方形的IOS PVRTC4圖集和非正方形的Android ETC1圖集、 縮放原圖50%等工做都由TexturePacker完成。

一樣,對圖像進行抖動處理,也是預先在TexturePacker使用FloydSteinberg算法進行圖像抖動,再在Unity中導入使用。

TexturePacker提供命令行工具,能夠作成自動化的工具。具體方法這裏不詳述。

RGB16

 
Unity RGB16

而RGB16,是主要針對一些,不帶透明通道,同時長寬又不是2的次方的圖片;對於這些圖片,使用RGB16能夠下降一半的內存,可是效果會略遜於RGB32。

固然了,RGB16其實也是能夠搭配抖動,也能提高顯示效果。

要注意的是,Dithering抖動對拉伸放大是不友好的

低清晰高壓縮 - ETC1+Alpha/PVRTC4

不少初學者都會疑惑,爲何遊戲開發中常常看到一些圖片,須要設置成2的次方?由於像ETC一、PVRTC4等這類在內存中無需解壓、直接被GPU支持的格式,佔用內存極低,並且性能效率也是最好的。

可是,相對RGBA32,仍是能肉眼看出質量有所降低的。

ETC1

ETC1+Alpha通常應用在Android版的UI圖集中,ETC1不帶透明通道,因此須要外掛一張一樣是ETC1格式的Alpha通道圖。方法是,在原RGBA32的原圖中,提取RGB生成第一張ETC1,再提取A通道,填充另外一張ETC1的R通道;遊戲運行時,Shader將兩張ETC1圖片進行混合。

生成Alpha通道圖的方法可參考:
http://blog.csdn.net/u010153703/article/details/45502895

後來,因爲不想基於Unity API生成透明圖,我生成Alpha通道圖的方法。我使用Python的一個png.py庫,用Python腳原本處理:

 
png.py生成alpha圖

 

要配合ETC1+Alpha,還須要Shader支持,這裏參考直接修改NGUI的Unlit/Transparent With Colored的Shader。


 
 

PVRTC4

PVRTC4在Unity中是直接支持的,不過要注意的細節是,它必須是二次方正方形;也就是說,長寬在二次方的同時,還必需要相等。

幾種紋理格式的對比

格式 內存佔用 質量 透明 二次方大小 建議使用場合
RGBA32 1 ★★★★★ 無需 清晰度要求極高
RGBA16+Dithering 1/2 ★★★★ 無需 UI、頭像、卡牌、不會進行拉伸放大
RGBA16 1/2 ★★★ 無需 UI、頭像、卡牌,不帶漸變,顏色不豐富,須要拉伸放大
RGB16+Dithering 1/2 ★★★★ 無需 UI、頭像、卡牌、不透明、不會進行拉伸放大
RGB16 1/2 ★★★ 無需 UI、頭像、卡牌、不透明、不漸變,不會進行拉伸放大
RGB(ETC1) + Alpha(ETC1) 1/4 ★★★ 須要二次方,長寬可不同 儘量默認使用,在質量不知足時再考慮使用上邊的格式
RGB(ETC1) 1/8 ★★★ 須要二次方,長寬可不同 儘量默認使用,在質量不知足時再考慮使用上邊的格式
PVRTC4 1/8 ★★ 須要二次方正方形,長寬同樣 儘量默認使用,在質量不知足時再考慮使用上邊的格式
  • 內存佔用,相對於RGBA32作比較
  • 質量星級,更可能是本人感覺,僅供參考

一個商業項目,混搭多種紋理格式是在所不免的事情。把項目紋理劃分紅高、中、低三種質量需求,是這個方案的落腳點。

在項目中,儘量是使用ETC1和PVRTV4等GPU直接支持的圖片格式,不只內存佔用低、性能也更好;當出現質量不及格時,再逐步的提高壓縮格式,來知足須要。

做者:陳小霖GO 連接:https://www.jianshu.com/p/f7c3741f22af 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索