【Direct3D 11.3 Functional Specification】 第2章 Rendering Pipeline Overview

第2章 渲染管线概述

与前几代产品一样,D3D11.1硬件也可以使用共享的可编程处理器核心进行设计。GPU上存在大量的Shader处理器核心,可以在包含D3D11.1 Pipeline的各个功能块之间进行调度,如下所示。
【Direct3D 11.3 Functional Specification】 第2章 Rendering Pipeline Overview_第1张图片
【Direct3D 11.3 Functional Specification】 第2章 Rendering Pipeline Overview_第2张图片

2.1 输入汇编器(IA)概述

输入汇编器(IA)在将保存在一维缓冲区的点,直线,三角形或面片控制点等几何数据引入图形管线中,

顶点数据可以来自多个缓冲区,可以从每个缓冲区以“结构数组”的方式访问。每个缓冲区都绑定到一个单独的输入插槽,并具有一定的结构步幅。输入缓冲区声明了所有缓冲区中数据的布局,其中每个条目定义了一个“元素”,其中包括:输入插槽,结构偏移量,数据类型和目标寄存器(用于第一个活动着色器)。管道)。

给定的顶点序列是根据固定功能状态和各种Draw *()API / DDI调用的组合,从缓冲区中获取的数据构成的。各种原始拓扑可用于使顶点数据序列表示原始序列。示例拓扑为:点列表,线列表,三角形列表,三角形带,8个控制点跳线列表。

顶点数据可以通过以下两种方式之一生成。第一个是“非索引”渲染,它是包含顶点数据的Buffer的顺序遍历,其始于每个Buffer绑定的起始偏移量。生成顶点数据的第二种方法是“索引编制”渲染,它是对包含标量整数索引的单个Buffer的顺序遍历,该标量是从Buffer的起始偏移量开始的。每个索引指示从包含顶点数据的缓冲区中提取数据的位置。索引值与它们所引用的缓冲区的特性无关。缓冲区由前面提到的声明描述。因此,通过“非索引”和“索引”渲染(以各自的方式)完成的任务是生成从中获取内存中顶点数据的地址,

通过允许非索引或索引渲染中的顺序遍历在每个“顶点缓冲区”(非索引情况)或“索引缓冲区”(“索引”情况)内的范围内循环,可以启用实例化几何图形渲染。缓冲区绑定可以标识为“实例数据”或“顶点数据”,指示在执行实例渲染时如何使用绑定的缓冲区。由“非索引”或“索引”渲染生成的地址用于获取“顶点数据”,同时考虑了执行实例渲染时的循环。另一方面,“实例数据”总是从每个缓冲区偏移量开始,以等于每个实例一个步长的频率顺序遍历(例如,遍历实例中的顶点数后向前一个步长)。“实例数据”的步速

输入汇编程序的另一个用途是它可以读取从流输出(2.7) 阶段写入的缓冲区。这种情况下需要特定类型的Draw DrawAuto (8.9)。DrawAuto使输入汇编程序可以知道有多少数据在不占用CPU的情况下动态写入了流输出缓冲区。

除了从缓冲区生成顶点数据外,IA还可以自动生成标量计数器值,例如:VertexID (8.16),PrimitiveID (8.17)和InstanceID (8.18),以输入到图形管线中的着色器阶段。

在带状拓扑(例如三角形带)的“索引”渲染中,提供了一种机制,可通过一次Draw *()调用绘制多个带(即“剪切”带)。

2.2 顶点着色器(VS)概述

“顶点着色器”阶段处理顶点,执行诸如变换,蒙皮和照明之类的操作。顶点着色器始终在单个输入顶点上操作并产生单个输出顶点。

2.3 Hull着色器(HS)概述

外壳着色器每个面片(patch)运行一次,它可以将构成面片的输入控制点转换为输出控制点,并且可以设置一些 在Tessellator阶段使用的参数,如
TessFactors,表示要细分多少像素的。

2.4 Tessellator(TS)概述

Tessellator是固定功能单元,其操作由Hull Shader中的声明定义。

2.5 Domain着色器(DS)概述

