渲染管线(rendering pipeline)是指:在给定一个3D场景的几何描述及一架已经确定位置和方向的虚拟摄像机时,根据虚拟摄像机的视角生成2D图像的一系列步骤。以下文章将会具体描述这些步骤(阶段)。
1.输入装配阶段
输入装配(Input Assembler,简称IA)阶段从内存读取几何数据(顶点和索引)并将这些数据组合为几何图元(例如三角形和直线)。
1.1顶点
从数学上来说,三角形的顶点即边的交点;线段的顶点即端点;点的顶点即为本身。
上图说明顶点只是几何图元中一个特殊的点。但在D3D中,顶点具有更多含义。本质上,D3D中的顶点有空间位置和各种附加属性组成。(此处不具体展开了就)。
1.2图元拓扑
顶点是以顶点缓冲区(D3D数据结构)的形式绑定到图形管线的。顶点缓冲区只是在连续的内存中存储了一个顶点列表。但并不知道这些顶点是如何组织的。所以要通过制定图元拓扑来告诉D3D以何种方式组成几何图元。
void ID3D11Device::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;
以下图片为部分图元拓扑的示例,选择对应的标志即可选择使用的图元。
1.3索引
先说一个结论,三角形是构成3D物体的基本单位。下面的代码示范了如何使用三角形列表来构建四边形和八边形的顶点数组(每三个顶点构成一个三角形)。
Vertex quad[6] ={
v0, v1, v2, // Triangle0
v0, v2, v3, // Triangle1
};
Vertex octagon[24] ={
v0, v1, v2, // Triangle0
v0, v2, v3, // Triangle1
v0, v3, v4, // Triangle2
v0, v4, v5, // Triangle3
v0, v5, v6, // Triangle4
v0, v6, v7, // Triangle5
v0, v7, v8, // Triangle6
v0, v8, v1 // Triangle7
};
注意:三角形的顶点顺序非常重要,具体会在之后背面消隐的小节中提到。
如上图所示,构成3D物体的三角形会共享许多相同同的顶点。这在八边形的V0点表现尤其明显。复制(重复)顶点的数量会随着模型细节和复杂性的提高而骤然上升。这样就会浪费大量的资源(内存)。
三角形带可以在一定程度上解决复制顶点的问题,然而三角形带组织起来比较麻烦,难度很大。相比之下三角形列表就非常灵活了。如果能找到一种方法,即移除复制顶点,又保留三角形列表的灵活性,就很爽了。而索引就可以解决这个问题。
它的原理是:创建一个顶点列表和一个索引列表。顶点列表包含所有唯一的顶点,而索引列表包含指向顶点列表的索引值,