完美DX10!ATI新王者HD2900XT權威評測
● 第三章 第四節(jié) Shader Model 4.0
當Shader Model 3.0的光彩尚未退去的時候,在DirectX 10中,又引入了Shader Model 4.0。它包含下面幾項革新:
1 加入了一種新的Shader——Geometry shader
通過它可以編程操縱幾何圖元;為vertex、geometry、pixel shader采用了統(tǒng)一的Sahder架構。Geometry shaders是可編程圖形流水線的一大進步。它第一次允許由GPU來動態(tài)的生成和銷毀幾何圖元數(shù)據(jù)。通過和新的數(shù)據(jù)流輸出功能配合使用,許多以前無法實時使用的算法現(xiàn)在都可以在GPU中使用了。在下一節(jié),將仔細討論Geometry shaders。
2 統(tǒng)一的Shader架構
在DirectX 9中,Pixel shader總是在各個方面落后于vertex shaders,包括常量寄存器個數(shù)、可用的指令個數(shù)、shader長度等。程序員需要區(qū)分對待這兩種shader。
而在shader model 4中,這vertex、geometry和pixel shader有著統(tǒng)一的指令集、同樣的臨時/常量寄存器個數(shù)。它們將平等的共享GPU中的所有可用資源。在游戲程序中不用再考慮每種shader自身的限制了。
3 百倍于DirectX 9的可用資源
對于shader中可用的資源,在Shader model 4.0中比原來有了驚人的擴充。就像早期的程序員們絞盡腦汁的省著用可憐的640k內存一樣,在使用以前的DirectX開發(fā)游戲的過程中,程序員需要小心翼翼的分配珍貴的shader寄存器資源。寄存器的數(shù)量,直接影響著shader程序的復雜度。這和在640k內存的機器上,怎么也不可能寫出Microsoft Office這樣的大規(guī)模軟件是同一個道理。而在DirectX 10中,將臨時寄存器由原來的32個擴充到了4096個,將常量寄存器由原來的256個擴充到了65536個!而這些并不僅僅是DirectX給出的理論值——在Geforce 8800架構中,它們都是實實在在的在顯卡上面的!
4 更多的紋理
在Shader Model 4.0中提供了對紋理陣列(Texture arrays)的支持。在前文中已經(jīng)對紋理陣列有了比較詳細的介紹,在這里只著重介紹一下與shader相關的部分。在每個紋理陣列中,最多可以保存512張同樣大小的紋理。而且每張貼圖的分辨率被擴展到了8192×8192。更大的分辨率意味著紋理中更豐富的細節(jié)。在一個shader中能夠同時訪問的紋理個數(shù)被增加到了128個,也就是說在每次執(zhí)行同一個shader時,可以使用一個紋理陣列的512個紋理中的128個。所以說,在DirectX 10中,紋理的多樣性和細節(jié)程度將會有大幅的提升。
使用紋理陣列實現(xiàn)細致的紋理
5 更多的渲染目標(Render Target)
所謂渲染目標,就是指GPU可以把畫面繪制到的目標,我們可以把它理解為GPU的畫布。一般來說,渲染目標被輸出到屏幕上,這樣我們就能看到畫好的畫面了;但是有時為了實現(xiàn)一些特效,某些渲染結果并不直接畫到屏幕上,而是再返給GPU做進一步的特效處理;而且渲染目標中也不一定是畫好的畫面的顏色信息。
根據(jù)特效的需要,它們可能是每個物體距離屏幕的遠近,或者物體表面上每個像素的方向,或者每個物體表面的溫度(為了實現(xiàn)《分裂細胞》中那種熱能感應器的效果)…總之為了實現(xiàn)特效,可以按需要在其中繪制任何信息。為了提高這種情況下的效率,很多新的顯卡都支持在同一遍Shader執(zhí)行結束后,同時把不同的信息繪制到不同的渲染目標中。在DirectX 9中就已經(jīng)支持這種機制了,但是它約束最多同時向四個渲染目標繪制。而DirectX 10將這個數(shù)量提升了一倍。
6 新的HDR顏色格式
要說這些年來在實時圖形界炒得最熱的概念,應該是HDR了。它通過采用浮點格式的顏色格式來為紋理、光照等計算提供極大的精度和顏色范圍(以前的紋理一般都是采用整數(shù)型的顏色格式)。盡管最后顯示到屏幕上還是每個顏色通道8位的整數(shù)格式,但是以前由于在材質、光照計算中紋理也是用每通道8位的格式來參與計算,所以在顯示到畫面之前,很多細節(jié)就在低精度的運算中丟失了。
而采用每顏色通道16位浮點數(shù)的紋理,能夠保證在運算過程中幾乎沒有顏色細節(jié)信息的丟失。另外,采用16位浮點格式的顏色通道,可以表現(xiàn)更大的顏色范圍。這些就是HDR的優(yōu)越性。對于玩家來說,當游戲中的畫面罩上一層HDR效果后,立刻顯得和真正的照片一樣,有朦朧的光暈、細致的高光和十分自然的色調。在玩《優(yōu)品飛車9》時,充滿風格的色調讓人有一種置身于電影里的感覺。
HDR(高動態(tài)范圍)渲染。圖片來源:Futuremark
然而,采用每個顏色通道16位浮點數(shù)的格式,比采用每通道8位的整數(shù)格式的紋理要多占據(jù)一倍的顯存;這給繪制的效率帶來了負面的影響。所以在DirectX 10中引入了兩個新的HDR格式。第一種是R11G11B10,表示紅色和綠色通道用11位浮點數(shù),而藍色通道采用10位浮點數(shù)表示。那么,為什么不都用11位呢?這是為了湊32這個整數(shù)。學過計算機的人都知道,當內存中一個數(shù)據(jù)單元的寬度是32位時,對它的操作效率最高;而且在紋理數(shù)據(jù)中一般要求每個像素的數(shù)據(jù)寬度是2的倍數(shù),如2,8,16,32,64等等。又因為人眼對藍色的敏感度不如對紅色和綠色,所以它比其他兩個通道少用了一位。
另外一種格式是采用每通道9位尾數(shù)、所有通道共享5位指數(shù)的形式(眾所周知,在計算機中,浮點數(shù)是采用尾數(shù)附加指數(shù)的形式來表示的),加起來還是32位。這些新的格式使得紋理能夠與原來占用同樣多的顯存空間,避免了大的空間和帶寬消耗。同時,為了適合需要精確的科學計算的場合,DirectX 10和Geforce 8800 GTX完全支持每通道32位(4個通道加起來128位)精度的浮點數(shù)紋理。
總結
上面提到的這些擴充和提高,對于圖形程序員來說是一件非常爽的事。他們可以擺脫束縛,創(chuàng)建出包含前所未有的細節(jié)度的實時游戲場景;對于玩家來說也是一件非常爽的事,因為他們的眼球有得養(yǎng)了。
關注我們


