Shader Model4.0統(tǒng)一渲染架構(gòu) 微軟的DirectX 9.0c距今離它的誕生已經(jīng)有2年的光景,DX9.0c給我們帶來(lái)了全新的Shader Model3.0技術(shù),也使得3D畫(huà)面較以往了有了質(zhì)的突破,DirectX 9.0c是截至至今微軟歷史上壽命最長(zhǎng)的一代API,而圖形技術(shù)的發(fā)展是不會(huì)停下腳步的,2006年微軟發(fā)布了全新的DirectX 10.0,僅從版本上看比9.0c相差一級(jí),但是DirectX 10.0帶給我們的又將是一個(gè)全新的概念。
在微軟發(fā)布DX10.0后,NVIDIA積極響應(yīng),發(fā)布了完全符合DirectX 10.0的通用Shader架構(gòu)圖形處理器G80,也標(biāo)志著DX9.0c將會(huì)逐步被DX10.0替代。相對(duì)DirectX 9.0c中的SM3.0,在Shader Model 4.0中微軟引入了統(tǒng)一著色架構(gòu),這才是DX10最大的改變。我們都知道,微軟在DirectX 9中引入的了2.0/2.X/3.0三個(gè)版本的Vertex Shader(頂點(diǎn)著色引擎)以及Pixel Shader(像素著色引擎)。其中支持2.0版的著色引擎是DirectX 9的GPU的最低標(biāo)準(zhǔn),而當(dāng)前主流的顯卡已經(jīng)都硬件支持加入了擁有更多高級(jí)處理功能的3.0版本著色引擎。
不過(guò),即便是DirectX 9.0c,對(duì)于功能相仿Vertex Shader、Pixel Shader來(lái)說(shuō),目前圖形芯片廠商仍需要在GPU中劃分兩個(gè)區(qū)域來(lái)存放Vertex Shader陣列和Pixel Shader貼圖流水線。這無(wú)疑是一種資源冗余,而且這也加重GPU的設(shè)計(jì)難度及成本。當(dāng)DirectX 10把渲染流程更細(xì)分為Vertex Shader、Geometry Shader及Pixel Shader,這個(gè)情況將會(huì)更為明顯。而DX10.0的誕生就將這2種渲染整合在了一起!
SM4.0較SM3.0的改進(jìn) 而在DirectX 10中引入了統(tǒng)一渲染架,通過(guò)一個(gè)整合Vertex Shader、 Pixel Shader的可編程整合光影處理器來(lái)完成目前Vertex Shader、Pixel Shader所有的工作。所謂統(tǒng)一渲染架構(gòu),最容易的理解方式就是Shader單元不再分離,顯示核心不再為Shader類型不同而配置不同類型的Shader單元,對(duì)于主流的顯示核心,Pixel Shader單元以及vertex Shader單元的概念都應(yīng)該已經(jīng)非常熟悉了,而在統(tǒng)一渲染架構(gòu)中這兩種Shader單元將不再分離,轉(zhuǎn)而所有的Shader單元都可以為需要處理的數(shù)據(jù)進(jìn)行處理,不管和是Pixel Shader數(shù)據(jù)還是Vertex Shader數(shù)據(jù)。
而調(diào)配哪幾組Shader單元負(fù)責(zé)處理什么數(shù)據(jù)或者進(jìn)行什么樣子類型的計(jì)算,則由一個(gè)被稱為small sets of instructions(SSI)的部分來(lái)控制。這樣在硬件上,設(shè)計(jì)者就無(wú)需為不同的著色引擎設(shè)計(jì)不同的執(zhí)行單元,只要按照所對(duì)應(yīng)的接口以及操作方式全部融為一體,僅設(shè)置一種獨(dú)立的Shader執(zhí)行單元。這意味著GPU廠家可以用更小的核心來(lái)實(shí)現(xiàn)現(xiàn)在需要用8000萬(wàn)甚至更多晶體管才能實(shí)現(xiàn)的功能!
相比原先的Shader Model 3.0,Shader Model 4.0最大指令數(shù)從512條增加到了64000條;臨時(shí)暫存器數(shù)量也從原先的32個(gè)增加到驚人的4096個(gè);允許同時(shí)對(duì)128個(gè)Texture進(jìn)行操作(Shader Model 3.0只允許16個(gè));材質(zhì)texture格式變?yōu)橛布С值腞GBE格式,其中的"E"是Exponent的省略,是RGB共同的說(shuō)明,這在HDR的處理上有很大的作用,摒棄了以往需要專門(mén)decoding處理HDR渲染的流程。 另外,對(duì)于紋理的尺寸Shader Model4.0也有驚人的提升,8192x8192的最高紋理分辯率比原先最高2048x2048的分辯率要高出4倍。G80圖形核心對(duì)以上規(guī)格都給予了完整的硬件支持。
Shader Model4.0新特性
Shader Model 4.0另一個(gè)重大變化就是在VS和PS之間引入了一個(gè)新的可編程圖形層----幾何著色器(Geometry Shader)。原來(lái)的Vertex Shader和Pixel Shader只是對(duì)逐個(gè)頂點(diǎn)或像素進(jìn)行處理,而新的Geometry Shader可以批量進(jìn)行幾何處理,快速的把模型類似的頂點(diǎn)結(jié)合起來(lái)進(jìn)行運(yùn)算。雖然其操作不會(huì)象Vertex Shader那樣完整,只是處理器單個(gè)頂點(diǎn)的相關(guān)函數(shù)操作,但是這種操作卻可以確定整個(gè)模型的物理形狀。這將大大加速處理器速度,因?yàn)槠渌黃hader單元將不再去需要判定數(shù)據(jù)所存在的位置,而只是需要簡(jiǎn)單的為特定區(qū)域進(jìn)行操作就可以了。
Geometry Shader可以把點(diǎn)、線、三角等多邊形聯(lián)系起來(lái)快速處理、同時(shí)創(chuàng)造新的多邊形,在很短時(shí)間內(nèi)直接分配給其他Shader和顯存而無(wú)需經(jīng)過(guò)CPU,煙霧、爆炸等復(fù)雜圖象不再需要CPU來(lái)處理。從而極大的提高了CPU速度和顯卡速度。游戲圖象中可以出現(xiàn)許多精細(xì)場(chǎng)景,如不銹鋼茶壺上清楚的反射出周?chē)矬w、超精細(xì)的人物皮膚等。
為了最大程度的發(fā)揮Geometry Shader的威力,DX10硬件還專門(mén)設(shè)置了一個(gè)名為流輸出層(Stream Output State)的部件來(lái)配合它使用。這個(gè)層的功能是將Vertex Shader和Pixel Shader處理完成的數(shù)據(jù)輸出給用戶,由用戶進(jìn)行處理后再反饋給流水線繼續(xù)處理。我們可以通過(guò)Stream Out把GPU拆成兩段,只利用前面的一段幾何運(yùn)算單元。對(duì)某些科學(xué)研究,也許可以通過(guò)stream out來(lái)利用GPU的數(shù)學(xué)運(yùn)算能力,等于在CPU之外又平白多得了一個(gè)數(shù)學(xué)協(xié)處理器。舉個(gè)例子,Doom3常用的Stencil shadow,因?yàn)镃PU負(fù)擔(dān)很重,廣受批評(píng)。但是因?yàn)镚S可以計(jì)算輪廓線, 還可以動(dòng)態(tài)插入新的多邊形,有了Stream out之后,Shadow volume的生成就可以放到GPU端進(jìn)行,實(shí)現(xiàn)Stencil shadow的硬件化,這將大大降低CPU占用。
統(tǒng)一著色架構(gòu)
在以前的DirectX版本中,像素著色器因?yàn)槭艿匠A考拇嫫鳌⒖捎弥噶詈涂傮w流程可的限制總是運(yùn)行在頂點(diǎn)著色器之后,因此程序員必須學(xué)會(huì)怎樣分別去利用好頂點(diǎn)和像素著色器的權(quán)限。Shader model 4.0則帶來(lái)了與以往不同的統(tǒng)一著色架構(gòu),在DirectX 10基礎(chǔ)上進(jìn)行游戲開(kāi)發(fā),程序員不需要在避免著色沖突限制上花費(fèi)時(shí)間,所有的統(tǒng)一架構(gòu)著色器都能夠使用GPU可以用的全部資源。
Shader model 4.0在著色器程序可用資源的提升方面讓人激動(dòng),在以往的DirectX下,開(kāi)發(fā)者不得不仔細(xì)計(jì)算可用的寄存器資源,而在DirectX 10中,這些問(wèn)題都不復(fù)存在,如上表所示,總體上DirectX 10提供了超過(guò)10倍的DirectX 9可用資源。
更多的紋理和渲染
Shader Model 4.0支持紋理隊(duì)列集,把開(kāi)發(fā)者從繁重的拼接紋理圖集的工作中解放出來(lái),并能夠在每個(gè)著色器上使用更多的特殊紋理實(shí)現(xiàn)更好的視覺(jué)效果。
在Shader Model 4.0之前,過(guò)高的開(kāi)銷(xiāo)使在一個(gè)著色器操作上使用多個(gè)特殊紋理的操作基本無(wú)法實(shí)現(xiàn)。為了解決這個(gè)問(wèn)題,開(kāi)發(fā)把許多小的分散的紋理拼接成一個(gè)大的紋理;在運(yùn)行層中,著色器也需要進(jìn)行額外的地址運(yùn)算以便在拼接紋理圖集中找到特定的紋理。紋理圖集方式存在兩個(gè)明顯的缺點(diǎn):首先小紋理之間的分界線回導(dǎo)致過(guò)濾操作錯(cuò)誤;然后,DirectX 9的4096*4096紋理尺寸限制也是紋理圖集的總體規(guī)模受到局限。紋理隊(duì)列集能夠解決所有問(wèn)題,它能夠使用隊(duì)列格式存儲(chǔ)紋理,每個(gè)隊(duì)列能存儲(chǔ)512同尺寸個(gè)紋理,最大的可用紋理尺寸也提升到8192*8192。為了促進(jìn)這種應(yīng)用,每個(gè)著色器可以操作的最大紋理數(shù)也提高到了128個(gè),8倍于DirectX 9。
更多的渲染對(duì)象
多重渲染對(duì)象是DirectX 9時(shí)代的一個(gè)流行特性,它允許每個(gè)像素著色周期輸出4個(gè)不同的渲染結(jié)果,從而高效率的在一個(gè)周期內(nèi)渲染一個(gè)場(chǎng)景的4遍。在DirectX 10中,渲染對(duì)象的數(shù)目提高到8,著極大的提高了著色器能實(shí)現(xiàn)的場(chǎng)景復(fù)雜程度,延遲渲染和其它一些圖像空間優(yōu)化算法將廣泛的從中受益。
兩種新的HDR格式
兩種新的HDR格式
HDR(High dynamic range rendering)從支持浮點(diǎn)色彩格式的DirectX 9時(shí)代開(kāi)始流行。不幸的是浮點(diǎn)格式比整數(shù)格式占用更多的寄存器空間而限制了其性能的發(fā)揮。如典型的FP16格式的每個(gè)色彩數(shù)據(jù)需要占用16bits,這兩倍于整數(shù)格式的空間占用。
DirectX 10的新HDR格式能夠在和FP16實(shí)現(xiàn)同樣動(dòng)態(tài)范圍的前提下只占用50%的存儲(chǔ)空間。第一種格式為R11G11B10,它使用11-bits的紅色和綠色以及10-bits的藍(lán)色來(lái)優(yōu)化存儲(chǔ)空間;第二種格式是使用一個(gè)5-bits共享首位存儲(chǔ)所有色彩然后每個(gè)色彩擁有9-bits尾址,這些簡(jiǎn)化的方法在HDR品質(zhì)上和標(biāo)準(zhǔn)的FP16幾乎沒(méi)有差別。在最高級(jí)別的HDR方面,DirectX 10支持FP32的HDR,這可以用于科學(xué)計(jì)算等對(duì)計(jì)算精度較高的應(yīng)用程序。
很顯然,DirectX 10.0全新的Shader Model4.0對(duì)于消費(fèi)者來(lái)說(shuō)是一場(chǎng)全新的視覺(jué)革命,更逼真的3D游戲畫(huà)面、流暢的高清視頻回放是微軟、顯卡廠商推動(dòng)技術(shù)發(fā)展的動(dòng)力之源,在不遠(yuǎn)的將來(lái)我們就會(huì)體會(huì)到全新的DX10、SM4.0給我們帶來(lái)的饕餮大餐。