淺析DirectX11技術帶給圖形業界的改變
前言:2009年10月23日,微軟高調發布了其最新一代操作系統——Windows7,這款操作系統相對于之前的Vista系統有相當大的進步,特別核心執行效率方面得到顯著改善,并且加入了DirectX 11等新技術。微軟此次推出全新圖形API——DirectX 11目的很明確,就是能夠充分利用顯卡資源,旨在游戲以及通用計算方面達到更高的執行效率。今天本文就帶大家一起分析DirectX 11技術帶給圖形業界和游戲玩家的雙重體驗。同時也讓更多人了解到自己是否需要一款支持DirectX 11的顯卡,具體選擇哪些顯卡最為合適。
● DirectX對GPU發展帶來的影響
DirectX并不是一個單純的圖形API,它是由微軟公司開發的用途廣泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個組件,它提供了一整套的多媒體接口方案。只是其在3D圖形方面的優秀表現,讓它的其它幾個組件幾乎被人們忽略。
Direct Graphics的優秀表現和微軟的影響力,令無數硬件廠商生畏并不斷遵循其變化來開發新的圖形處理器架構。同時ATI和NVIDIA兩家廠商之所以至今仍不斷跟隨DirectX的步伐,是意識到任何游戲相關的硬件廠商要是被微軟拋棄,那么其后果是不堪設想的。

大家都在暢想DirectX技術的未來
在過去的數次DirectX更替中,有幾次較大的更新,比如我們熟知的從DirectX 7到DirectX 8到DirectX 9到再DirectX 10,也是因為這樣的理由使得芯片變得更大。在向DirectX 8的轉移使得可編程的硬件進入管線成為了雙重構造。對于DirectX 9的頂點處理與像素處理,則被真正的可編程處理器調換。而在向DirectX 10的轉移為了實現更靈活的可編程性,需要GPU架構進行根本的改革。
所以哪個世代的改變以及生產什么樣的GPU都關乎根本性的改革,而這種改革基本上都是圍繞DirectX這個最重要的圖形API來進行的。特別是DirectX 10時代架構的改革,從根本上改變了GPU的本質。從DirectX 8向DirectX 9通過API的改革牽動了GPU架構的改革,而架構巨大變化的轉折點則是DirectX 10。

DirectX 10時代 著色器單元走向統一
在DirectX 10時代,我們非常有幸看到了Pixel Shader(頂點著色器)、Vertex Shader(像素著色器)和Geometry Shader(幾何著色器),三種具體的硬件邏輯被整合為一個全功能的著色器Shader。但是我們也發現,GPU在性能提升的同時,芯片規模發生了更快速的放大,這不得不讓人擔心未來GPU的功耗和發熱等等問題。
事實上芯片變大有兩個主要原因。一個是因為性能的增加。要提高運算性能就會需要更多的資源,這會增加晶體管的數量。另一個就是為了發展可編程化。需要讓單一的可編程處理器包括個別進行處理的固定功能硬件,這必然也會增加晶體管數量??墒沁@樣會讓性能出現大幅度下滑,因此為了保持同樣的性能也需要大幅度增加運算資源。結果就是對于GPU的情況需要從固定硬用向可編程硬件轉換,晶體管數和核心尺寸也因此而增加。
直到今天我們看到的DirectX 11出現,這個問題得到了一個平衡的解決方案。DirectX 10帶來了眾多絢麗無比的新特效,但“濫用”各種特效最終導致GPU不堪重負。在DirectX 10經歷了種種波折,瓶頸盡顯時,微軟也開始將重心集中在如何提升算法和效率上面,而不是一味的加入新特效或提高模型復雜度。因此我們看到的DirectX 11,已經將技術重心放在如何用最小的硬件開銷在先進圖形技術的輔助下實現最佳的渲染效果。
● DirectX 11帶來的全新特性
DirectX 11作為一套全新的圖形API,提供給圖形開發者和用戶極大的想象空間,同時降低了開發難度,節省硬件資源,特別是后兩個特點,是DirectX 11區別與以往的DirectX最為顯著的特點。
2009年NVISION大會上,微軟就透漏了DirectX 11的大量細節,此時DirectX 11已經完全成熟并獲得硬件廠商支持,就等和Win7操作系統一同上市了。同時借助SIGGRAPH以及GameFest 2008大會上放出的幻燈片,我們可以進行一些深入的研究。此外,DX11特性的提前放出,對于目前DX10以及DX10.1硬件用戶而言也很有幫助,因為AMD和NVIDIA可以照此提前開發適當的驅動支持。

