DXT1
DXT1格式主要適用於不具透明度的貼圖或僅具一位Alpha的貼圖(非完全透明則即完全不透明),對於完全RGB565格式的貼圖,DXT1具有4:1的壓縮比,即平均每個像素顏色佔4位,雖然壓縮比並不是很好,但是DXT的特性使得它更適合用於實時遊戲之中。
DXT1將每4×4個像素塊視爲一個壓縮單位,壓縮後的4×4個像素塊佔用64位,其中有2個16位的RGB顏色和16個2位索引,格式描繪如下圖所示:
DXT1中的兩個RGB顏色負責表示所在壓縮的4×4像素塊中顏色的兩個極端值,然後通過線性插值我們可以再計算出兩個中間顏色值,而16個2位索引則表明了這4×4個像素塊所在像素的顏色值,2位可以表示4種狀態,剛好可以完整表示color_0,color_1以及我們通過插值計算出的中間顏色值color_2和color_3,而對於具有一位Alpha的貼圖,則只計算一箇中間顏色值,color_3用來表示完全透明。
對於如何判斷DXT1格式是表示不透明還是具有1位alpha的貼圖,則是通過兩個顏色值color_0和color_1來實現的,如果color_0的數值大於color_1則表示貼圖是完全不透明的,反之則表示具有一位透明信息。
DXT2、DXT3
DXT2和DXT3可以表示具有更復雜的透明信息的貼圖,這兩種格式採用的是顯式的Alpha表示,我們知道了在DXT1中,我們使用64位數據來描述4*4的像素塊的顏色信息,在DXT2和DXT3中,這部分顏色信息是不變的,而是通過另附加64位數據也就是每個像素4位來表示他們的Alpha透明信息,而這4位的Alpha的信息通常情況下我們可以採用直接編碼的方式來表示即可。
這樣每個4×4像素塊佔用128位也就是8個字,0~3字表示透明信息;4~7表示前面描述的顏色的信息。
DXT2和DXT3的不同之處在於,DXT2中顏色是已經完成了Premultiplied by alpha操作(已完成顏色與alpha的混合,當透明度發生改變時,直接改變整體顏色值,不必再單獨複合),DXT3的Alpha信息則是相對獨立的,之所以要區分開了則是爲了適應不同的需要,因爲有些場合需要獨立的Alpha信息。
DXT4、DXT5
DXT4、DXT5也是用於表示具有複雜的透明信息的貼圖,與2和3不同的是4和5的Alpha信息是通過線性插值計算所得,類似於DXT1的顏色信息。同樣的,每4×4的像素塊的透明信息佔用64位,所不同的是,64位中採用了2個8位的alpha值和16個3位的索引值,既然每個像素的索引佔3位,那麼可以表示8種不同的透明狀態。
在這裏插值的方法有兩種,一種用於表示具有完全透明和完全不透明的狀態,另一種則是僅在給出的極端值alpha_0和alpha_1中進行插值。區分的方法也是通過比較alpha_0和alpha_1的大小來實現的,如果alpha_0大於alpha_1,則通過插值計算剩下的6箇中間alpha值;否則,只通過插值計算4箇中間alpha值,alpha_6直接賦值0,alpha_7直接賦值255。
DXT4和DXT5的區別同DXT2和DXT3的區別相同,DXT4的顏色值是理解爲已經完成Premultiplied by alpha操作的。
另外需要注意的是,所有的壓縮紋理格式都是2的冪,因爲紋理壓縮的單位是4×4像素,所以如果貼圖的大小位16×2或者8×1這樣的比例,系統會同樣採用4×4的單位進行壓縮,會造成一定的空間浪費,同樣的大小會被佔用,只是不會參與使用而已。