轉:http://blog.csdn.net/lhc717/article/details/6802951編碼
DXT1
DXT1格式主要適用於不具透明度的貼圖或僅具一位Alpha的貼圖(非徹底透明則即徹底不透明),對於徹底RGB565格式的貼圖,DXT1具備4:1的壓縮比,即平均每一個像素顏色佔4位,雖然壓縮比並非很好,可是DXT的特性使得它更適合用於實時遊戲之中。
DXT1將每4×4個像素塊視爲一個壓縮單位,壓縮後的4×4個像素塊佔用64位,其中有2個16位的RGB顏色和16個2位索引,格式描繪以下圖所示:spa
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則表示貼圖是徹底不透明的,反之則表示具備一位透明信息。
DXT二、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信息。.net
DXT四、DXT5
DXT四、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的單位進行壓縮,會形成必定的空間浪費,一樣的大小會被佔用,只是不會參與使用而已。blog