2008年度NVISION資料截圖
回顧歷次DirectX的更替過程,幾乎都對GPU架構產生了顛覆性的影響,它們大部分要求GPU改變現有的著色器Shader單元結構,或者為著色器Shader單元追加資源,這些改進都是為了讓GPU的指令數提升,寄存器數量增加,紋理規模提升,材質Texture精度提升。這樣的改進難免帶來晶體管數量的增長,也就說說GPU內部的每個著色器Shader單元變得更加龐大。
DirectX 11發布后,人們發現微軟并沒有在Shader Model方面做出重要提升,雖然版本升至Shader Model 5.0,但是更重要的是它實際上可以被看作是DirectX 10和DirectX 10.1的功能補全,你也可以認為它是DirectX 10和DirectX 10.1的超集,如果換個角度大膽設想,我們今天看到的DirectX 11才是微軟想要的DirectX 10完美形態。
DirectX 11針對不同方面帶來了全新的特性,目前通過現有資料分析,它主要有以下幾個方面的提升:

DirectX 11帶來的全新特性
● 著色器版本提升到Shader Model 5.0,采用面向對象的概念,并且完全可以支持雙精度數據。
● Tessellation曲面細分技術獲得微軟正式支持,逐漸走向成熟;
● Multithreading多線程處理,讓圖形處理面對多線程編程環境不再尷尬;
● 提出微軟自己的Compute Shader通用計算概念,把GPU通用計算推向新的巔峰;
● 新的Texture Compression紋理壓縮方案,在畫質損失極小的環境下帶來了硬件資源的節約。
在今天的分析中,我們將重點放在Tessellation曲面細分技術方面,因為這是DirectX 11最為突出的特色之一,也是給圖形運算產生深遠影響的一項技術,DirectX 11的其他特點我們也會提及。
● Tessellation技術簡析
Tessellation又可譯作拆嵌式細分曲面技術。其實這是ATI早在其第一代DirectX 10圖形核心R600,即HD2900XT上就引入的一個特殊的計算模塊。從HD2000系列開始,直到最新的HD5000系列,整整4代顯卡全部支持這一技術。即使目前也仍然沒有游戲能夠支持這一技術,ATI也依然沒有放棄在這項技術上的努力——從名字上也可以看出ATI在這項技術上的心血:Tessell-ATI-on。
Tessellation主要是靠GPU內部的一個模塊Programmable Tessellator(可編程拆嵌器)來實現的。能夠根據3D模型中已經有的頂點,根據不同的需求,按照不同的規則,進行插值,將一個多邊形拆分成為多個多邊形。而這個過程都是可以由編程來控制的,這樣就很好的解決了效率和效果的矛盾。TessellATIon能自動創造出數百倍與原始模型的頂點,這些不是虛擬的頂點,而是實實在在的頂點,效果是等同于建模的時候直接設計出來的。

Tessellation工作流程三部曲
很明顯,DirectX 11中的Tessellation讓雪山的凹凸感更為明顯,遠勝于DirectX 10里所采用的視差映射貼圖技術。雖然后者在較遠距離觀看的時候也能提供一定的視覺欺騙性,但和 Tessellation技術塑造出來的真實感覺還相差太遠。我們使用的分析圖來自AMD在R600發布時放出的一段Demo,這段Demo區別于以往的設計方式,它沒有突出主角而淡化背景,因為在沒有Tessellation技術之前,大量頂點的生成和隨之而來的計算將給GPU的幾何處理部分帶來巨大壓力,無法流暢運行,而Tessellation技術改變了這一模式。
除了大幅提升模型細節和畫質外,Tessellation最吸引程序員的地方就是:他們無需手動設計上百萬個三角形的復雜模型,只需簡單勾繪一個輪廓,剩下的就可以交給Tessellation技術自動拆嵌,大大提高了開發效率;而且簡單的模型在GPU處理時也能大幅節約顯存開銷,令渲染速度大幅提升。
● Tessellation技術歷史回顧
Tessellation技術最早可以追溯到DX8時代,當時ATI就已經和微軟聯手開發了TruForm(N-Patch)技術,也就是Tessellation的前身,并被納入DX8.1的范疇。
2001年,ATI公布了TruForm的技術細節,相關媒體也對這一技術進行了報道。簡單地說TruForm技術就是將在芯片內部將游戲中的三角形轉換成曲面然后再轉換成一個新的三角形,這個三角形可以在場景中顯示。
當三角形信息通過圖形芯片時,TruForm技術開始工作,它通過創建N-Patch來形成N-Patch網格。
N-Patch網格是一個曲面,通過線性三角形信息來定義。N-Patches在三角形每個邊放兩個控制點,這樣就產生了六個新的頂點。這些控制點都在一個單獨的平面上,可以位于原三角形之下或者之上。使用儲存在原三角形的頂點向量的信息,可以決定控制點的位置。

