DXT紋理壓縮

我們知道遊戲中對於3D物體表面細節的表現最重要的還是靠貼圖來實現的,那麼越是高分辨率越是真彩色的貼圖自然表現力也是越強,但是同時帶來的問題是所需佔用的內存會成倍的上升,而節省內存這一點在目前的遊戲中還是非常非常重要的。 所以各個平臺上都在使用紋理壓縮的技術,讓紋理貼圖在內存佔用和顯示效果能達到一個儘可能的平衡。在DirectX中,使用一種叫做DXT的紋理壓縮技術,目前這種技術被大部分顯卡所支持,通過對DXT的瞭解,我們可以對紋理壓縮技術管中窺豹。 DXT是一種DirectDraw表面,它以壓縮形式存儲圖形數據,該表面可以節省大量的系統帶寬和內存。即使不直接使用DXT表面渲染,也可以通過 DXT格式創建紋理的方法節省磁盤空間。Direct3D提供了D3DFMT_DXT1 ~ D3DFMT_DXT5共5種壓縮紋理格式。其中,D3DFMT_DXT1支持15位RGB和1位alpha圖形格式,D3DFMT_DXT2、D3DFMT_DXT3支持12位RGB和4位alpha,D3DFMT_DXT4、D3DFMT_DXT5則採取了線性插值方式生成alpha。

 

 

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的單位進行壓縮,會造成一定的空間浪費,同樣的大小會被佔用,只是不會參與使用而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章