1. 程式人生 > >DirectX11入門教程——第二篇:DirectX11的基礎知識

DirectX11入門教程——第二篇:DirectX11的基礎知識

本系列系作者原創,可隨便轉發但一定要註明出處

剛才明明說盡量不跳章的,為啥一進來就變成第二章,這裡首先用幾句話說明一下原因:因為第一章我想留給更基礎更概念的GPU發展史和管線描述。在此對不起大家了。不過我保證這個系列初步成型後絕對不跳章

2010年5月微軟釋出了DirectX11這個DirectX SDK系列家族的最新成員,伴隨著SDK的升級,DirectX11帶給我的是功能的擴充套件,效能的改善,GPU儲存空間的完全虛擬化等一系列好處!下面簡要說明一下DirectX11相對於系列前輩的主要新特徵:

關於Direct3D10特性的繼承(針對有經驗的讀者)

由於Direct3D11是在對Direct3D

10進行擴充套件設計的原則下產生的。其改動有:裝置丟失處理廢棄,CAPS Bit廢棄,

固定流水線終於被廢棄,但Geometry Shader得到了保留。

Computer Shader

相對於CPU作為作業系統、一般應用程式的通用架構來說,GPU一直作為圖形,圖形處理的專用架構來使用。由於Computer Shader的出現,GPU終於可以做為專也圖形處理以外的資料並行處理等通用架構來使用了!

這裡要做一點說明的是:Computer Shader是通過Direct3D裝置被其他圖形處理系的Shader和資源共享的!不能直接與其他Shader進行連線!

Tessellation

一句話就是:將精度比較低的Primitive進行分割,以獲得更高精度的Primitive的功能,該功能為一個階段3個單元

其中Hull和Domain是可程式設計的,Tessellator是固定管線,具體為啥要這麼設計後面高階部分會進行詳細說明

MultiThread Rendering

由於Direct3D11強化了多執行緒處理,以前的ID3D9Device、ID3D10Device在Direct3D11中被一分為二,即:

ID3D11Device和ID3D11DeviceContext。ID3D11DeviceContext被分類為ImmediateContext和DeferredContext。其中ImmediateContext為Device直接渲染的DeviceContext所以只能有一個,單執行緒渲染的情況下也只需要建立一個ImmediateContext即可。相對的DeferredContext可以有多個他們被主執行緒以外的工作執行緒使用。

動態 Shader Link

對於一般的的渲染過程,對於不同Material需要切換不同的Shader進行渲染。因此渲染的物件不同可能需要使用的Shader也不同。在解決這個問題上一般有兩個方案:1 建立一個具有所有功能的萬能Shader。只製作所需的不同原子功能的Shader元件,以後對他們進行組合就行了。第一種方案無疑是以犧牲效能為前提的。第二種方案由於組合Shader的增加,引擎需要管理數量爆炸的Shader組合。動態 Shader Link的引入無疑解決了第二種方案產生的棘手問題。

Feature Level的支援

Direct3D10的時代,使用Direct3D10的應用程式的執行必須得到硬體的支援,在Direct3D11中由於引入了6個階段的FeatureLevel,對於Direct3D9/10/11的硬體裝置 根據對應的FeatureLevel都能執行使用Direct3D11特性的應用程式。因此有人說使用了Direct3D11特性的程式只能在Direct3D11裝置上執行完全是謬論!

Resource

Direct3D11定義了讀取專用/寫入專用,結構體Buffer等各種新型別的Resource。這裡就不做更多複數了。更讓人激動的是Direct3D11終於支援了大於4G的Resource,這雖然讓人激動,但還是需要注意:Resource Index仍然是32位。這一點可能稍微讓人有點不爽!

Shader Mode 5.0

Direct3D11中SM終於升級到5.0了,大家鼓掌!!!與Direct3D10一樣採用了 Unified-Shader的架構,即:包括Computer Shader在內所有Shader都是用同樣的HLSL通用語法。關於HLSL我在想是另外放在Shader專題裡呢還是混在這個入門教程裡講。這個希望大家能給點意見。

WARP(Windows Advanced Rasterizer)

手有點累了,這個內容也有點煩了,隨讓我是個沒長性的人呢?暫時寫到這裡,本章未完待續。