? ? ? ?前言: 目前在做紋理壓縮粮彤,對(duì)項(xiàng)目調(diào)研的資料進(jìn)行整理
? ? ? ?目前的渲染管線中谬俄,對(duì)于3D物體表面的細(xì)節(jié)汤功,主要還是靠紋理貼圖來(lái)表現(xiàn)物邑,分辨率越高,精度越高的紋理滔金,在細(xì)節(jié)表現(xiàn)上自然越強(qiáng)色解,但是同時(shí)會(huì)導(dǎo)致內(nèi)存開銷增大,以及帶寬等問題餐茵。因此科阎,我們必須對(duì)紋理進(jìn)行壓縮。
傳統(tǒng)壓縮圖片格式
主要介紹兩種重要的格式:jpg和png
壓縮方式 | 質(zhì)量 | 元素 | 顏色 | 透明度 |
---|---|---|---|---|
JPEG | 有損 | 點(diǎn)陣圖 | 直接色 | 不支持 |
PNG-8/24 | 無(wú)損 | 點(diǎn)陣圖 | 索引色/直接色 | 支持 |
Android和iOS平臺(tái)都支持jpg和png的圖片格式
為什么不用JPEG
? ? ? ?既然如此忿族,那么游戲中為什么不直接使用這兩種圖片格式呢?
? ? ? ?原因很簡(jiǎn)單:jpeg锣笨、png這些壓縮格式是為CPU解碼設(shè)計(jì)的蝌矛,不適合GPU的并行特性。
GPU解碼圖像的要求
? ? ? ?GPU在解碼圖像的時(shí)候错英,必須滿足以下三個(gè)要求:
隨機(jī)訪問 Random Access
即對(duì)于任意一個(gè)像素都能隨機(jī)地快速算出它在圖像數(shù)據(jù)中的地址(偏移值)入撒。
? ? ? ?對(duì)于JPEG來(lái)說(shuō)顯然是做不到的,它采用VLC(variable bit length coding)不定長(zhǎng)編碼方式椭岩,為不同區(qū)域分配不同的壓縮位數(shù)茅逮,從而達(dá)到為不同區(qū)域分配不同壓縮質(zhì)量。說(shuō)的通俗點(diǎn)判哥,就是:顏色變化少頻率低的部分献雅,編碼后占的內(nèi)存字節(jié)數(shù)就少。
? ? ? ?同理塌计,PNG的壓縮算法也是根據(jù)圖片整體進(jìn)行壓縮(比如霍夫曼編碼)挺身,像素和像素之間存在依賴關(guān)系,無(wú)法直接實(shí)現(xiàn)單個(gè)像素級(jí)別的解析锌仅。
? ? ? ?所以瞒渠,除非你把整張圖片都解壓完畢,否則我們無(wú)法準(zhǔn)確的計(jì)算出原圖一個(gè)坐標(biāo)處的顏色對(duì)應(yīng)的壓縮到了哪里技扼,如圖所示。
? ? ? ?因此嫩痰,這就導(dǎo)致GPU的Texture Sample不可用剿吻,因此必須采用fixed rate coder
解壓速度 Decoding Speed
? ? ? ?GPU會(huì)有很多解壓?jiǎn)卧⑿刑幚恚@要求解壓算法復(fù)雜度必須足夠低串纺、足夠簡(jiǎn)單丽旅,基本不影響渲染性能。
直接尋址 Indirect Addressing
? ? ? ?類似顏色表或者其他全局?jǐn)?shù)據(jù)纺棺,會(huì)導(dǎo)致GPU間接尋址來(lái)獲得顏色數(shù)據(jù)榄笙。這樣,GPU需要四次才能最終得到顏色值祷蝌,是非常消耗時(shí)的茅撞。
? ? ? ?jpeg內(nèi)部有這種數(shù)據(jù),png采用索引值也不符合直接尋址的要求巨朦。
顯存大小
? ? ? ?無(wú)論是JPEG或者PNG的圖片最終在顯卡解碼(其實(shí)是cpu解碼)之后米丘,都是RGB(A)紋理,無(wú)法減小顯存的占用(256×256像素的圖片糊啡,雖然文件格式拄查、磁盤占用、內(nèi)存占用大小不一樣棚蓄,但都是占用256Kb的顯存空間堕扶,性能消耗大)
jpeg和png圖片碍脏,從文件加載的時(shí)候都必須先在cpu先解碼成原始的RGB(A)格式的數(shù)據(jù)
? ? ? ?正是因?yàn)閭鹘y(tǒng)的圖片并沒有考慮顯卡的這種特性,而3D物體表面的細(xì)節(jié)需靠高分辨率紋理貼圖來(lái)表現(xiàn)更強(qiáng)的細(xì)節(jié)稍算,但同時(shí)又要避免內(nèi)存以及帶寬開銷過(guò)大典尾,所以顯卡廠商才推出專為GPU設(shè)計(jì)的壓縮紋理格式。
紋理壓縮技術(shù)
? ? ? ?紋理壓縮不同于其他圖片壓縮方式(jpg,png)邪蛔,在使用中急黎,不會(huì)在CPU中進(jìn)行解壓縮,而是直接把壓縮內(nèi)容傳給GPU侧到,而且在GPU中也不會(huì)一次把整張圖片進(jìn)行解壓縮勃教,只會(huì)在需要采樣特定區(qū)域的紋理時(shí)對(duì)這一區(qū)域的紋理進(jìn)行解壓縮。
優(yōu)點(diǎn)
- 解決了內(nèi)存和顯存中紋理占用空間大的問題
不需要在CPU中就解壓縮匠抗,在GPU中也不需要對(duì)整個(gè)圖片解壓縮
- 解決了帶寬問題
從CPU傳到GPU的圖片是壓縮格式故源,因此傳輸?shù)臄?shù)據(jù)量會(huì)小很多,大大減輕了帶寬壓力
- 解決了包體大小的問題
打包到游戲內(nèi)的紋理是已經(jīng)處理好的壓縮格式
缺點(diǎn)
? ? ? ?因?yàn)槭褂玫氖怯袚p壓縮汞贸,以效果換性能绳军,所以3D表面細(xì)節(jié)會(huì)產(chǎn)生一定程度的損失。
兩種常見的紋理壓縮
ETC/ETC2
待續(xù)
ASTC
待續(xù)