除此之外 WDDM 還有兩項很重要的特性是特別需要提及的,首先是下圖當中的 GPU Scheduler 這項功能,在以往基本上我們最多只會同時開一個 Direct3D 程式 (還記得嗎?當年要搞遊戲雙開幾乎是不可能任務),因此並沒有非常迫切的需要去設計 GPU 專用的排程器來解決多工的問題,但是進入 Vista 時代之後,等於桌面環境本身就至少是一個常駐的 Direct3D 程式了,若是沒有 Scheduler 的幫助那豈不是根本開不了 3D 圖形程式了嗎?微軟當然不會幹這麼白癡的事情,因此 WDDM 引入了 GPU Scheduler 的功能,讓動態分配 GPU 運算資源成為可能。

sad6088

另一項重要的特性則是在 WDDM 時代以後,不同的處理程序 (Process) 之間可以共享相同的資源 (稱為 Cross Process Resource Sharing),而不必像以前一樣得經過記憶體繞一大圈重新回到 GPU 當中處理才能達到類似效果。

ssm6656

而從剛剛的架構圖也可以注意到 WDDM 有一部分是出現在 User Mode 的,這樣的改變主要是為了穩定性方面的問題,在進入 WDDM 世代之後 Windows 可以在顯示卡出錯的時候透過系統來指示重設顯示驅動程式的方式來讓系統恢復正常運作並提示使用者顯示卡驅動程式發生過問題 (以往是由 GPU 廠商自行設計相關的復原機制,因此有些廠商會設計重設有些廠商則是直接噴錯誤訊息),並且可以避免 Kernel-Mode 當中的驅動程式出問題就將整台電腦拖下水的狀況,除此之外還有讓使用者得以在不重新開機的狀況下載入新版顯示驅動程式的附加價值。

gda6458

DirectX 10

寫了這麼多之後終於要談到本篇真正的第一個主角-DirectX 10 了,過去幾代 DirectX 大版號發生改變的時候基本上就意味的繪圖管線有了重大的變革,像是 DirectX 7.0 帶來的硬體 T&L、DirectX 8.0 首次引入的可程式化管線與 DirectX 9.0 帶來的高階渲染器語言,而距離上一代推出足足間隔了四年的 DirectX 10 也不例外。

avd8698

根據微軟官方的說法,DirectX 10 雖然沿用了 DirectX 的名稱,但實際上幾乎是整組砍掉重練的結果了,不過由於這邊談的是電腦圖形所以我們只看 Direct3D 10.0 的部分,而 Direct3D 10.0 當中最重要的變革依舊是出現在 Shader Model 的部分。

amd6855

DirectX 10 引入的 Shader Model 4.0 基本上可以視為 Shader Model 3.0 的超集 (但有例外,Shader Model 4.0 不再向下相容 Shader Model 1.0 了,不過這並不是大問題,反而對 ATI 來說比較頭痛的是其大量採用的 FP24 半精度浮點數支援也被取消了,從 DirectX 10.0 開始只支援 FP32),並且延續過去的慣例,繼續減少對 Shader 程式的限制,而且是歷來放寬幅度最大的一次 (指令數從 512 直接狂飆到 65,536,暫存器從 16 ~ 32 直接跳到 4,096 個等),也因為這樣讓 GPU 可以分攤更多 CPU 的工作,從此 CPU 不再經常成為拖慢遊戲性能的瓶頸。

sxa8088

不過這並不是 Shader Model 4.0 最大的改進,實際上 SM 4.0 的核心特色有兩個,首先是除了 Vertex Shader 與 Pixel Shader 之外,我們現在有了第三種 Shader-Geometry Shader (幾何渲染器),顧名思義這種渲染器是用來處理幾何圖形的,位置在原本的 VS 與 PS 之間。

Geometry Shader (幾何渲染器)

sca9898

以往的繪圖管線規劃中,Vertex Shader 是以頂點為單位進行處理,之後將產生的頂點資訊用於組成多邊形 (Primitive Assembly),再經過一系列的視角、轉換處理之後才交給 Pixel Shader 進行各像素的運算,而在這中間的過程當中,在多邊形生成這步之後是無法「無中生有」出新的多邊形的 (正常來說管線是不能倒退的),在一般情況下來說確實沒甚麼問題,但是在要處理物件表面即時變換 (舉例來說,巫師施法將主角變成大理石雕像的效果之類的) 時就顯得不敷使用,而 Geometry Shader 的出現解決了這個問題。

scx6898

Geometry Shader 的運作基本上是將上個步驟-多邊形生成中產生的多邊形拿來使用,透過 Geometry Shader 的幫助可以用原先已經固定下來的多邊形產生新的或是更多的多邊形來改變物件表面的形狀與樣貌 (讓程式有進行「第二次多邊形生成」的機會)。

msm6663

雖然乍看之下 Geometry Shader 似乎沒有甚麼太重要的角色,但實際上 GS 的出現讓電腦遊戲的畫面真實度又再次提升了一個檔次 (特別是在處理水面、金屬表面反射與變形的時候),以上圖為例,海面的波濤洶湧在以往沒有 Geometry Shader 的時候是無法想像的 (上為 DirectX 9.0,下為 DirectX 10,同樣都是執行微軟的模擬飛行 X)。