输入装配器阶段

输入汇编程序(IA)通过将源几何图形数据从 1D 缓冲区中拉取出来,将三角形、线条或点引入呈现管道。

顶点数据可以来自多个缓冲区,并且可以以结构数组的方式从每个缓冲区访问。 缓冲区分别绑定到各自的输入槽位,并给定结构化步幅。 所有缓冲区中的数据布局由输入声明指定,其中每个条目定义 一个元素。 该元素包含输入槽、结构偏移量、数据类型和目标寄存器(管道中的第一个活动着色器)。

给定的顶点序列是从缓冲区中提取的数据构造的。 数据的提取是通过由固定函数状态和各种 Draw*() DDI 调用组成的组合来指引的遍历进行的。 各种基元拓扑(例如点列表、行列表、三角形列表和三角形条带)可用于使顶点数据序列表示基元序列。

可以通过以下两种方式之一生成顶点数据。 生成顶点数据的第一种方法是 非索引 呈现,这是包含顶点数据的缓冲区的顺序遍历。 顶点数据源自每个缓冲区绑定的起始偏移量。 生成顶点数据的第二种方法是 索引 呈现,这是包含标量整数索引的单个缓冲区的顺序遍历。 索引源自缓冲区的起始偏移量。 每个索引指示从包含顶点数据的缓冲区中提取数据的位置。 索引值与它们引用的缓冲区的特征无关。 缓冲区由声明描述。 非索引化和索引化渲染生成用于从内存中提取顶点数据的地址,并随后将结果组装成顶点和图元。

实例化几何渲染通过允许顺序遍历来实现,无论是在非索引渲染还是索引渲染中,以循环访问每个顶点缓冲区(对于非索引情况)或索引缓冲区(对于索引情况)中的某个范围。 缓冲区绑定可以标识为 实例数据顶点数据。 此标识指定在执行实例化呈现时如何使用绑定缓冲区。 由非索引或索引呈现生成的地址用于提取顶点数据,该数据还用于在运行时执行实例化呈现时进行循环。 另一方面,实例数据始终按顺序遍历,从每个缓冲区偏移量开始,频率等于每个实例一步(例如,在遍历实例中的顶点数后向前一步)。 可以将实例数据的步骤速率选择为实例频率的子谐波(即,每隔一个实例、每隔两个实例依次向前一步,以此类推)。

IA 的另一个特殊情况是,它可以读取流输出阶段写入的缓冲区。 此类方案可实现新型绘图操作DrawAutoDrawAuto 允许重复使用写入流输出缓冲区的动态输出量,而无需 CPU 参与,以确定实际写入的数据量。

除了从缓冲区生成顶点数据外,IA 还可以自动生成三个标量计数器值:VertexID、PrimitiveID 和 InstanceID,以便输入到呈现管道中的着色器阶段。

在带状拓扑(如三角形条带)的索引呈现中,提供了一种机制,用于使用单个 *Draw*() 调用(即用于剪切条带的 *cut 命令)绘制多个条带。

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

CalcPrivateElementLayoutSize

CreateElementLayout

DestroyElementLayout

IaSetIndexBuffer

IaSetInputLayout

IaSetTopology

IaSetVertexBuffers