N-Patch技術示意圖
當然,這并不是一個簡單的工作,而這正是TruForm技術的用處所在。當時人們認為它是ATI下一代顯卡Radeon2的獨門武器。在當時GPU運算能力極為有限的情況下,N-Patch技術可以大幅提升3D模型的細節和顯示效果。
但是它卻出現了一些非常遺憾的失誤,導致這項技術最終被用戶放棄。因為N-Patch技術技術比較適合于海豚、賽車等表面為曲面的模型上,而如果這個技術應用在坦克等不需要做曲面化的模型上的時候,效果就會變得相當的滑稽。

Tessellation技術帶來的3D流水線變化
N-Patch/TruForm技術就這樣被市場邊緣化,但是ATI還是沒有放棄對它的開發和研究。終于在2005年出現了轉機,在微軟與ATI的合作結晶——專為XBOX360設計的圖形芯片Xenos當中,經過改進的N-Patch/TruForm技術重出江湖,這次ATI將它直接命名為我們熟悉的TessellATIon,直譯為“拆嵌”意譯為“細分曲面”,同時表示ATI在這項技術中不可磨滅的貢獻。
● Tessellation技術拆解分析
Tessellation這個英文單詞直譯為“鑲嵌”,也就是在頂點與頂點之間自動嵌入新的頂點。Tessellation經常被意譯為“細分曲面”,因為在自動插入大量新的頂點之后,模型的曲面會被分得非常細膩,看上去更加平滑致密。它是一種能夠在圖形芯片內部自動創造頂點,使模型細化,從而獲得更好畫面效果的技術。Tessellation能自動創造出數百倍與原始模型的頂點,這些不是虛擬的頂點,而是實實在在的頂點,效果是等同于建模的時候直接設計出來的。

圖形業界對于曲面細分的探索不斷深入
在此之前,人們對低代價多邊形操作法已經探索了近10年,從最開始的對三角形的fan操縱,到后來的龜裂和沖撞檢查,這些方法可以實現曲面細分效果,但是對資源的消耗量太大不可控制。這次微軟在DirectX 11中加入硬件Tessellation單元,我們可以視作曲面細分技術歷經長時間的磨練后修成正果。雖然它不太符合通用處理單元的設計方向,但是如果計算晶體管的投入與性能回報,獨立的硬件Tessellation單元是目前最好的選擇。
Tessellation技術是完全可編程的,它提供了多種插值頂點位置的方法來創造各種曲面:
1. N-Patch曲面,就是和當年TruForm技術一樣,根據基礎三角形頂點的法線決定曲面;
2. 貝塞爾曲面,根據貝塞爾曲線的公式計算頂點的位置;
3. B-Spline、NURBs、NUBs曲線(這三種曲線均為CAD領域常用曲線,在Maya中均有相應工具可以生成)
4. 通過遞歸算法接近Catmull-Clark極限曲面。

不同方式的曲面細分效果實例
Tessellation技術最初主要被用以“細分曲面”,隨著該技術被納入DX11范疇,得到大范圍推廣之后,插值頂點的算法也越來越多,因此用途也越來越廣,產生了很多非常有創意的應用。
Tessellation技術還經常與Displacement Maps(貼圖置換)技術搭配使用,從而將平面紋理貼圖改造成為具有立體感的幾何圖形,大大增強3D模型或場景的真實性。
除了大幅提升模型細節和畫質外,Tessellation最吸引程序員的地方就是:他們無需手動設計上百萬個三角形的復雜模型,只需簡單勾繪一個輪廓,剩下的就可以交給Tessellation技術自動鑲嵌,大大提高開發效率;而且簡單的模型在GPU處理時也能大幅節約顯存開銷,同時大幅提升渲染速度。
● DirectX 11引入可編程曲面細分管線
在DirectX10時代的細分曲面里,最有新用途的就是Geometry Shader和Stream Out,前者可以輸入一些數據,然后產生一些三角形,后者可以斷絕Pixel Shader,做完Geometry Shader就直接輸出回Input Assembler,這就意味著可以做GPU遞歸和迭代。
而DirectX 11相比DirectX 10,Shader Model的變化并不算大,只是增加了5個全新的指令集。但是對于游戲開發者而言,Shader Model 5.0函數和子程序代碼的開發都比上一代更加簡單方便。增加的五個新指令集目的也是為了讓編程者可以進行更靈活的數據訪問和操作。
在Shader Model 5.0中,Shader進行了類型的統一,除了4.0版本中就已經有的Vertex Shader、Pixel Shader、Geometry Shader外,還增加了Hull Shader、Compute Shader、Domain Shader三種新的Shade,它們的出現都是為了完善曲面細分管線。

ATI的HD2000以上級別顯卡其實都具備Tessellation的功能,但它們卻無法與DX11中的Tessellation技術相兼容。這是因為微軟并沒有原封未動的將R600的Tessellation技術抄到DX11之中,而是對其進行了優化,使之能與渲染流程完美的結合在一起,可以更高效率的細分出更多的多邊形和曲面。

與DX9C/DX10時代孤零零的Tessellator模塊不同,在DX11當中,微軟加入了兩種全新著色器來全力配合Tessellator的工作,分別位于鑲嵌器的前后。

其中Hull Shader(外殼著色器)用來控制自動生成頂點的數量和算法,也就是Tessellator的細分級別,然后交給Tesselator進行鑲嵌處理,最后由Domain Shader(域著色器)按照程序要求生成所需曲面,并自動進行法線平移、置換貼圖,產生新的模型。

與DX9/10中的Tessellation技術相比,DX11新增的兩種著色器都受統一渲染架構支配,因此處理能力非常富裕,DX11版Tessellation不僅效率更高、而且細分級別更豐富。但是,更高的細分等級對Tessellator模塊本身的處理能力提出了苛刻要求,這需要芯片廠商在設計之初就考慮周全。
● Tessellation與Displacement Mapping綜合應用
Displacement Mapping(貼圖置換)與Tessellation(曲面細分)的結合使用具有許多優勢。雖然兩者在原理方面本來是沒有任何。
貼圖置換是一種通過VS和alpha混合操作來達成復雜表面的操作;基本上貼圖置換不會增加新的多邊形,即便增加也僅作操作點用。曲面細分則不一樣,它通過在已知多邊形內設立新的頂點,達成fan操作來完成增加多邊形的目的。這兩種技術一個的重點是alpha和頂點移動,另一個的重點則是直接增加多邊形數量。這是兩種完全不同的復雜表面細節實現手段。

Tessellation和Displacement Mapping結合應用
簡單來講,Displacement Mapping的目的就是借助Tessellation改變多變形的外觀,而不僅僅只是圓滑棱角。
正如你所看到的那樣,Displacement mapping能夠透過Tessellation和Displacement Mapping讓一張平面的網面真正實現具有不同形狀的外觀(上面的例子是綿綿起伏的山丘),只要使用Displacement Mapping映像到網面的頂點上,就能夠讓網面善的頂點提升/升降到不同的相對高度,同樣的網面可以形成不同的形狀。

Tessellation和Displacement Mapping結合應用
和以往主要在光柵化階段進行的Bump mapping不同的是,Displacement Mapping是生成的是由更多多邊形構成的真實外觀,而Bump mapping則是一種欺騙性手段、一種性能妥協方案而已,不能產生真正不同的外形,采用Displacement Mapping來實現豐富的表面細節實在有太多的好處了。
最終,利用Displacement Mapping(貼圖置換)與Tessellation(曲面細分)相結合的方式所渲染出來的模型與藝術家所用工具中的原生模型很相似,從而讓藝術家不必創建不同幾何細節級別的模型,無需重復地進行這種一般性勞動。
● 全新的多線程渲染技術
雖然超線程概念已經在CPU領域發展了數十年,但大多數程序員還是直到近年來多核心CPU流行之后才開始關心程序的平行化,在此之前大部分通用代碼都是簡單的單線程,在這些代碼里尋找并挖掘多線程化帶來的性能提升是非常困難的。
為了改變這一現狀,DirectX 11特性還包括很重要一點:支持多線程(multi-threading)。沒錯,無論是DirectX 10還是DirectX 11,所有的色彩信息最終都將被光柵化并顯示在電腦顯示屏上(無論是通過線性的方式還是同步的),但是DirectX 11新增了對多線程技術的支持。

從DirectX 10到DirectX 11的多線程變化
得益于此,應用程序可以同步創造有用資源或者管理狀態,并從所有專用線程中發送提取命令,這樣做無疑效率更高。DX11的這種多線程技術可能并不能加速繪圖的子系統(特別是當我們的GPU資源受限時),但是這樣卻可以提升線程啟動游戲的效率,并且可以利用臺式CPU核心數量不斷提高所帶來的潛力。

多線程渲染示意圖1
在DirectX 11中,微軟通過將目前單一執行的Direct 3D設備被分為三個獨立的接口:設備(Device)、立即執行范疇(immediate Context)和延遲執行范疇(Deferred Context)。

多線程渲染示意圖2
這三者都被分發到各自獨立的線程,而且設備和Deferred context還可以分配多個線程,負責將等待執行的任務發送給immediate Context或渲染線程。這樣的設計可以將圖形生成所需的資源做預先的存取。同時,CPU還可以利用顯卡的多線程處理加快DirectX的處理,減少CPU的響應時間而使游戲不再受到CPU的瓶頸限制。