Tessellator生成的每个顶点将调用一次Domain Shader。每个调用都由其在通用域上的坐标来标识,并且Domain Shader的作用是将坐标转换为有形的东西(例如3D空间中的点)以供接下来的Pipeline使用。

2.6 几何着色器(GS)概述

几何着色器运行应用程序指定的着色器代码,并以顶点作为输入,并能够在输出中生成顶点,几何着色器的输入是完整图元的顶点,某些类型的图元还可以包括边缘相邻图元的顶点。另一个输入是由IA自动生成的PrimitiveID。几何着色器阶段能够输出形成单个选定拓扑的多个顶点,在几何着色器的任何调用中,发出的图元数量可以自由变化,尽管必须静态声明可以发出的最大顶点数量。输出可以馈送到光栅化器和/或输出到内存中的顶点缓冲区。馈送到内存的输出将扩展到各个点/线/三角形列表(将它们传递到光栅化器的方式相同)。

2.7 流输出(SO)概述

顶点可以在到达光栅器之前被流式传输到内存中。这就像管道中的“抽头”,即使数据继续向下流到光栅器,也可以将其打开。通过流输出发送的数据被连接到缓冲区。这些缓冲区可以在随后的传递中作为管道输入重新循环。

关于流输出的一个限制是它与几何着色器绑定在一起,因为两者必须一起创建(尽管两者都可以为“ NULL” /“ off”)。不过,流出的特定内存缓冲区并没有与此GS / SO对绑定。GS仅绑定对要向流输出馈送的顶点数据的哪些部分的描述。

流输出的一种用途是保存将被重用的有序管道数据。例如,可以通过将顶点作为独立点传递到管道中来“剥皮”一批顶点(就像要访问所有顶点一样),对每个顶点应用“蒙皮”操作,然后将结果流式传输到内存中。现在,已保存的“剥皮的”顶点可以在后续遍中用作输入。

由于通过Stream Output写入的输出量可能是不可预测的动态,因此需要一种特殊类型的Draw命令 DrawAuto (8.9)。DrawAuto使输入汇编程序可以知道有多少数据在不占用CPU的情况下动态写入了流输出缓冲区。此外,查询对于减轻流输出溢出(20.4.10)以及检索将多少数据写入 流输出缓冲区(20.4.9)是必要的。

2.8 栅格化器概述

光栅化器负责剪辑,原始设置以及确定如何调用Pixel Shaders。D3D 11。图3并不将其视为管道中的“阶段”,而是管道阶段之间的接口,碰巧执行了大量固定功能操作,其中许多操作可由软件开发人员进行调整。

栅格化器始终假定在剪切空间中提供了输入位置,执行剪切,透视划分并应用视口比例/偏移。

2.9 像素着色器(PS)概述

可用于Pixel Shader的输入数据包括顶点属性,可以基于每个元素选择顶点属性,以在进行或不进行透视校正的情况下进行插值,或者视为按原语不变。

像素着色器也可以选择每个像素调用一次,也可以选择每个像素覆盖的样本调用一次。

输出是当前像素或样本的输出数据的一个或多个4个向量,或者没有颜色(如果像素被丢弃)。

Pixel Shader也具有其他一些输入和输出,类似于Compute Shader可以使用的输入和输出,例如,可以写入分散的位置。

2.10 输出合并(OM)概述

逻辑管道的最后一步是通过模具或深度确定可见性,并将输出写入或混合到RenderTarget,RenderTarget可能是许多资源类型之一(5)。

这些操作以及输出资源(RenderTargets)的绑定在“输出合并”中定义。

2.11 计算着色器(CS)概述

Compute Shader可以将GPU视为数据并行处理器的通用网格,而无需来自图形管线的任何图形处理。Compute Shader拥有对快速共享内存的显式访问权限,以促进着色器调用组之间的通信,并具有对内存执行分散读取和写入的能力。原子操作的可用性使对共享内存地址的唯一访问成为可能。计算着色器不是图形管线的一部分(所有先前讨论的着色器阶段)。尽管所有其他着色器阶段都在同一台设备上,但Compute Shader还是独立存在。要调用此着色器,将调用Dispatch *()API而不是Draw *()。

你可能感兴趣的:(图形管线知识)