參考
為什么需要紋理壓縮
移動端紋理壓縮格式
干貨:Unity游戲開發(fā)圖片紋理壓縮方案
Creator使用壓縮紋理
常用紋理和紋理壓縮格式
移動設(shè)備的紋理壓縮方案
各種移動GPU壓縮紋理的使用方法
一絮识、DXT PVR ETC
在軟件開發(fā)绿聘,特別是三維應(yīng)用中,紋理隨處可見次舌,但受限于網(wǎng)絡(luò)環(huán)境和硬件能力熄攘,紋理也是一大瓶頸。而且在一般的三維應(yīng)用中垃它,紋理所占大小基本都會在1/2以上鲜屏,模型中往往超過2/3烹看。或許你會說洛史,紋理不就是一張圖嗎惯殊,有那么重要嗎?如下兩張對比圖也殖,可能你會認(rèn)為前者逼格高土思,但對于正常人而言,后者顯然要好很多忆嗜。正是有了紋理己儒,如同在骨架上賦予了皮膚,讓我們的應(yīng)用更加的逼真捆毫,貼近現(xiàn)實闪湾。
而你能想象到嗎?如上的模型一共有三張紋理绩卤,其中之一效果如下:
看上去怪怪的途样。其實在紋理的壓縮中,人們先想到了如何去除冗余信息濒憋,對稱的部分只保留一份何暇,盡可能讓不同的部分緊湊,充分利用好每一個像素來保存有效數(shù)據(jù)凛驮。得益于對稱在大自然中的普遍性裆站,這種方式確實極大的減少了紋理像素。
紋理的拼接是紋理壓縮的開始黔夭,采用不同的壓縮方式對紋理最終的大小影響也是顯著的邮破。比如上面的這張紋理在不同壓縮格式下的大小差別也是非常顯著的(原始文件為tga格式渗柿,通過Photoshop轉(zhuǎn)換為其他格式卒落,默認(rèn)選項):
(注:原作者在評論中承認(rèn)筆誤哆姻,jpg實際上是有損壓縮)如果按照上面表格的邏輯疚鲤,用jpg或png格式就好了堤如,無損壓縮佳头,而且也是最小的氨鹏。確實在很多情況下這是一個比較好的選擇颜屠,比如網(wǎng)絡(luò)帶寬有限辰妙,這樣可以很好的節(jié)約帶寬和下載時間,而Bmp甫窟,tga密浑,png以及jpg都是無損格式。但這類壓縮存在一個致命缺陷粗井,他們都是基于整幅圖片下進(jìn)行的壓縮尔破,比如霍夫曼編碼等街图,這樣像素和像素之間在解碼的過程中存在依賴關(guān)系,無法直接實現(xiàn)單個像素級別的解析懒构,這就發(fā)揮不了顯卡的并發(fā)能力餐济,更重要的是問題在于無論是png還是jpeg最終在顯存中解碼后都是RGBA的紋理格式,因此并無法減少顯存的占用率胆剧。比如一張256256的RGBA紋理絮姆,無論是png還是jpg格式,雖然文件大小不一樣秩霍,在顯卡中的大小仍然是256256*4的顯存空間篙悯。
不同于png、jgp這種硬盤壓縮方式而言铃绒,DXT,ETC等紋理壓縮方式可以在游戲運行中無需CPU解壓就被GPU直接采樣鸽照,可以極大的減少內(nèi)存和帶寬的占用,提升運行效率颠悬,對移動游戲而言更是如此移宅。
1.DXT
DXT是一種有損紋理壓縮算法,微軟的Direct中支持椿疗,DXT的格式包括DXT1~DXT5漏峰,其中DXT1和DXT5較為多見,后面會做詳細(xì)討論届榄∏城牵可以說DXT是目前應(yīng)用最廣泛的紋理壓縮格式,可以認(rèn)為所有的PC端顯卡都支持DXT壓縮铝条,維基百科記錄靖苇,該專利有效期到2017年10月2號。
DXT算法非常容易理解班缰,而且整體看上去效果不錯贤壁,但如果對局部特寫,會發(fā)現(xiàn)在細(xì)節(jié)上會有很多丟失埠忘,這也是算法本身導(dǎo)致的脾拆,畢竟每個塊只有兩個顏色,而其他顏色都是在這兩個顏色區(qū)間的差值莹妒,如果當(dāng)前區(qū)域內(nèi)還有其他顯著顏色則必然會有丟失名船。
這種信息的丟失主要集中在比較細(xì)的邊界中,但DXT1在壓縮率上是RGB的6倍旨怠,這種問題可以通過提高紋理分辨率的方式來解決渠驼,高寬放大41%(1.41*1.41=1.9881),這樣整個紋理是以前的2倍鉴腻,但壓縮率還能保持為3倍迷扇,也是可以接受的百揭。在DXT中還有一個主要的損失,就是RGB的24位轉(zhuǎn)為了16位顏色蜓席,16位中R&B各占5位信峻,但是G占了6位,這是因為人眼對綠色最為敏感瓮床。
另外一個問題就是DXT3和DXT5之間的對比盹舞,相比DXT1不支持透明度(但支持是否透明),DXT5要大一倍(多了64bit)隘庄,和之前顏色保存方案一樣對透明度也保存了兩個16位的顏色和對應(yīng)的調(diào)色板踢步,對RGBA的效果也得到了保證,但DXT3思路不一樣丑掺,它是對每一個像素保存了4bit的透明度获印,同樣也是多了64bit,但此時畢竟只有16個透明度選項街州,相比DXT5兼丰,在壓縮率上相當(dāng),但對透明色的處理不夠細(xì)膩唆缴,因此在實用性上并不推薦DXT3鳍征。
盡管DXT在細(xì)節(jié)上有明顯硬傷,在總體效果不錯面徽,而且確實是一種強(qiáng)大的壓縮方式艳丛,所以在多數(shù)紋理壓縮選擇中都是最佳方案,幾乎可以認(rèn)為是PC下的標(biāo)準(zhǔn)壓縮格式趟紊。
2.PVR&ETC
也許是出于專利和商業(yè)角度氮双,也許確實DXT在移動端確實無法滿足要求,DXT并沒有在移動端得到很大的支持霎匈,相反戴差,在iOS設(shè)備中支持的是PVR壓縮,在Android中支持的是ETC壓縮铛嘱。
DXT在細(xì)節(jié)上缺陷明顯暖释,最重要的原因是當(dāng)把紋理分為4*4像素的區(qū)域塊后,每個塊之間都是獨立的弄痹,盡管這極大的簡化了壓縮算法饭入,但卻丟失了相鄰塊之間這種普遍的相似性。這是算法本身導(dǎo)致的肛真,而PVR則會考慮該區(qū)域塊對應(yīng)的右側(cè),下側(cè)和右下側(cè)的三個區(qū)域塊的關(guān)聯(lián)性爽航。
從現(xiàn)實的角度來看蚓让,受制于專利和硬件廠商乾忱,我們并沒太多選擇的余地历极,Android下就要用ETC窄瘟,iOS下只能PVR,而在PC上不用DXT估計就要被嘲諷了蹄葱。但這也是一個很棘手的問題,比如在WebGL下竣况,特別是Android下差異化很大,是否支持紋理壓縮摹恨,甚至在同一個設(shè)備不同的瀏覽器睬塌,因為驅(qū)動的不一致,可能系統(tǒng)自帶的會支持ETC壓縮歇万,而微信等QQ瀏覽器下并不支持揩晴。而且華為的手機(jī)貌似在瀏覽器級別下都不支持ETC(硬件支持,還是驅(qū)動的問題)贪磺。而如果在移動設(shè)備上不用壓縮硫兰,顯存是有限的,除非你在數(shù)據(jù)量上做出犧牲寒锚,怎么解決都很矛盾劫映,相比而言,iOS下則要舒服很多刹前。
格式 | 壓縮比 | GPU支持 | 描述 | 圖片要求 |
---|---|---|---|---|
DXT | DXT1:0.3/DXT5:0.6 | Windows\Android(Nvidia Tegra and Intel Bay Trail) | 分為DXT1-DXT5這五個級別泳赋,DXT1 適用于不具有透明度或者僅具有一位Alpha的貼圖,DXT3和DX5支持包含4位alpha通道的RGB紋理 | 無 |
ATC RGBA/RGB | RGBA:0.25/RGB:0.125 | Qualcomm -Adreno | 高通GPU支持格式喇喉,支持帶有Alpha的RGB紋理壓縮祖今。 | 無 |
PVRTC RGBA/RGB | 2bit:0.125/4bit:0.25 | PowerVR | IOS平臺都支持,支持每個像素2位或者4位的紋理,包含或者不包含alpha通道都可以;PVRTC 2-bpp把一個8×4的像素單元組壓成一個64位的數(shù)據(jù)塊千诬,壓縮效果比較差耍目;PVRTC 4-bpp把一個4×4的像素單元組壓成一個64位的數(shù)據(jù)塊。游戲中使用4位壓縮更多徐绑。 | 尺寸為2的N次冪邪驮,并且寬高相同。 |
ETC1 RGB 4Bit | 0.125 | 支持Opnegl ES2.0的GPU | OpenGL ES2.0版本支持傲茄,移動GPU均支持的一個格式毅访,遺憾的是不支持Alpha通道。ETC1把一個4x4的像素單元組壓成一個64位的數(shù)據(jù)塊盘榨。游戲開發(fā)中采用最多的格式喻粹,不過麻煩的是需要對Alpha通道進(jìn)行單獨存儲,Unity5.4.3版本之后提供了官方支持 | 尺寸為2的N次冪较曼,長寬可不同 |
ETC2 ARGB/RGB 4bit | RGBA:0.25/RGB:0.125 | 支持Opnegl ES3.0的GPU | OpenGL ES 3.0以上才支持磷斧,補(bǔ)全了ETC1不支持Alpha通道,支持更高質(zhì)量的壓縮。雖然如此捷犹,從Android官方數(shù)據(jù)來看弛饭,還有相當(dāng)大的設(shè)備是采用Opengl ES2.0;使用需要謹(jǐn)慎萍歉,不過隨著設(shè)備更新?lián)Q代侣颂,開發(fā)時間周期比較長的游戲可以考慮直接使用 | 尺寸為4的倍數(shù) |
Unity官網(wǎng)對每個平臺默認(rèn)的紋理壓縮格式以及使用建議給出了詳細(xì)描述,需要注意的是:在不同移動GPU平臺下選擇GPU支持的壓縮紋理枪孩,就可以在不需要CPU解壓的情況下直接被GPU采樣憔晒,節(jié)省CPU內(nèi)存和帶寬,也可以節(jié)省存儲的體積蔑舞。如果目標(biāo)平臺不支持設(shè)置的壓縮格式拒担,紋理將解壓為RGBA32或者RGB24,浪費CPU時間和內(nèi)存攻询。
二从撼、ASTC
參考幾種主流貼圖壓縮算法的實現(xiàn)原理
從IOS9(A8架構(gòu))Apple 手機(jī)開始支持ASTC壓縮格式 ,如果考慮放棄Apple 6代之前的手機(jī)兼容問題了钧栖,可以直接使用了低零。相對于PVRTC2/4而言,ASTC(4X4)的壓縮比會增加到0.25拯杠,不過顯示效果也會好很多掏婶,而且不需要把圖片設(shè)置為方形。
Using ASTC Texture Compression for Game Assets 說明的比較詳細(xì)潭陪,也給出了一些使用上的建議雄妥,即針對不同貼圖類型給出不同的壓縮方案最蕾。
三、laya egret支持情況
1.laya問答 H5游戲能使用壓縮紋理(ETC茎芭,PVR等)嗎揖膜?
Q:H5游戲能使用壓縮紋理(ETC誓沸,PVR等)嗎梅桩?
A:部分瀏覽器會不支持(比如safari)
Q:那laya里面能根據(jù)不同瀏覽器(或不同平臺)使用不同壓縮格式的紋理嗎?
A:你自己是可以獲取到當(dāng)前是哪個瀏覽器的拜隧,自行處理即可
2.LAYA Runtme目前支持 ETC/DXT或者PVR這類格式嗎?在文檔中沒有找到這類的說明
LayaAir目前暫時還不支持ETC/DXT/PVR這類格式宿百!關(guān)注layaAir的版本引擎更新日志即可,支持了我們會及時告知洪添!
3.Egret 內(nèi)存分析-RES加載資源后存在雙份內(nèi)存無法釋放的問題
支持pvr垦页、etc已經(jīng)在計劃中。