顶点被绑定到一种特殊的Direct3D数据结构称为顶点缓冲区的渲染管线阶段。顶点缓冲区只存储在连续内存中的一个顶点列表。但是,它没有说这些顶点应该如何放在一起来形成几何图元。例如,在顶点缓冲区的每两个顶点被解释为一条线还是每三个顶点被解释为一个三角形?我们告诉Direct3D如何通过图元拓扑结构指定几何图元顶点数据:


void ID3D11DeviceContext::IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY Topology);
typedef enum D3D11_PRIMITIVE_TOPOLOGY
{
D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,
D3D11_PRIMITIVE_TOPOLOGY_POINTLIST = 1,
D3D11_PRIMITIVE_TOPOLOGY_LINELIST = 2,
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,
D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13,
D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,
D3D11_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = 34,
...
D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = 64,
} D3D11_PRIMITIVE_TOPOLOGY;


所有后续的绘制调用将使用当前设置的图元拓扑直到拓扑改变。见下面的代码说明:


md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
/* ...draw objects using line list... */
md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
/* ...draw objects using triangle list... */
md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
/* ...draw objects using triangle strip... */


以下各节详细阐述不同的图元拓扑。在这本书中,我们主要使用D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST,只有少数例外。

Point List

一个点列表由D3D11_PRIMITIVE_TOPOLOGY_POINTLIST指定。有了点列表,在绘制调用中每一个顶点被画成单个点,如图5.13a。

Line Strip

线条被D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP指定。在绘制调用中,顶点连接形成线(见图5.13b);因此n+1个顶点生成n条线。

Line List

线列表由D3D11_PRIMITIVE_TOPOLOGY_LINELIST指定。线列表,在绘制调用每两个顶点形成个体线(见图5.13c);所以2n个顶点生成n条线。线列表和线条之间的差异是在该线的所有线列表可能会断开连接,而线条自动假定它们连接;通过假设连通性,更少的顶点能被使用,因为每个内部顶点是由两条线共用。

Triangle Strip

三角形带由D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP指定。假定三角形连接以形成条带,如图5.13d。通过假设连通性,我们看到,相邻顶点之间共享三角形,n个顶点生成n - 2个三角形。

Triangle List

三角形列表由D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST指定。随着一个三角形列表,每三个顶点的绘制调用形成了一个个体三角形(见图5.14a);所以3n个顶点生成n个三角形。一个三角形列表和条带之间的差异是,在三角形列表三角形可能会断开连接,而三角形带假定它们连接。

Primitives with Adjacency

每个三角形上,还包括它的三个相邻三角形称为相邻三角形;见图5.14b,观察一下这些三角形的定义。这是用于在几何着色器,在其中某些几何着色算法需要访问相邻三角形。为了使几何着色器得到这些相邻三角形,相邻三角形需要随着三角形自身被提交给管线中的顶点/索引缓冲器,同时D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ拓扑必须指定,才能使管道知道如何构建三角形和它的顶点缓冲区的相邻三角形。注意,相邻的图元的顶点仅作为输入到几何着色器- 它们不被绘制。如果没有几何着色器,相邻的基元也不会被绘制。

另外,也可以有一个线条带邻接;见SDK文档的详细信息。

Control Point Patch List

D3D11_PRIMITIVE_TOPOLOGY_N_CONTROL_POINT_PATCHLIST拓扑类型表示该顶点数据应该是解释为有N个控制点块列表。这些都是用在渲染管线的(可选)细分阶段,因此,我们将推迟他们的讨论,直到第13章,“细分阶段。”