陳 可
從Directx 9到DirectX 10,微軟幾乎將API打破重來以構建全新的渲染體系,Directx 10也成為了第一種影響硬件設計的圖形API——統一渲染架構代替傳統的分離渲染,從而賦予GPU更高的渲染效率和可編程能力,也為通用計算提供良好的基礎,之后的DirectX10.1就屬于功能上的小升級。而到DirectX 11,微軟引入了更多的新技術,但同時又保有DirectX 10.1的全部特性,換句話說,DirectX 11實際上就是DirectX 10.1的擴展集,所有DirectX 10.1硬件所遵循的API對于DirectX 11同樣適用。
對用戶而言,這樣的設計在兼容方面很有好處:無論軟件還是硬件,都可以完美地向后兼容。現行的Directx 10游戲,在Directx 11環境下都可以正常運行。而對軟件開發者來說,包容的設計使他們能夠非常平滑地過渡到DirectX 11,而不需要像DirectX 9到DirectX lO過渡那樣突兀和漫長。這樣一來,軟件廠商可以直接轉入DirectX 11技術體系,這對于后續產品開發是非常有利的。不過,DirectX 11不僅只是簡單的升級,它帶來相當多的新穎特性,比如引入通用計算著色器(Compute Shader),允許GPI以事更多的通用計算工作,而不僅僅是3D運算,這可以鼓勵開發人員更好地將GPU作為并行處理器使用。還有就是引入多線程渲染、提高GPU的工作效率t新增的鑲嵌技術(tessellation)可以幫助開發人員創建出更為細膩流暢的模型,實現高質量實時渲染和預渲染場景。
首先我們來看DirectX 10體系的渲染架構,DirectX 10加/LGeometry Shader(幾何著色器,簡稱GS單元)設計'讓GPU可以直接處理模板陰影特效(Stencfl Shadows)、動態法向量圖(Dynamic cube maps)及位移貼圖(Displacement mapping)等操作——過去這些操作是由CPU來完成的。此外,Geometry Shader最高可支持1024個頂點處理,同時可把不必要的頂點數據刪除,這兩項功能使得繪圖運算將較以往更具效率。除了納入幾何著色器外,DirectX 10的渲染流程其實并沒有改變,頂點渲染與像素渲染依次進行,只是在硬件層級上,渲染工作不再由獨立的頂點著色器、像素著色器進行,而交給通用的統一著色器(或者說統一渲染單元)。
現在我們接著來看看DirectX 11的渲染管線。最引人注目的變化就是:在頂點渲染之后,DirectX 11新增了外殼著色器(Hull Shade~簡稱HS)、鑲嵌器(Tessellator)和域著色器(Domain Shader)三個新的管線;而在像素渲染環節,DirectX 11則新增了計算著色器(Computer Shade,簡稱CS),這些新增的部分也就是DirectX 1l的關鍵所在。
在DirectX 11中,新增的Compute Shader(Cs)計算著色器擁有核心地位。與DXl0中引入的GSYh何著色器不同的是,CS并不是渲染管線的一部分,它的主要用途在于增強GPU的通用計算能力。
我們知道,現在的GPU能夠被應用于某些通用計算工作,譬如在高并行計算應用中,GPU就表現出十倍于CPU的卓越能力。對游戲開發者而言,經常出于某種需要希望GPU能執行通用計算指令,但以往的渲染結構卻對GPU制造了諸多障礙——比如說,程序員可以在一個像素著色程序中強行加入通用算法,但卻無法隨意利用諸如樹形結構之類的數據結構,這就給程序員帶來很大的麻煩。因為要在像素間共享數據的過程非常繁瑣,先繪制三角數據結構、再加入貼圖是唯一的解決方案,但這將嚴重影響GPU的渲染性能。而在DirectX 11和CS著色器的幫助下,未來的游戲開發者將不再受困于此,他們可以直接越過復雜的數據結構、并在這些數據結構中運行更多的通用算法。而這些算法將由CS著色器專門負責,不會給渲染單元帶來額外的負擔。
CS代碼可以做到高度靈活,它們可以支持隨機讀寫、不規則列陣(而不是簡單的流體或者固定大小的2D列陣)、多重輸出,并可根據程序員的需要直接調用單線程或多線程應用。CS體系中擁有32Kb容量的共享寄存器和線程組管理系統,具備可執行無序Io運算的能力。總之,CS可以帶來幾乎無限的新型應用,關鍵在于開發者能夠在多大程度發揮它的功效。
在獲得靈活性的同時,CS也會帶來一些性能損失。由于單線程任務現在無法以像素為單位,所以這些線程將會喪失幾何集合功能。從技術上講:雖然CS程序依然可以利用紋理取樣功能,但是原本的“自動三線LOD計算”將會喪失自動功能,程序員必須指定LOD指令。另外,一些并不重要的普通數據的深度揀選l(depthculling)、抗鋸齒(anti-aliasiug)、a混合(aIpha blending)和其它運算不能在一個CS程序中被執行。
CS可以為開發者帶來多種多樣的靈活渲染,這項先進技術應該正中游戲開發商們的下懷:它們的興趣大多是尋求先進技術來增強游戲引擎,比如增強抗鋸齒性能或無規則透明度的性能,帶來更先進的DeferredSh8ding(延遲著色)技術、后處理效果(post processing effect)等等,CS都可以大放異彩。除T_k述這些特殊的渲染應用,游戲開發者可能還希望讓GPU完成諸如IKnnversekinematics,逆運動學)、物理計算、人工智能計算等過去由CPU完成的通用計算,而利用CS在GPU I-執行這些算法時,可以獲得非常理想的效率。
早在XBOX 360平臺上,ATI就帶來了一項名為“Tessellation(鑲嵌化)”的新技術。這項技術的用途就是提升硬件的利用效率、用最低的資源獲得最好的渲染效果——簡單點說,我們可以將它比作數據傳輸中的壓縮技術。
Tessellator可以將原始的圖形分成很多更小的圖形,然后它還可以將這些小圖形組合到—起、形成一個新的幾何圖形,這種幾何圖形更復雜,當然也更為逼真。打個比亢Tessellator技術可以讓某個圖形變成立方體,并通過旋轉讓其從底部看起來像是個球形,而這兩者實際上都使用相同的數據,達到節省資源的目的。
在DirectX 11系統中,Tessellation處理過程包括外殼著色器(Hull Shader,簡稱HS)、鑲嵌器(Tessellator)和域著色器(DomainShader)三個組件,其中HS外殼著色器負責接收瑣碎的圖形數據和資料,鑲嵌器(Tessellator)只負責分塊處
理,它根據HS的指令要求生成大批量的、確定數量的點,然后將數據傳送給域著色器(Domain Shader),再由它來將這些點轉換成3D處理中的頂點,最終就生成了相應的曲線和多邊形。
如果開發者能夠嫻熟地運用鑲嵌化技術,那么就能夠極大程度提升游戲性能、或者說在保有當前性能的條件下顯著提升畫面品質。這一點我們可以從下面的對比中看出來:在采用傳統高細節模型渲染時,原始模型需要動用巨量的三角形,數據量十分之大,最終獲得354fps的渲染性能。而采用低細節模型和Tessellation技術來生成相同的效果,所需的數據量與前者簡直不成比例,渲染性能可達到821.41fps,兩者對比非常懸殊。然而,鑲嵌化技術也不是萬能的:其使用的是一項完全固定的單元,不具備任何可編程能力,這就意味著開發者沒有絲毫回旋余地。這一點看起來與圖形技術的發展方向背道而馳。微軟之所以在DirectX 11中納入這項技術,很大原因就是因為Tessellation確實具有顯著的效果,以至于微軟無法拒絕。
雙核處理器早已經成為PC系統的標準配備,三核、四核更是進入主流市場,然而,現在只有為數不多的游戲產品能夠對多核平臺提供良好的支持,原因在于為多核平臺編程十分困難,只有高水準的開發者才能夠勝任,但顯然并不是所有的游戲公司都有這樣的一流好手。因此,直到今天為主,仍有很多數游戲都還只能在單線程下工作,即只能支持CPU的單核運作,其它核心的計算力無法得到充分發掘。
只要開發者采用DirectX 11作為開發平臺,那么代碼本身就能直接支持多核平臺,DirectX ll在底層接管了多核平臺的資源分派問題。DirectX 11預示著多線程游戲真正步人現實,我們才可以說多核心處理器被真正派上了用場。對于一套四核游戲平臺,當某個渲染場景中有^像和它的三個鏡像,DirectX 11就會啟動四個線程進行并行處理,效率顯然要比目前單線程處理的方式快上數倍!而更令人興奮的是:多線程技術不僅適用于DirectX ll平臺,它同時也能夠讓現有的DirectX10硬件受益。比如說基于DirectX 11開發的新款游戲,可以很好支持多線程,而當它在DirectX 10硬件平臺上運行時,多核優化的機能依然有效,前提是AMD和NVIDIA必須為各自的DXl0硬件開發出相應的驅動軟件才行——就目前看來,這項工作的進展非常順利。