【DirectX11】【学习笔记(4)】顶点索引

Overview:

索引主要是用来定义如何画图元。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

 

你可能感兴趣的:(Directx11)