【URP】Unity[紋理壓縮]算法多平臺對比
【從UnityURP開始探索游戲渲染】專欄-直達(dá)
紋理壓縮技術(shù)發(fā)展節(jié)點
- ?早期階段 2000年代初?
- DXT/S3TC成為PC和主機(jī)平臺主流,采用4×4像素塊壓縮,但移動端支持有限。
- PVRTC(2008年)專為PowerVR GPU設(shè)計,要求紋理尺寸為2的冪次方且寬高相等,成為iOS早期標(biāo)準(zhǔn)。
- ?移動平臺標(biāo)準(zhǔn)化 2012-2014年?
- ETC1(2012年)成為Android基礎(chǔ)格式,但缺乏透明通道支持。
- ETC2(OpenGL ES 3.0強(qiáng)制支持)擴(kuò)展了RGBA和sRGB支持,2013年后中高端Android設(shè)備普及。
- ASTC(2012年推出)由ARM開發(fā),支持靈活分塊(4x4至12x12)和NPOT紋理,2014年后A8/iPhone 6及以上設(shè)備支持。
- ?現(xiàn)代統(tǒng)一化趨勢 2020年后?
- ASTC逐漸成為Android/iOS首選,壓縮比和質(zhì)量優(yōu)于ETC2/PVRTC。
- Unity Crunched壓縮(如ETC2+二次壓縮)用于進(jìn)一步減少紋理體積。
ASTC(Adaptive Scalable Texture Compression)?
實現(xiàn)原理
- ?分塊壓縮?:將紋理劃分為4×4至12×12像素的塊(Block),每個塊獨立壓縮為128位固定大小?。
- ?顏色插值?:每個塊存儲2個端點顏色(RGB或RGBA)和權(quán)重網(wǎng)格(Weight Grid),通過插值計算中間顏色值?。
- ?動態(tài)分區(qū)?:根據(jù)顏色分布自動選擇最優(yōu)分區(qū)方式(如4×4塊可拆分為2×2子塊),平衡壓縮比與質(zhì)量?。
示例
- ?ASTC 4×4 RGBA?:
- 原始數(shù)據(jù):4×4=16像素×32位(RGBA)= 512位
- 壓縮后:128位(8:1壓縮比)
- 解碼時,通過端點顏色和權(quán)重插值還原每個像素的RGBA值?。
ETC2(Ericsson Texture Compression 2)?
實現(xiàn)原理
- ?4×4塊壓縮?:每個塊分為兩個2×4子塊,子塊間通過1位標(biāo)記選擇橫/豎分割方式?。
- ?顏色模式?:
- ?Individual模式?:子塊獨立存儲RGB444顏色(高對比度區(qū)域)?。
- ?Differential模式?:子塊存儲RGB555基色+RGB333偏移量(低對比度區(qū)域)?。
- ?透明通道?:通過額外64位數(shù)據(jù)存儲Alpha值(ETC2+Alpha)?。
示例
- ?ETC2 RGB?:
- 原始數(shù)據(jù):4×4=16像素×24位(RGB)= 384位
- 壓縮后:64位(6:1壓縮比)
- 解碼時,根據(jù)子塊模式選擇基色+偏移量計算最終顏色?。
PVRTC(PowerVR Texture Compression)?
實現(xiàn)原理
- ?雙通道壓縮?:僅壓縮RGB通道,Alpha通道單獨處理(PVRTC2支持RGBA)?。
- ?顏色索引?:每個4×4塊存儲2個主色(RGB565)和64位顏色索引表,通過插值生成中間顏色?。
- ?固定尺寸?:僅支持2的冪次方紋理(如256×256)?。
示例
- ?PVRTC4?:
- 原始數(shù)據(jù):4×4=16像素×24位(RGB)= 384位
- 壓縮后:64位(6:1壓縮比)
- 解碼時,通過主色和索引表插值還原顏色,但透明通道需額外處理?。
DXT(DirectX Texture Compression)?
實現(xiàn)原理
- ?DXT1?:
- 4×4塊存儲2個RGB565顏色和16位插值索引(無Alpha)?。
- ?DXT5?:
- 4×4塊存儲2個RGB565顏色+2個8位Alpha極值+16位Alpha插值索引?。
- ?塊狀偽影?:高對比度區(qū)域易出現(xiàn)色帶(如漸變紋理)?。
示例
- ?DXT1 RGB?:
- 原始數(shù)據(jù):4×4=16像素×24位(RGB)= 384位
- 壓縮后:64位(6:1壓縮比)
- 解碼時,通過端點顏色和插值索引計算中間顏色?。
壓縮方式對比
| ?格式? | ?壓縮比? | ?透明支持? | ?適用平臺? | ?典型問題? |
|---|---|---|---|---|
| ?ASTC? | 4:1~12:1 | 是 | iOS(A8+)/Android(ES3.1) | 低端設(shè)備兼容性差? |
| ?ETC2? | 6:1 | 是(需擴(kuò)展) | Android(ES3.0+) | 高對比度區(qū)域色帶明顯? |
| ?PVRTC? | 4:1~6:1 | 是(PVRTC2) | iOS | 強(qiáng)制2的冪次方尺寸? |
| ?DXT? | 4:1~6:1 | 是(DXT5) | PC/主機(jī) | 移動端不支持? |
多平臺壓縮方案對比
| ?格式? | ?支持平臺? | ?壓縮比? | ?優(yōu)勢? | ?劣勢? |
|---|---|---|---|---|
| ?ASTC? | iOS(A8+)、Android(ES3.1+) | 4x4塊=8bit/像素 | 高靈活性,支持NPOT和透明通道4 | 低端Android設(shè)備可能不兼容 |
| ?ETC2? | Android(ES3.0+) | 8bit/像素 | 廣泛兼容,支持透明通道2 | 壓縮質(zhì)量低于ASTC,塊狀偽影明顯 |
| ?PVRTC? | iOS(全系列) | 4bit/像素 | 蘋果硬件原生優(yōu)化1 | 強(qiáng)制2的冪次方尺寸,透明通道效果差 |
| ?DXT? | PC/主機(jī) | 4-8bit/像素 | DirectX高效解碼2 | 移動端不支持,高細(xì)節(jié)紋理易失真 |
URP中各平臺推薦方案與問題
?iOS平臺?
- ?首選ASTC 4x4?:平衡質(zhì)量與性能,但需放棄iPhone 5s等舊設(shè)備。
- ?備選PVRTC4?:兼容性最佳,但漸變和透明區(qū)域易出現(xiàn)色帶。
?Android平臺?
- ?高端設(shè)備ASTC?:需檢測OpenGL ES 3.1支持,否則回退ETC2。
- ?ETC2通用方案?:可通過分離Alpha通道(ETC1+Alpha圖)優(yōu)化透明紋理,增加復(fù)雜度。
?特殊情況處理?
- ?高保真需求?:使用RGBA32無壓縮,但內(nèi)存占用激增(如1024x1024紋理達(dá)16MB)。
- ?漸變紋理?:RGBA16結(jié)合Dithering抖動處理,減少色階斷裂。
性能優(yōu)化建議
- ?平臺檢測?:通過
SystemInfo.SupportsTextureFormat動態(tài)選擇壓縮格式。 - ?分級壓縮?:根據(jù)紋理用途(UI/場景)采用不同壓縮級別,UI優(yōu)先ASTC/ETC2,背景可用PVRTC。
- ?冗余檢查?:避免AssetBundle重復(fù)打包紋理導(dǎo)致內(nèi)存翻倍
【從UnityURP開始探索游戲渲染】專欄-直達(dá)
(歡迎點贊留言探討,更多人加入進(jìn)來能更加完善這個探索的過程,??)

紋理壓縮技術(shù)發(fā)展節(jié)點 ?早期階段 2000年代初? DXT/S3TC成為PC和主機(jī)平臺主流,采用4×4像素塊壓縮,但移動端支持有限。 PVRTC(2008年)專為PowerVR GPU設(shè)計,要求紋理尺
浙公網(wǎng)安備 33010602011771號