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 调度管道的功能块的示意图。

以下部分介绍上图中显示的 new-for-Direct3D 11 块。

外壳着色器

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

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

镶嵌器

细化器是固定函数单元,其操作由外壳着色器中的声明定义。 细化器对外壳着色器输出的每个修补程序运行一次。 外壳着色器生成 tess 因子,这些因子是通知细化器 (通过补丁域生成几何图形和连接) 的细化量的数字。

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

域着色器

域着色器在每个顶点调用一次,该顶点由细化器生成。 每个调用都由其在泛型域中的坐标标识。 域着色器的作用是将坐标转换为有形 (,例如,三维空间中的一个点) 用于域着色器的下流。 修补程序的每个域着色器调用还会访问所有外壳着色器输出 (的共享输入,例如输出控制点) 。

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

计算着色器

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

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

无序访问资源视图

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

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