共用方式為


計算著色器概觀

計算著色器是一個可程式化著色器階段,將 Microsoft Direct3D 11 的應用擴展至超越圖形程序設計。 計算著色器技術也稱為 DirectCompute 技術。

如同其他可程式化著色器(例如頂點和幾何著色器),計算著色器是使用 HLSL 來設計及實作,但這只是相似性結束的地方。 計算著色器提供高速一般用途運算,並利用圖形處理單元 (GPU) 上的大量平行處理器。 計算著色器提供記憶體共用和線程同步處理功能,以允許更有效率的平行程序設計方法。 您呼叫 ID3D11DeviceContext::DispatchID3D11DeviceContext::DispatchIndirect 方法來在計算著色器中執行命令。 計算著色器可以在許多線程上平行執行。

在 Direct3D 10.x 硬體上使用計算著色器

Microsoft Direct3D 10 上的計算著色器也稱為 DirectCompute 4.x。

如果您使用 Direct3D 11 API 和更新的驅動程式,功能層級 10 和 10.1 的 Direct3D 硬體可以選擇支援一種有限的 DirectCompute 形式,此形式使用 cs_4_0 和 cs_4_1 設置檔,。 當您在此硬體上使用 DirectCompute 時,請記住下列限制:

  • 線程數目上限限制為每個群組D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768)。
  • 的 X 和 Y 維度僅限於D3D11_CS_4_X_THREAD_GROUP_MAX_X (768) 和 D3D11_CS_4_X_THREAD_GROUP_MAX_Y (768)。
  • numthreads 的 Z 維度限制為 1。
  • 發派作業的 Z 維度受到 D3D11_CS_4_X_DISPATCH_MAX_THREAD_GROUPS_IN_Z_DIMENSION (1) 的限制。
  • 只有一個未排序的存取檢視可以綁定至著色器(D3D11_CS_4_X_UAV_REGISTER_COUNT為 1)。
  • 只有 RWStructuredBuffers 和 RWByteAddressBuffers 可作為未排序存取檢視。
  • 線程只能在群組共用記憶體中存取自己的區域以進行寫入,不過它可以從任何位置讀取。
  • 存取 群組共用 記憶體以進行寫入時,必須使用 SV_GroupIndexSV_GroupThreadID
  • 群組共用 記憶體限制為每個群組 16KB。
  • 單一線程限制為 群組共用 記憶體的 256 個字節區域,以供寫入。
  • 沒有原子指令可供使用。
  • 沒有雙精確度值可供使用。

在 Direct3D 11.x 硬體上使用計算著色器

Direct3D 11 上的計算著色器也稱為 DirectCompute 5.0。

當您使用 DirectCompute 搭配 cs_5_0 設定檔時,請記住下列事項:

  • 每個群組的線程數目上限限制為D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP (1024)。
  • numthreads 的 X 和 Y 維度僅限於D3D11_CS_THREAD_GROUP_MAX_X (1024) 和 D3D11_CS_THREAD_GROUP_MAX_Y (1024)。
  • numthreads 的 Z 維度限制為 D3D11_CS_THREAD_GROUP_MAX_Z (64)。
  • 分派的最大維度限制為D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION(65535)。
  • 可綁定至著色器的最大非排序存取視圖數量為 D3D11_PS_CS_UAV_REGISTER_COUNT (8)。
  • 支援 RWStructuredBuffers、RWByteAddressBuffers 和具類型的無序存取視圖(RWTexture1DRWTexture2DRWTexture3D,等等)。
  • 原子指令是可用的。
  • 可能會提供雙精確度支援。 如需如何判斷雙精確度是否可用的詳細資訊,請參閱 D3D11_FEATURE_DOUBLES

在本節中

主題 描述
新的資源類型
Direct3D 11 已新增數個新的資源類型。
存取資源
有數種方式可以存取 資源
原子函式
若要存取新的資源類型或共用記憶體,請使用內建函數。 保證互鎖功能將會以原子操作的方式運作。 也就是說,它們保證會按照程序設計的順序進行。 本節列出原子性函式。

圖形處理流程

如何建立計算著色器