索引主要是用来定义如何画图元。eg:画一个正方形需要两个三角形,6个顶点。
如果用了索引的画,只需要4个顶点,定义第一个三角形为顶点0,1,2 第二个三角形为顶点0,2,3
ID3D11Buffer* squareIndexBuffer;
ID3D11Buffer* squareVertBuffer;
Vertex v[] =
{
Vertex( -0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f ),
Vertex( -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f ),
Vertex( 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f ),
Vertex( 0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f ),
};
我们首先创建顶点索引数组:
DWORD indices[] = {
0, 1, 2,
0, 2, 3,
};
然后我们填充顶点索引缓冲描述结构体:
D3D11_BUFFER_DESC indexBufferDesc;
ZeroMemory( &indexBufferDesc, sizeof(indexBufferDesc) );
indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;
indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indexBufferDesc.CPUAccessFlags = 0;
indexBufferDesc.MiscFlags = 0;
(这部分和创建顶点缓冲结构描述体有点类似)
然后我们用D3D11DeviceContext::CreateBuffer()来创建顶点索引缓冲,再利用IA阶段的方法把索引缓冲加入到管线中
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &squareIndexBuffer);
d3d11DevCon->IASetIndexBuffer( squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
设置缓冲的参数:
1 要设置的缓冲
2 缓冲格式(我们这里指定了一个32位浮点数,也可以指定其它格式。至于这个格式与indexBufferDesc.ByteWidth是不是必须保持一致呢?我会在稍后尝试一下看看)
因为我们顶点数组多了一个顶点,所以要把顶点缓冲描述体里的ByteWidth 改成4
CleanUp
void CleanUp()
{
//Release the COM Objects we created
SwapChain->Release();
d3d11Device->Release();
d3d11DevCon->Release();
renderTargetView->Release();
squareVertBuffer->Release();
squareIndexBuffer->Release();
VS->Release();
PS->Release();
VS_Buffer->Release();
PS_Buffer->Release();
vertLayout->Release();
}
最后一定要清除索引指针!
D3D11DeviceContext::DrawIndexed()
用这个方法代替之前的用顶点作画。第一个参数是要画的索引数,第二个是索引偏移量,第三个是顶点缓冲偏移量。
因为我们可以有两个索引缓冲,而只有一个顶点缓冲。所以当同一个顶点缓冲有sphere和box的顶点时(Box在后)
我们想画box,就必须设置第三个参数为sphere的顶点数。
void DrawScene()
{
//Clear our backbuffer
float bgColor[4] = {(0.0f, 0.0f, 0.0f, 0.0f)};
d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);
//Draw the triangle
d3d11DevCon->DrawIndexed( 6, 0, 0 );
//Present the backbuffer to the screen
SwapChain->Present(0, 0);
}
本节内容就到这里拉。
本节内容代码可以在我的Github仓库找到!Github传送门
游戏开发路途遥远,但我相信只要坚持,总能到达彼岸!
如果我的文章对于你学习DirectX11有点帮助,欢迎评论给出建议,让我们一起学习进步!
———————— 小明 2018.11.15 14.53