本部分仅适用于 Windows 7 及更高版本以及 Windows Server 2008 R2 及更高版本的 Windows作系统。
Direct3D 版本 11 的图形呈现管道是在 Direct3D 版本 10 的图形呈现管道基础上扩展而来的。 除了 Direct3D 版本 10 支持的共享可编程着色器核心之外,Direct3D 版本 11 还支持外壳、域和计算着色器核心。
Direct3D 版本 11 实际上支持两个单独的管道:绘图管道(图形呈现管道)和调度管道(计算着色器管道)。 绘制和调度管道在技术上是松散连接的,也就是说,不能在两个管道中同时绑定相同的子资源用于写入,或者在一个管道中用于写入而在另一个管道中用于读取。
下图显示了 Direct3D 版本 11 的绘图管道的功能块。
下图显示了 Direct3D 版本 11 调度管道的功能块。
以下部分介绍了上图中所示的 Direct3D 11 新增模块。
外壳着色器
外壳着色器每个补丁运行一次。 可以将外壳着色器与输入汇编程序中的补丁一起使用。 外壳着色器可以将构成补丁的输入控制点转换为输出控制点。 外壳着色器可以为固定函数细化器阶段执行其他设置。 例如,外壳着色器可以输出细数因子,即指示细化量的数字。
Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁外壳着色器:
- CalcPrivateShaderSize
- CalcPrivateTessellationShaderSize
- CreateHullShader
- DestroyShader
- HsSetShaderResources
- HsSetShader
- HsSetSamplers
- HsSetConstantBuffers
- HsSetShaderWithIfaces
细化器
镶嵌器是一个固定功能单元,其操作由曲面着色器中的声明定义。 镶嵌器对外壳着色器输出的每个补丁运行一次。 船体着色器生成细分因子,这些因子是数字,用于通知细分器在补丁域上进行细分(生成几何图形和连接性)。
Direct3D 运行时调用驱动程序的 CalcPrivateTessellationShaderSize 函数来计算外壳或域着色器的内存区域的大小。
域着色器
每个顶点(由分割器生成)调用域着色器一次。 每个调用通过泛型域上的坐标来标识。 域着色器的作用是将该坐标转换为有形的东西(例如,三维空间中的点),供域着色器后续的阶段使用。 修补程序的每个域着色器调用也访问所有外壳着色器输出(例如输出控制点)的共享输入。
Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁域着色器:
- CalcPrivateTessellationShaderSize
- CreateDomainShader
- DestroyShader
- DsSetShaderResources
- DsSetShader
- DsSetSamplers
- DsSetConstantBuffers
- DsSetShaderWithIfaces
计算着色器
计算着色器允许将 GPU 视为通用的数据并行处理器网格,而无需考虑绘制管道中的图形障碍。 计算着色器可以显式访问快速共享内存,以方便着色器调用组之间的通信。 计算着色器还可以执行离散读取和写入内存。 原子操作的可用性使得对共享内存地址有唯一的访问权限。 计算着色器不是绘图管道的一部分。 计算着色器独立存在。 但是,计算着色器与所有其他着色器阶段位于同一设备上。 Direct3D 运行时调用驱动程序的 DispatchXxx 函数,而不是驱动程序的 DrawXxx 函数来调用计算着色器。
Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁计算着色器:
- CreateComputeShader
- DestroyShader
- CsSetShaderResources
- CsSetShader
- CsSetSamplers
- CsSetConstantBuffers
- CsSetShaderWithIfaces
- CsSetUnorderedAccessViews
- Dispatch
- DispatchIndirect
无序访问资源视图
无序访问资源视图是读/写资源,可以绑定到计算着色器或像素着色器。 无序访问资源视图的绑定类似于如何将着色器资源视图(即只读资源)绑定到任何着色器阶段。
Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁无序访问资源视图: