完美DX10!ATI新王者HD2900XT權威評測
● 第三章/第三節:ATI 3Dc功能回顧
1.紋理壓縮技術
紋理貼圖是貼在3D對象上的位圖,它可以在不增加3D場景中幾何體復雜性的前提下得到逼真的表面細節。紋理貼圖可以從木紋、大理石一直到復雜圖形如人物、建筑、樹木等等。為了模擬現實生活中的場景,必須利用大量細致的紋理貼圖來實現。這些紋理貼圖會占用大量系統或顯存。紋理壓縮就是將預備貼到3D模型上的貼圖進行數據壓縮,從而節省傳輸、存儲它們所占用的顯存的帶寬、容量。

待壓縮的材質據個例子來說。對于一個最大尺寸是4096×4096像素的圖片來說。如果按照32位色來存儲,這個貼圖文件的大小是:4096×4096×32=536,870,912bit,也就是67,108,864Byte,合算是67MB。這意味著什么?這意味著256MB的顯存也只能放上不到4張貼圖。所以紋理壓縮顯得非常必要了。紋理壓縮的原理就是將這些貼圖進行壓縮后存儲進顯存,這樣就能大大的減小對顯存容量的依賴。
最開始的紋理壓縮技術并不是微軟在DirectX中提出的,這種技術的淵源要追溯到5年以前了。最開始采用紋理壓縮技術是S3在OpenGL中首先提出的,最初的名稱叫做S3TC。
到了1999年,微軟吸納了這種做法,在他們的DirectX中加入了紋理壓縮技術,并且取名為DXTC(DirectX Texture Compression)。

DXTC紋理壓縮的技術雖然看似簡單,但是將壓縮后的數據存儲進顯存并不是終結。重要的是需要用顯示芯片把這些壓縮后的數據進行解壓縮,再經過運算貼圖到3D模型上。這個過程就需要顯示芯片在硬件上支持了,如果不支持,對于壓縮后的數據無法識別,照樣不能完成紋理壓縮,也不能發揮出紋理壓縮的優勢。
紋理壓縮應用的算法由于涉及硬件復雜度、解壓效率、色彩空間變換等等技術問題,要比單純的壓縮圖片復雜的多了。就拿我們剛剛提到的DXTC來講,這其中就包含著5種不同的算法,DXT1一直到DXT5,這5種不同的算法是根據5種不同的情況來使用的。
當然然而,DXTC紋理壓縮技術雖然能夠帶來性能上的提升,但是這種壓縮技術卻是一種有損壓縮,這也就意味著在壓縮→存儲→解壓的過程中勢必會對細節有一定的損失,但是這個損失的幅度并不是很大,所以人們也就接受了這種折中的做法。DXTC技術得到了充分而廣泛的應用,幾乎所有游戲都采用了這種技術。
隨著技術的發展,normal mapping技術成為了游戲中逐漸流行的貼圖技術,它用很少的多邊形就可以表現非常高的表面紋理細節。由于法線貼圖RGB通道中存貯的是法線向量,在使用傳統的壓縮算法的時候就遇到了麻煩。

法線貼圖法線貼圖中每個點的顏色反映的是該點法線的角度,也就是該點的凹凸的信息,如果這些信息丟失了,帶來的結果就會糟糕的多——陰影失真是小,甚至可能造成貼圖錯誤,因此,ATI研發了3Dc技術,以解決法線貼圖的壓縮問題。
2.3DC技術原理
首先,3Dc壓縮算法是一種基于“塊”的壓縮方式。什么叫做基于“塊”呢?就是指壓縮的過程中將要壓縮的內容進行分塊,再對每一個單獨的“塊”進行壓縮。
在3Dc技術中,ATI選擇了將一個法線貼圖分成若干個4×4像素(紋素)的塊,每個塊擁有16個像素。為什么這樣分,這其中也是有一定的道理的。

分塊因為作為一個法線貼圖來講,雖然每個點表示了相應位置的凹凸情況。但是,一個平面的凹凸通常不會太細,即使有小尺寸的凹凸情況,也不會比貼圖上4個像素還要小。所以ATI選擇了以4×4個像素為一個基本的單元,然后對這個單元內的信息進行壓縮。
接下來的步驟就是要進行插值運算了。所謂插值運算,就是在這兩個數之間插入一些經處理器生成的數值。具體到3Dc算法中,他們采用了在這最大值和最小值之間等分7份,然后將中間的6個值插進剛剛統計得來的最大值和最小值之間。
有了插值運算的基礎,我們接下來就不難理解其中壓縮的實現方法了。因為我們在記錄數據的時候就能夠摒棄原來的16個數了,轉而使用兩個數(最大值和最小值)就能表示了,兩個數自然要比16個數占的空間要小,這也就是壓縮的意義所在。

當然,這個過程中還有特別重要的一點就是將原數據和插值后的數據進行比較,從而讓計算機知道那些不是最大值也不是最小值的點,究竟應該取這8個數值中的哪一個。
3Dc技術根據Z軸向量是一個僅僅表示方向的向量的特點,將向量的長度取“256,然后利用公式X2+Y2+Z2=2562,將Z在后期算出。
3.3DC技術的優點
● 壓縮比比較大,體現了壓縮的優勢
我們看到,3Dc技術對于法線貼圖的壓縮比是恒定的4:1,這個比例相對于DXTC壓縮技術中的6:1的壓縮比要小一些,但是對于原數據來講,能夠將原來占用的空間縮減到1/4,壓縮的意義也是非常大的。
● 壓縮失真小

我們看到,在3Dc算法中其實是有一定的失真的,這一點也不必隱晦,因為如果在一個取樣范圍較大的空間實現壓縮的話,失真是在所難免的,這16個點中每一個色彩通道的取值范圍均有256個,3Dc算法僅僅使用了8個數來表示這些值,其中就有可能舍掉了248個數。
但是由于我們采用的8個數值在這個空間中是平均分布的,而且每個值都用了和原數據最為接近的一個值來表示,所以每個數值失真的幅度就被控制在了[0,16]的閉區間上。由于實際情況中在一個4×4的塊中兩個極值的差通常會比較接近,所以實際應用中3Dc的失真的影響也會比較小。
● 算法簡單,效率高
這個算法的具體操作過程非常簡單,這些步驟在通過CPU和顯示芯片運算的過程中耗費的資源相對于其他的步驟來講比較小,所以CPU和顯示芯片就能夠在更短的時間內完成更多的操作,從而提升了效率,反映在用戶的直觀感受上就是看到了3D效果但是顯示的幀速率并沒有太大的降低。
有鑒于3DC技術的出色表現,Microsoft在2004年發布的DirectX 9.0c加入了對ATi 3dc紋理壓縮技術的支持,3DC成為得到業界公認的技術標準。3Dc 技術最初是伴隨著X800系列顯卡問世界,成為DirectX 9.0c標準的壓縮技術后,對手NVIDIA也在GeForce 7800 GTX系列顯卡上使用了3Dc壓縮技術。
不止3DC技術,ATI也率先支持的tesselation功能(上一章介紹),ATI對新技術的追求也是孜孜不倦,為圖形核心的發展做出了自己的貢獻,也贏得了業內人士的尊敬。
關注我們


