DXT紋理壓縮

轉:http://blog.csdn.net/lhc717/article/details/6802951編碼

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

 

 

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

相關文章
相關標籤/搜索