DirectX11学习笔记(6)- 输入装配阶段

输入装配(Input Assembler,简称 IA)阶段从内存读取几何数据(顶点和索引)并将这
些数据组合为几何图元(例如,三角形、直线)。

图元举例:
点列表(point list)由 D3D11_PRIMITIVE_TOPOLOGY_POINTLIST 标志值表示。
当使用点列表时,每个顶点都会被绘制为一个独立的点。
DirectX11学习笔记(6)- 输入装配阶段
线带(line strip)由 D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP 标志值表示。当 使用线带时,前后相邻的两个顶点会形成一条直线;这样,n+1 个顶点可以 形成 n 条直线。
DirectX11学习笔记(6)- 输入装配阶段
线列表(line list)由 D3D11_PRIMITIVE_TOPOLOGY_LINELIST 标志值表示。当使 用线列表时,每两个顶点会形成一条独立的直线;这样,2n 个顶点可以形 成 n 条直线。线列表和线带之间的区别是线列表中的直线可以断开,而线带中的直线会自动 连在一起;因为内部的每个顶点由两条直线共享,所以线带使用的顶点数量更少。
DirectX11学习笔记(6)- 输入装配阶段
三角形带(triangle strip)由 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP 标 志值表示。当使用三角形带时,顶点会按照图 5.13d 所示的带状方式形成连续的三角形。我 们可以看到顶点由相邻的三角形共享,n 个顶点可以形成 n-2 个三角形。
DirectX11学习笔记(6)- 输入装配阶段
三角形列表(triangle list)由 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST 标 志值表示。当使用三角形列表时,每三个顶点会形成一个独立的三角形(参见图a);这 样,3n 个顶点可以形成 n 个三角形。三角形列表与三角形带之间的区别是:三角形列表中 的三角形可以断开,而三角形带中的三角形会自动连在一起。
DirectX11学习笔记(6)- 输入装配阶段

此外还有带有邻接信息的图元:
在包含邻接信息的三角形列表中,每个三角形都有与之相邻的 3 个邻接三角形;图 b 说明了这些三角形的定义方式。它们主要用于几何着色器,因为某些几何着色算法需要访问 邻接三角形。为了实现这些算法,邻接三角形必须与原三角形一起通过顶点/索引缓冲区提交给管线。通过指定D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ 拓扑标志 值可以使管线知道如何从顶点缓冲区中构建三角形以及它的邻接三角形。注意,邻接图元顶 点只能作为几何着色器的输入数据——它们不会被绘制出来。如果没有几何着色器,那么邻 接图元也不会被绘制出来。 线列表、线带和三角形带也可以包含邻接图元,详情请参见 SDK 文档。

索引:构成 3D 物体的三角形会共享许多相同的顶点,当复制两个顶点时问题并不明显,但是在 八边形的例子中问题就比较明显了,八边形的每个三角形都会复制中间的顶点 v0,而且边缘上的每个顶点都由相邻的两个三角形共享。通常,复制顶点的数量会随着模型 细节和复杂性的提高而骤然上升。

我们不希望对顶点进行复制,主要有两个原因:
1. 增加内存需求量。(为什么要多次存储相同的顶点数据?)
2. 增加图形硬件的处理负担。(为什么要多次处理相同的顶点数据?)

三角形带在一定程度上可以解决复制顶点问题,但是几何体必须按照带状方式组织,实现起来难度较大。相比之下,三角形列表具有更好的灵活性(三角形不必彼此相连),如果能找到一种方法,即移除复制顶点,又保留三角形列表的灵活性,那么会是一件非常有价值的事情。索引(index)可以解决一问题。它的工作原理是:我们创建一个顶点列表和一个索引列表。顶点列表包含所有唯一的顶点,而索引列表包含指向顶点列表的索引值,这些索引定义了顶点以何种方式组成三角形。
当顶点列表中的唯一顶点得到处理之后,显卡可以使用索引列表把顶点放在一起构成三角形。我们将“复制问题”转嫁给了索引列表,但是这种复制是可以让人接受的。因为:
1.索引是简单的整数,不像顶点结构体那样占用很多内存(顶点结构体包含的分量越 多,占用的内存就越多)。
2. 通过适当的顶点缓存排序,图形硬件不必重复处理顶点(在绝大多数的情况下)。