从零开始的D3D生活(1)

渲染流水线

渲染流水线是以虚拟摄像机为视角进行观察,并据此生成给定3D场景的2D图像的一套处理步骤.

流水线

输入装配阶段

数据表示

在数学上,顶点只是几何图元中的特殊点.在Direct3d中,顶点的意义往往不止如此.事实上,顶点中还可以包含其他信息.这使得我们能够利用它来表现出更多的渲染效果.

比方说下面的代码定义了两种不同的顶点结构.Vertex1包含有颜色的额外信息.而Vertex2则包含了当前的法向量和两组2D的纹理坐标.

1
2
3
4
5
6
7
8
9
10
11
struct Vertex1 {
XMFLOAT3 pos;
XMFLOAT4 color;
};

struct Vertex2 {
XMFLOAT3 pos;
XMFLOAT3 normal;
XMFLOAT2 tex0;
XMFLOAT2 tex1;
};

在D3D中,我们通过一种名为顶点缓冲区的线性结构,来存储一系列的顶点,将其与渲染流水线绑定.同时利用图元拓扑来告知顶点之间的关系.

1
m_command_list ->  IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_LINELIST)

上述代码便是指定图元拓扑为线列表模式.即每两点构成一条线段.

同理还有 D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST 三角形带.

值得注意的是三角形带的奇数好和偶数好的三角形的绕序是不一样

图元拓扑

以上举了两个图元拓扑的例子.具体可以参考官方文档给出的详细枚举列表.

索引

下面两个顶点数组展示用于构建四边形的三角形链表.

1
2
3
4
Vertex quad[6]= {
v0,v1,v2,
v0,v2,v3
}

为三角形指定顺序的工作是非常重要的.

确定的绕续能让我们更好的计算一个三角形的的正反面

….

理论部分先滚蛋.pipeline state的每一层都可以挖太多的坑.如果单纯的去记忆而不和实践结合,估摸着一会就能忘完.所以我们先通过实例来解决学习上的问题.

定义

我们先前定义了几何点的数据结构,但是c++不是java,D3D很显然不可能知道我们定义的节点结构的每月含义.我们依靠D3D12_INPUT_LAYOUT_DESC来描述这个结构的每一个成员所代表的含义.

1
2
3
4
5
6
7
8
9
10
11
typedef struct D3D12_INPUT_LAYOUT_DESC{
const D3D12_INPUT_ELEMENT_DESC *pInputElementDescs;
UINT NumElements;
D3D12 INPUT_LAYOUT_DESC;

}
D3D12_INPUT_ELEMENT_DESC inputElementDescs[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
};