Direct3D 版本 11 的管道

本部分仅适用于 Windows 7 及更高版本以及 Windows Server 2008 R2 及更高版本的 Windows作系统。

Direct3D 版本 11 的图形呈现管道是在 Direct3D 版本 10 的图形呈现管道基础上扩展而来的。 除了 Direct3D 版本 10 支持的共享可编程着色器核心之外,Direct3D 版本 11 还支持外壳、域和计算着色器核心。

Direct3D 版本 11 实际上支持两个单独的管道:绘图管道(图形呈现管道)和调度管道(计算着色器管道)。 绘制和调度管道在技术上是松散连接的,也就是说,不能在两个管道中同时绑定相同的子资源用于写入,或者在一个管道中用于写入而在另一个管道中用于读取。

下图显示了 Direct3D 版本 11 的绘图管道的功能块。

展示 Direct3D 版本 11 绘图管道功能块的图示。

下图显示了 Direct3D 版本 11 调度管道的功能块。

示意图展示 Direct3D 11 渲染管线的功能块。

以下部分介绍了上图中所示的 Direct3D 11 新增模块。

外壳着色器

外壳着色器每个补丁运行一次。 可以将外壳着色器与输入汇编程序中的补丁一起使用。 外壳着色器可以将构成补丁的输入控制点转换为输出控制点。 外壳着色器可以为固定函数细化器阶段执行其他设置。 例如,外壳着色器可以输出细数因子,即指示细化量的数字。

Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁外壳着色器:

细化器

镶嵌器是一个固定功能单元,其操作由曲面着色器中的声明定义。 镶嵌器对外壳着色器输出的每个补丁运行一次。 船体着色器生成细分因子,这些因子是数字,用于通知细分器在补丁域上进行细分(生成几何图形和连接性)。

Direct3D 运行时调用驱动程序的 CalcPrivateTessellationShaderSize 函数来计算外壳或域着色器的内存区域的大小。

域着色器

每个顶点(由分割器生成)调用域着色器一次。 每个调用通过泛型域上的坐标来标识。 域着色器的作用是将该坐标转换为有形的东西(例如,三维空间中的点),供域着色器后续的阶段使用。 修补程序的每个域着色器调用也访问所有外壳着色器输出(例如输出控制点)的共享输入。

Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁域着色器:

计算着色器

计算着色器允许将 GPU 视为通用的数据并行处理器网格,而无需考虑绘制管道中的图形障碍。 计算着色器可以显式访问快速共享内存,以方便着色器调用组之间的通信。 计算着色器还可以执行离散读取和写入内存。 原子操作的可用性使得对共享内存地址有唯一的访问权限。 计算着色器不是绘图管道的一部分。 计算着色器独立存在。 但是,计算着色器与所有其他着色器阶段位于同一设备上。 Direct3D 运行时调用驱动程序的 DispatchXxx 函数,而不是驱动程序的 DrawXxx 函数来调用计算着色器。

Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁计算着色器:

无序访问资源视图

无序访问资源视图是读/写资源,可以绑定到计算着色器或像素着色器。 无序访问资源视图的绑定类似于如何将着色器资源视图(即只读资源)绑定到任何着色器阶段。

Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁无序访问资源视图: