原文出處:http://www.beyond3d.com/articles/directxnext/index.php?p=4
通用I/O模型
Unified shading model會帶來一系列有趣的結果,其中有一些無法很快能得知。其中最顯著的莫過於在vertex shader中處理texturing。這對於通用目的尤其重要,但並不僅限與此。另外一個顯著後果是,擁有可以在vertex shader中直接寫vertex buffer的能力,允許為今後的passes快取結果。這在使用high-order surface mapping和high-order displacement mapping時顯得尤為重要。允許你執行一次tessellate、displace然後將結果儲存於在顯示記憶體中的vertex buffer中,在以後所有的passes中只需執行一個簡單的搜尋(lookup)就能達到利用先前結果的目的。
也許最顯著的特徵發生在,將虛擬顯示記憶體的哲學和上面提到的兩個特徵組合在一起時。有了虛擬顯示記憶體,從texture中讀資料和寫資料的程序變得與讀記憶體或寫記憶體非常相似。而因此,導致了下一代DirectX中的通用IO模型的誕生。你現在可以在顯示記憶體中寫入任何資料,然後在pipeline的任意stage中都可以讀取,甚至在後一個pass中也行。這些資料可以不必是vertex,pixel,或者其他圖形資料——你擁有了對當前索引和vertex buffer的訪問能力,你就可以為輪廓邊的檢測產生連通性訊息。事實上,你應該可以在GPU上完成的一個pass中,產生所有的shadow volumes,然後將結果儲存於在顯示記憶體中,讓以後的passes使用。但這還有個小問題:在幾何縮放(tessellation)之外,當前的顯示卡不能直接新增三角形。
拓撲學處理器
實際上,當前的圖形處理器可以在使用點線等primitives時,新增新三角形。多數主流圖形處理器只能將三角形光柵化(rasterizing),意味著所有的點線要在某一時刻轉換成三角形。而任一點或者線要由2個三角形表示,這就需要2到6倍的頂點數(vertices)(取決於你的索引方式),而這一步當然越晚做越好。這樣做是有好處的,而且實際上,對於shadow volume的操作也遇到同樣的問題。這就需要將pipeline中這個部分做為完全可編程的(programmable),且先前阻塞的場景可以不依賴於主處理器。Microsoft將它稱為拓撲學處理器(Topology Processor),並允許shadow volume和fur fin extrusions得以完全在圖形處理器上完成。其他如proper line mitering,point sprite expansion和single pass render-to-cube也同樣可以在圖形處理器上完成。
拓撲學處理器在邏輯上是和tessellation元件分開的。這完全可能,然而一個設計合理的programmable primitive processor應該對這兩方面都能進行操作。
增強的Tessellator
高次表面(higher-order surfaces)由DirectX 8首先推出,而很多硬體支持該特性(nVidia以RT-Patches的形式,ATI以N-Patches的形式),但由於他們的功能限制以及過於晦澀難懂,所以一直沒有什麼人對它們感興趣。因此,所有硬體廠商都放棄了對高次表面的支持。直到DirectX9的出現,帶來了adaptive tessellation(自適應幾何縮放)和displacement mapping(置換貼圖)。高次表面現在使用起來依然讓人痛苦不堪,而且功能很受限制;但displacement mapping很好的解決了它的問題,並且已有不少開發者開始關注它。但不幸的是,硬體廠商已經放棄了對高次表面的支持,所以對displacement mapping感興趣的開發者也只能因缺乏硬體支持而被迫放棄它。公平的說,對displacement mapping的實現一開始有點偏重Matrox公司,所以毫不奇怪沒有很多硬體廠商支持它(甚至連Matrox自己也放棄了對它的支持)。有了符合pixel/vertex shader 3.0的硬體,情況可能會有所改觀,硬體廠商可能會重拾高次表明和displacement mapping的舊局。但這還有一個關於所有當前DirectX高次表面的公式限制問題(formulations limitations)。
如果所有硬體都能直接支持所有普通高次表面的公式,如Catmull-Rom,Bezier以及B-Splines(B樣條),表面細分(subdivision surfaces),所有的圓錐公式(all the conics)和所有合理的公式,那將是非常酷的一件事。若所有這些都能被用於自適應幾何縮放那就更好了。如果DirectX支持所有這些高次表面,那麼離真正使用它們的日子就不遠了——你可以從你喜歡的DCC應用程式(Digital Content Creation Application)中匯入高次表面,而現有系統中所有的問題全部一掃而光。幸運的是這就是Microsoft將要對下一代DirectX所要做的。有了displacement mapping和新的拓撲學處理器,我們真沒有理由不去使用這些新特性了!(當然還得硬體支持)
普通API的改進
不是所有的增強都是新特性方面的——畢竟原有的DirectX接頭中還存在不少累贅,特別是處理狀態改變(state changes)的。當前,如果你想繪圖一幅場景,它會分解成一系列批次處理的幾何體,這些幾何體擁有完全相同的textures,儲存於在vertex buffer的同一連續塊中,使用完全相同的vertex shaders,使用相同的轉換矩陣等等。一般來說,如果在幾何體中的一塊,只要有一點點的不同,它們就必須分開來繪圖。問題來了:對於每個繪圖使用來說,這樣的預先配置過大了。因為繪圖使用指令必須通過DirectX接頭,通過顯示卡驅動,最終到達圖形處理器。這些問題只能由操作系統提供的高效接頭來解決,很顯然,Microsoft計劃在Longhorn中搞定這些問題。
還有一些減少預先配置的方法:通過允許網格(mesh)在圖形處理器中實現具化(instancing)。網格的具化是一種程序:將一個網格新增它的多個實例,使用不同的轉換,不同的textures,甚至不同的displacement maps。
實際上,有了通用IO模型,應該可以將所有可見的textures和轉換矩陣放進一個陣列中,可由shader訪問,將所有共享一個shader的幾何體當作一個大批次處理,並讓shader決定對哪個幾何體集合使用哪個texture或者哪個轉換矩陣。這種將所有狀態管理移交給圖形處理器的做法,將大大減少CPU在繪圖時的工作負擔。
在Pixel Shader中訪問畫格快取
你常常會想在某個圖像上做些計算,比如做數位分階(digital grading),色彩矯正(color correction)或者tone mapping。然而在DirectX9中,你無法讀取 ..
訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容