您好,登錄后才能下訂單哦!
原文:http://www.jianshu.com/p/f7c3741f22af
Unity3D引擎對紋理的處理是智能的:不論你放入的是PNG,PSD還是TGA,它們都會被自動轉(zhuǎn)換成Unity自己的Texture2D格式。
在Texture2D的設(shè)置選項中,你可以針對不同的平臺,設(shè)置不同的壓縮格式,如IOS設(shè)置成PVRTC4,Android平臺設(shè)置成RGBA16等。
嗯,非常的智能。
但是,在一些進階的使用中,一些情況是難以滿足的。
比如,我們NGUI的圖集紋理,在Android平臺,使用ETC1紋理+Alpha通道圖的方式;iOS平臺,使用PVRTC4的紋理。
個別圖片紋理,要求清晰度較高的,使用RGBA16,但是使用RGBA16的漸變顯示圖片卻慘不忍睹;
一些要求高保真的,則需要直接使用最高質(zhì)量的RGBA32格式。
很多時候,隨著項目的復(fù)雜需求發(fā)展,單純的Unity紋理管理已經(jīng)無法滿足我們的需求了。這時候,往往需要我們做一些額外工作。
總結(jié)一下我自己的紋理壓縮方案:
手游開發(fā)(Android/iOS)中,我會使用3個級別的壓縮程度:高清晰無壓縮、中清晰中壓縮、低清晰高壓縮;4種壓縮方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。一般足夠應(yīng)付大部分的需求了。
Unity RGBA32 - 高清晰無壓縮.png
RGBA32等同于原圖了,優(yōu)點是清晰、與原圖一致,缺點是內(nèi)存占用十分大;對于一些美術(shù)要求最好清晰度的圖片,是首選。
要注意一些png圖片,在硬盤中占用幾KB,怎么在Unity中顯示卻變大?因為Unity顯示的是Texture大小,是實際運行時占用內(nèi)存的大小,而png卻是一種壓縮顯示格式;可以這樣理解,png類似于zip格式,是一個壓縮文件,只不過在運行時會自動解壓解析罷了。
Unity RGBA16,不抖動處理的漸變圖片慘不忍睹
既然叫RGBA16,自然就是RGBA32的閹割版。
對于一些采用漸變的圖片,從RGBA32轉(zhuǎn)換成RGBA16,能明顯的看出顏色的層疊變化,如上圖。
采用Floyd Steinberg抖動處理后,除非放大,否則肉眼基本看不出區(qū)別
RGBA16的優(yōu)點,內(nèi)存占用是RGBA32的1/2;搭配上Dithering抖動,在原尺寸下看清晰度一模一樣;
缺點,Unity原生不支持Dithering抖動,需要自己做工具對圖片做處理;對于需要放大、拉伸的圖片,Dithering抖動的支持不好,會有非常明顯的顆粒感。
Texture Packer工具中Image Format選擇RGBA4444,Dithering選擇FloydSteinberg
在我的項目中,TexturePacker具有非常重要的作用,像UI的圖集生成,預(yù)先生成好正方形的IOS PVRTC4圖集和非正方形的Android ETC1圖集、 縮放原圖50%等工作都由TexturePacker完成。
同樣,對圖像進行抖動處理,也是預(yù)先在TexturePacker使用FloydSteinberg算法進行圖像抖動,再在Unity中導(dǎo)入使用。
TexturePacker提供命令行工具,可以做成自動化的工具。具體方法這里不詳述。
Unity RGB16
而RGB16,是主要針對一些,不帶透明通道,同時長寬又不是2的次方的圖片;對于這些圖片,使用RGB16可以降低一半的內(nèi)存,但是效果會略遜于RGB32。
當(dāng)然了,RGB16其實也是可以搭配抖動,也能提升顯示效果;但同樣的Dithering抖動對拉伸放大是不友好的。
很多初學(xué)者都會疑惑,為什么游戲開發(fā)中經(jīng)??吹揭恍﹫D片,需要設(shè)置成2的次方?因為像ETC1、PVRTC4等這類在內(nèi)存中無需解壓、直接被GPU支持的格式,占用內(nèi)存極低,而且性能效率也是最好的。
但是,相對RGBA32,還是能肉眼看出質(zhì)量有所下降的。
ETC1+Alpha一般應(yīng)用在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在Unity中是直接支持的,不過要注意的細(xì)節(jié)是,它必須是二次方正方形;也就是說,長寬在二次方的同時,還必須要相等。
格式 | 內(nèi)存占用 | 質(zhì)量 | 透明 | 二次方大小 | 建議使用場合 |
---|---|---|---|---|---|
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 | ★★★ | 有 | 需要二次方,長寬可不一樣 | 盡可能默認(rèn)使用,在質(zhì)量不滿足時再考慮使用上邊的格式 |
RGB(ETC1) | 1/8 | ★★★ | 無 | 需要二次方,長寬可不一樣 | 盡可能默認(rèn)使用,在質(zhì)量不滿足時再考慮使用上邊的格式 |
PVRTC4 | 1/8 | ★★ | 無 | 需要二次方正方形,長寬一樣 | 盡可能默認(rèn)使用,在質(zhì)量不滿足時再考慮使用上邊的格式 |
內(nèi)存占用,相對于RGBA32做比較
質(zhì)量星級,更多是本人感受,僅供參考
一個商業(yè)項目,混搭多種紋理格式是在所難免的事情。把項目紋理劃分成高、中、低三種質(zhì)量需求,是這個方案的落腳點。
在項目中,盡可能是使用ETC1和PVRTV4等GPU直接支持的圖片格式,不僅內(nèi)存占用低、性能也更好;當(dāng)出現(xiàn)質(zhì)量不及格時,再逐步的提升壓縮格式,來滿足需要。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。