虛擬現(xiàn)實的進化:DirectX10技術(shù)詳解
DirectX包含2D/3D圖形、聲音、輸入輸出設(shè)備等多個組件,提供了一整套的多媒體接口方案。在統(tǒng)一的接口面前,硬件的差別性顯得無足輕重,編程人員得以更有效率的開發(fā)各種多媒體、游戲軟件。DirectX中3D圖形方面是最受人關(guān)注的,因為在6.0版本之前它還不是3DFX的Glide的對手,所以我們從DirectX 6.0談起:
DirectX 6.0:加入了雙線性過濾、三線性過濾等優(yōu)化3D圖像質(zhì)量的技術(shù),加入環(huán)境影射凹凸貼圖,使3D游戲的畫面更具有真實感。
DirectX 7.0:最大的特色就是支持了T&L,中文名稱是“坐標(biāo)轉(zhuǎn)換和光源”,3D游戲中坐標(biāo)和燈光的轉(zhuǎn)換工作從此由CPU轉(zhuǎn)交給了GPU,比DX6.1性能提升20%。這也成就了nVIDIA GeForce 256與ATi Radeon 256的輝煌,令3DFX徹底退出市場競爭。
DirectX 7.0a:增強了力反饋游戲控制設(shè)備的性能和兼容性。
DirectX 7.1:與Windows Millennium一同發(fā)布。
DirectX 8.0/8.0a:支持Shader Model 1.0和1.1,從此在顯卡中引入可編程像素著色器(Pixel Shaders)和頂點著色器(Vertex Shaders)的概念,同時應(yīng)用在Xbox游戲機中。同硬件T&L僅僅實現(xiàn)的固定光影轉(zhuǎn)換相比,VS和PS單元的靈活性更大,它使GPU真正成為了可編程的處理器。
小知識:什么是shader?Shader就是一段可以改變像素和頂點的小程序,這個Shader小程序可以為游戲場景添加一些基本的幾何學(xué)特效。例如湖水的漣漪,它會讓特定的藍(lán)色材質(zhì)發(fā)生移動、扭曲和倒映,這樣就會給人波光粼粼的感覺了。若是要將一個物體渲染成玻璃的風(fēng)格,它就會讓一些材質(zhì)發(fā)生透明和扭曲。
DirectX 8.1:Pixel Shader升級到1.2、1.3、1.4版,可以支持最高每時鐘28指令執(zhí)行,其中1.4版當(dāng)時僅ATi Radeon 8500顯卡支持。
DirectX 9.0 Shader Model 2.0:SM2.0的shader性能更強,支持最高96指令的pixel shader長度,同時DirectPlay和一些音頻方面也有大幅提升。
DirectX 9.0 Pixel Shader 2.0b:ATI Radeon X600/700/800系列顯卡首先采納,開始支持更多指令(最高1536)和更多臨時寄存器(32相比之前為12),同時還加入新的貼面寄存器(facing register)和幾何實例(geometry instancing)的支持。
DirectX 9.0 Shader Model 3.0:支持更多指令,支持指令的流量控制和動態(tài)分支,從而使得編程人員可以在shaders中加入循環(huán)操作,使得編程更加容易,首次被Geforce 6800顯卡采用。
從DirectX的發(fā)展史中我們可以看到,微軟的3D API和硬件一同發(fā)展,新硬件帶來新的DX特性,新的DX特性加速硬件的發(fā)展,在DirectX10上面,又是一個3D圖形發(fā)展的新境界:
DirectX10:
DirectX 10要在明年初與Windows Vista的首個正式版一同推出,它將大大改變軟件開發(fā)人員進行Windows游戲開發(fā)的方式,而且很有希望給用戶同時帶來更好的畫面和強勁的性能。
現(xiàn)如今的驅(qū)動模式都是顯卡驅(qū)動從屬在 操作系統(tǒng)核心之內(nèi),如果我們在玩游戲的時候當(dāng)機了,整個系統(tǒng)也就掛掉了。而在DX10中,圖形驅(qū)動已經(jīng)獨立開來,DX10的驅(qū)動分為了用戶模式和核心模式,Direct3D, OpenGL, DirectX視頻播放都是工作在用戶模式,互相不會影響,更不能對核心造成損害。因此DX10能夠提供比以往所有DX都強的整體穩(wěn)定性。
另外DX10的一大改革就是微軟取消了所有的特定功能管線(也就是VS、PS、ALU等),使得任何硬件都是可編程的了,軟件開發(fā)人員可以用shaders來模擬固定功能管線的功能,從而實現(xiàn)對舊程序的兼容。
DirectX 10: 僅支持Windows Vista
鑒于DirectX10的更新較大,所以僅針對最新的Vista操作系統(tǒng),而不會有兼容WinXP的DX10版本。但是現(xiàn)在DX10的顯卡還沒有上市,而Vista上市初期肯定市場上大多數(shù)顯卡都是DX9的,因此微軟決定讓DX9的顯卡在Vista上使用一個DX10的子系統(tǒng)——DirectX9.0L。在DX9.0L下,DX9顯卡用戶可以實現(xiàn)Vista的Aero等視覺效果,用DX9的模式玩游戲。 #p#page_title#e#
在DX9上編程受到很多的限制,而DX10的目的就是完全消除這種開發(fā)上的限制,從而發(fā)揮硬件的全部性能,微軟要把DX10的Vista打造成終極游戲操作系統(tǒng)。微軟宣稱相比XP上的DX9,DX10性能最高提升6倍,就是因為DX10上解決了DX9上無法解決的批處理問題,CPU分流給GPU,不再有這種瓶頸;在DX10上,顯存也是虛擬的,顯卡可以自由共享系統(tǒng)內(nèi)存來使用;Shader Model 4.0的指令寬度更高,每時鐘可以做更多的工作;另外更重要的是,DX10上硬件的差別不存在了,例如不同的DX9顯卡會支持不同的浮點數(shù),支不支持HDR、HDR+AA等功能,在DX10上不復(fù)存在,DX10顯卡唯一的區(qū)別就是他們的“硬”性能指標(biāo)。
統(tǒng)一shader構(gòu)架:
統(tǒng)一shader構(gòu)架的首次應(yīng)用是在微軟Xbox360游戲機上,它通過統(tǒng)一shader功能的方法來達(dá)到讓顯卡處理器工作更有效率的目的。
在DX8、DX9顯卡中有兩種shader單元:Pixel Shaders和Vertex Shaders單元,其中Vertex Shaders處理頂點,給出一個3D物體的形狀,而Pixel Shaders制造shaders填充入這些三角組成的形狀之內(nèi),給出了3D物體的外觀,使它活了起來。
shaders處理單元的數(shù)量隨著顯卡的發(fā)展越來越多,DX8/DX9構(gòu)架中兩種shaders有各自獨立的指令集,獨立對場景進行渲染,難免會出現(xiàn)pixel shaders已經(jīng)滿負(fù)荷而vertex shaders只用了一半能力或是相反的情況,從而使得顯卡的shaders不能實現(xiàn)最優(yōu)的效率,下圖就是ATi展示的兩個極端例子:渲染鯊魚的場景Vertex shaders已經(jīng)滿負(fù)荷,而Pixel shaders還很清閑,因為沒有多少像素工作要做;而另一個水面場景的渲染則是正好相反。
而在統(tǒng)一shader構(gòu)架中,一個shader既可以進行Vertex處理,也可以進行Pixel處理,從而提高效率和性能。
統(tǒng)一shader構(gòu)架并非必須
沒有了以往DX9硬件中PS、VS的天然物理分割,在統(tǒng)一shader構(gòu)架之中,需要有一個高效率的控制器,用來動態(tài)給shader們分配渲染任務(wù)。在xbox360中,這個控制器就是負(fù)載均衡單元,這個單元用來組織和分配進入到shader處理流程的數(shù)據(jù),它要保證shader們被完全利用,同時還要保證最好的處理順利,使游戲場景能夠快速被渲染。
每個shader單元既可以處理Vertex又可以處理Pixel,它們的功能都是一樣的,使得這一切成為了可能,而這一切都是硬件層次的工作,游戲編程人員并不需要多做了解。Xbox 360的Xeno處理器具有48個統(tǒng)一shader單元。
雖然統(tǒng)一shader構(gòu)架如此具有意義,微軟并不“強迫”顯卡廠商們在DX10中采用,也就是說即使不支持統(tǒng)一shader構(gòu)架的顯卡也可以100% DX10 SM4.0兼容。不過現(xiàn)在看來ATi和NVIDIA的下代顯卡都是統(tǒng)一shader構(gòu)架的,Intel也宣布支持此構(gòu)架。
DirectX 10的Geometry Shader
除了專門處理像素的Pixel Shader和專門處理多邊形頂點的Vertex Shader之外,DX10中還加入了一個Geometry shader,專門用來處理場景中的幾何圖形。Vertex Shader每一次運行只能處理一個頂點的數(shù)據(jù),并且每次只能輸出一個頂點的結(jié)果。在整個游戲場景中,繪制的幾何圖形的任務(wù)量是非常龐大的,如果僅僅依靠Vertex Shader來完成,處理場景的效率會很低下。Geometry shader幾何著色器可以根據(jù)頂點的信息來批量處理幾何圖形,將點、線、三角形等基本的構(gòu)圖元素連接起來,創(chuàng)造出新的多邊形,快速的將這些處理結(jié)果傳遞給其他Shader。
Geometry shader幾何著色器工作在頂點與像素著色單元之間,當(dāng)顯卡中的頂點著色單元生成頂點信息之后,就會將這些結(jié)果交給幾何著色器來構(gòu)成更為復(fù)雜的幾何圖形,最后交由像素著色器來為這些幾何圖形添加各種材質(zhì)。Geometry shader的工作就是“接點”,將頂點之間用線連接起來。例如,當(dāng)Geometry shader擁有兩個頂點的信息時,它就可以將兩個點連接起來組成一條線,通過這條線可以繪制其他延長線上的點,而通過連接三個頂點就可以繪制出一個三角形,最后通過計算延長線上的點,就可以繪制出更為復(fù)雜的幾何圖形。 #p#page_title#e#
Geometry shader的出現(xiàn)使得游戲開發(fā)人員可以設(shè)計出更為復(fù)雜的動態(tài)器官、幾何放大、動態(tài)模糊、臉面皺紋、真實陰影、劑塑、置換、卡通等等效果,同時把CPU從這些繁重的計算任務(wù)中解脫出來,這是一個巨大的突破!
small batch問題的解決帶來的性能提升
DX9的硬件發(fā)展已經(jīng)很完善,各種燈光效果、HDR等的處理使得DX9下的游戲畫面非常漂亮,但是DX9下的硬件資源浪費也很嚴(yán)重,主要是一個眾所周知的“small batch”問題。
在DirectX9管線中,一個渲染的對象物體從一個應(yīng)用程序(例如游戲)轉(zhuǎn)換成API層次的代碼來執(zhí)行,API把這些代碼交給驅(qū)動程序驅(qū)動硬件來渲染對象,對象每次從API到驅(qū)動這個階段都會有一個額外開銷,對象數(shù)量越多這種額外開銷就越大,延長執(zhí)行時間,從而導(dǎo)致嚴(yán)重的性能問題,這就是“small batch”問題。盡管沒有完全消除這個問題,DX10中大大減少了API到驅(qū)動的額外開銷時間,以前API到驅(qū)動的時間占據(jù)總體物體渲染時間的40%,現(xiàn)在只需要20%的時間就可以完成了,從而使得游戲開發(fā)者們放心大膽在游戲中加入更多的渲染對象。
DirectX 10還有幾項關(guān)鍵性的提升:
HDR Lighting:DX10顯卡支持兩種新的浮點HDR格式,可以更有效處理HDR特效。
GPU虛擬內(nèi)存:材質(zhì)貼圖容量不再局限于顯存容量,內(nèi)存也可以被GPU自由支配了。
更好的幾何示例(geometry instancing):讓游戲開發(fā)者有了更多物體幾何運動的方式選擇。
最大內(nèi)存材質(zhì)分辨率由DX9中的4096x4096上升到DX10的8192x8192。
Xbox360游戲中控制系統(tǒng)的引入,XInput部件使用戶在PC Vista中可以使用游戲機的控制設(shè)備了。
Directsound做了小幅更新,未來會有更大功能提升。
Stream Output:geometry shader可以輸出到緩存區(qū)。
結(jié)論:
從DX9到DX10的革新會像是從DX7到DX8那樣顯著嗎?或許不是,因為幾乎所有的重要DX10游戲特效都是延用DX9的,DX9顯卡都可以處理,只是效率比較低而已。但是在新的DX10 API上,游戲開發(fā)者們在游戲中加入各種特效,并使它們高效運行上將更加得心應(yīng)手,從而大大提高游戲的真實性。此外就是原來CPU的一些工作,通過新的API可以轉(zhuǎn)移給GPU來做;新的geometry shader提高游戲物體的幾何數(shù)量,使得游戲中HDR lighting、volumetric fog、景深等特效更易部署。
下一代游戲API的面貌已經(jīng)完整呈現(xiàn)在我們面前,只等顯卡就緒,就開始全新的DirectX世界之旅吧。