计算着色器概述

计算着色器是一个可编程着色器阶段,它使 Microsoft Direct3D 11 扩展到图形编程之外。 计算着色器技术也称为 DirectCompute 技术。

与其他可编程着色器 (顶点着色器和几何图形着色器(例如) )一样,计算着色器是使用 HLSL 设计和实现的,但这正好是相似性结束的地方。 计算着色器提供常规目的的高速计算并利用图形处理单元 (GPU) 上的大量并行处理器。 计算着色器提供内存共享和线程同步功能,允许采用更有效的并行编程方法。 调用 ID3D11DeviceContext::D ispatchID3D11DeviceContext::D ispatchIndirect 方法以在计算着色器中执行命令。 计算着色器可以在多个线程上并行运行。

在 Direct3D 10.x 硬件上使用计算着色器

Microsoft Direct3D 10 上的计算着色器也称为 DirectCompute 4.x。

如果使用 Direct3D 11 API 和更新的驱动程序, 功能级别 10 和 10.1 Direct3D 硬件可以选择性地支持使用cs_4_0和cs_4_1 配置文件的有限形式的 DirectCompute。 在此硬件上使用 DirectCompute 时,请记住以下限制:

  • 每个组的最大线程数限制为 D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768) 。
  • numthreads 的 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) 。
  • 只有 RWStructuredBufferRWByteAddressBuffer作为无序访问视图提供。
  • 尽管线程可以从任何位置读取,但线程只能访问组共享内存中自己的区域进行写入。
  • 访问组共享的内存进行写入时,必须使用SV_GroupIndex或SV_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) 。
  • 支持 RWStructuredBufferRWByteAddressBuffer和类型化无序访问视图 (RWTexture1DRWTexture2DRWTexture3D 等) 。
  • 原子指令可用。
  • 可能会提供双精度支持。 有关如何确定双精度是否可用的信息,请参阅 D3D11_FEATURE_DOUBLES

在本节中

主题 说明
新资源类型
Direct3D 11 中添加了几个新的资源类型。
访问资源
可通过多种方式访问 资源
原子函数
若要访问新的资源类型或共享内存,请使用互锁的内部函数。 互锁函数保证以原子方式运行。 也就是说,它们保证按编程顺序发生。 本部分列出了原子函数。

图形管道

如何:创建计算着色器