程序設計指南包含如何使用 Direct3D 11 可程式化管線來建立遊戲的即時 3D 圖形,以及用於科學和桌面應用程式的相關信息。
計算著色器
計算著色器是一種可程式化著色器,專為一般用途的數據平行處理而設計。 換句話說,計算著色器允許 GPU 做為一般用途的平行處理器。 計算著色器類似於其他可程式化管線著色器(例如頂點、圖元、幾何),其存取輸入和輸出的方式。 計算著色器技術也稱為 DirectCompute 技術。 計算著色器已整合至 Direct3D,並可透過 Direct3D 裝置存取。 它可以使用 Direct3D 裝置,直接與圖形著色器共用記憶體資源。 不過,它不會直接連線到其他著色器階段。
計算著色器是針對以互動速率執行計算的大規模市場應用程式所設計,而當 API 之間轉換的成本(與其相關聯的軟體堆棧)和 CPU 之間轉換的成本會耗用太多額外負荷時。
計算著色器有自己的一組狀態。 計算著色器不一定有強制 1-1 對應到輸入記錄(例如頂點著色器所做的)或輸出記錄(就像圖元著色器所做的一樣)。 支援圖形著色器的某些功能,但已移除其他功能,以便新增新的計算著色器特定功能。
為了支持計算著色器特定功能,現在已有數個新的資源類型可供使用,例如讀取/寫入緩衝區、紋理和結構化緩衝區。
如需詳細資訊,請參閱 計算著色器概觀。
動態著色器連結
轉譯系統在管理著色器時必須處理相當複雜的問題,同時提供優化著色器程式代碼的機會。 這成為更大的挑戰,因為著色器必須在各種硬體組態的轉譯場景中支援各種不同的材質。 為了解決這項挑戰,著色器開發人員通常會採用兩種一般方法之一。 它們已建立功能完整的大型一般用途著色器,這些著色器可供各種不同的場景專案使用,這些著色器會權衡一些彈性的效能,或為每個幾何數據流、材質類型或光線類型組合建立個別著色器。
這些大型的一般用途著色器會藉由使用不同的預處理器定義重新編譯相同的著色器來處理這項挑戰,而後者方法會使用暴力密碼破解開發人員能力來達成相同的結果。 著色器排列爆炸通常是開發人員的問題,開發人員現在必須在遊戲和資產管線內管理數千個不同的著色器排列。
Direct3D 11 和著色器模型 5 引進面向對象語言建構,並提供著色器鏈接的運行時間支援,以協助開發人員程式著色器。
如需詳細資訊,請參閱 動態連結。
多線程
許多圖形應用程式都是 CPU 系結,因為場景圖形周遊、物件排序和物理模擬等成本高昂的活動。 由於多核心系統變得越來越可用,Direct3D 11 已改善其多線程支援,以在多個 CPU 線程與 D3D11 圖形 API 之間進行有效率的互動。
Direct3D 11 可讓下列功能支援多線程:
- 並行物件現在會在個別的線程中建立 - 建立物件自由線程的進入點函式,讓許多線程可以同時建立物件。 例如,應用程式現在可以編譯著色器,或在另一個線程上轉譯時載入紋理。
- 命令清單可以在多個線程上建立 — 命令清單是一連串的圖形命令。 使用 Direct3D 11,您可以在多個 CPU 線程上建立命令清單,以平行周游場景資料庫或物理處理多個線程。 這會釋放主要轉譯線程,以將命令緩衝區分派至硬體。
如需詳細資訊,請參閱 多線程。
棋盤形佈置
鑲嵌可用來轉譯具有不同詳細層級的單一模型。 此方法會產生更幾何精確的模型,視場景所需的詳細數據層級而定。 在場景中使用鑲嵌,其中詳細層級允許較低的幾何模型,以減少轉譯期間所耗用記憶體頻寬的需求。
在 Direct3D 中,鑲嵌會在 GPU 上實作,以從粗略(較不詳細)的輸入修補程式計算更平滑的弧形表面。 每個(四角形或三角形)修補面會細分為較小的三角形臉部,以更好地近似您想要的表面。
如需在圖形管線中實作鑲嵌的詳細資訊,請參閱 鑲嵌概觀。
功能的完整清單
這是 Direct3D 11 中功能的完整清單。
您可以使用下列著色器類型來執行鑲嵌式 (請參閱 鑲嵌概觀] :
- 赫爾著色器
- 網域著色器
Direct3D 11 支援多線程處理 (請參閱 MultiThreading)
- 多線程資源/著色器/物件建立
- 多線程顯示清單建立
Direct3D 11 使用下列功能擴充著色器(請參閱 著色器模型 5)
可尋址的資源 - 紋理、常數緩衝區和取樣器
其他資源類型,例如讀取/寫入緩衝區和紋理(請參閱 新的資源類型)。
子 例 程
計算著色器(請參閱 計算著色器概觀) - 著色器,可加快計算速度,方法是將數個軟體線程或線程群組之間的問題空間除以在著色器緩存器之間共享數據,以大幅減少輸入著色器所需的數據量。 計算著色器可以大幅改善的演算法包括後置處理、動畫、物理和人工智慧。
幾何著色器(請參閱 幾何著色器功能)
- 實例 - 允許幾何著色器輸出最多 1024 個頂點,或最多 1024 個實例和頂點的任何組合(每個頂點最多 32 個實例的 32 個實例)。
圖元著色器
涵蓋範圍作為 PS 輸入
輸入的可程式化插補 - 像素著色器可以評估圖元內的屬性,在多重取樣方格上的任何位置
屬性的距心取樣必須遵守下列規則:
如果涵蓋基本類型中的所有樣本,則不論樣本模式在圖元中心是否有樣本位置,都會在圖元中心評估屬性。
否則,會在第一個涵蓋的範例中評估 屬性,也就是在所有範例索引中具有最低索引的範例。 在此情況下,範例涵蓋範圍會在將邏輯 AND 作業套用至涵蓋範圍和取樣遮罩轉譯器狀態之後決定。
如果未涵蓋任何範例(例如,在從基本類型界限執行以填滿 2x2 圖元戳記的協助程式圖元上),則屬性會以下列其中一種方式進行評估:
- 如果 sample-mask 轉譯器狀態是像素中樣本的子集,則 sample-mask 轉譯器狀態所涵蓋的第一個樣本就是評估點。
- 否則,在完整的樣本遮罩條件中,圖元中心是評估點。
Direct3D 11 會展開紋理(請參閱 紋理概觀),並具有下列功能
Gather4
- 支援多重組件紋理 - 指定要從載入的通道
- 支援可程式化的位移
流
- 紋理夾子以限制 WDDM 預先載入
16K 紋理限制
紋理篩選需要8位的子材質和子 Mip 精確度
新的紋理壓縮格式 (1 個新的 LDR 格式和 1 個新的 HDR 格式)
Direct3D 11 支援保守的 oDepth - 此演算法可讓像素著色器比較圖元著色器的圖元深度值與轉譯器中的每個圖元深度值。 結果可讓早期深度消除作業,同時維持從圖元著色器輸出 oDepth 的能力。
Direct3D 11 支援大型記憶體
- 允許 > 4GB 的資源
- 保留資源 32 位的索引,但資源較大
Direct3D 11 支援串流輸出改善
- 可尋址數據流輸出
- 將數據流輸出計數增加至 4
- 將所有數據流輸出緩衝區變更為多元素
Direct3D 11 支援著色器模型 5 (請參閱 著色器模型 5)
- 具有反數的雙精度浮點數
- 計算位集指令
- 尋找第一個位集指令
- 攜帶/溢位處理
- FFT 的位反轉指示
- 條件式交換內部函數
- 緩衝區上的聚脂
- 降低精確度的相互
- 著色器轉換指示 - fp16 到 fp32,反之亦然
- 結構化緩衝區,這是包含結構化元素的新緩衝區類型。
Direct3D 11 支援唯讀深度或樣板檢視
- 停用只讀元件的寫入,允許使用紋理做為輸入和深度撲殺
Direct3D 11 支援間接繪製 - Direct3D 10 會實作 DrawAuto,它接受內容(由 GPU 產生)並轉譯它(在 GPU 上)。 Direct3D 11 一般化 DrawAuto,以便使用 DrawInstanced 和 DrawIndexedInstanced 的計算著色器呼叫它。
Direct3D 11 支援其他功能
- 浮點檢視區
- 個別資源Mipmap限制
- 深度偏差 - 此演算法會使用轉譯器狀態來更新深度偏差的行為。 結果會排除計算偏差可能是 NaN 的案例。
- 資源限制 - 資源索引仍然需要 <= 32 位,但資源可能大於 4 GB。
- 轉譯器精確度
- MSAA 需求
- 計數器縮減
- 已移除 1 位格式和文字篩選
舊版中新增的功能
如需先前版本中新增的功能清單,請參閱下列主題:
相關主題
-
Direct3D 11 的新功能