Windowsストアアプリ入門(DirectX) vol2.三角形を描画するに引き続いて今回はポリゴンを複数描画してみます。
千里の道も一歩から、地道に少しずつ進んで行こうと思います。
今回の完成イメージはこんな感じ。
サンプルソースコードはGitHubにて公開中。
修正ファイルは前回同様CubeRender.cppをベースにしたものです。
まずは、CreateDeviceResourcesメソッドを以下のように修正。
// 2つのポリゴンを描画するためのVertexBufferを用意
auto createCubeTask = (createPSTask && createVSTask).then([this] () {
VertexPositionColor cubeVertices[] =
{
{XMFLOAT3(0.5f, 0.0f, 0.0f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
{XMFLOAT3(0.0f, 0.0f, 0.0f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
{XMFLOAT3(0.0f, 0.5f, 0.0f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
};
D3D11_SUBRESOURCE_DATA vertexBufferData = {0};
vertexBufferData.pSysMem = cubeVertices;
vertexBufferData.SysMemPitch = 0;
vertexBufferData.SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC vertexBufferDesc(sizeof(cubeVertices), D3D11_BIND_VERTEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&vertexBufferDesc,
&vertexBufferData,
&m_vertexBuffer
)
);
VertexPositionColor cubeVertices2[] =
{
{XMFLOAT3(-1.0f, 0.0f, 0.0f), XMFLOAT3(0.6f, 1.0f, 1.0f)},
{XMFLOAT3(0.0f, -0.0f, 0.0f), XMFLOAT3(0.6f, 1.0f, 1.0f)},
{XMFLOAT3(0.0f, -1.0f, 0.0f), XMFLOAT3(0.6f, 1.0f, 1.0f)},
};
D3D11_SUBRESOURCE_DATA vertexBufferData2 = {0};
vertexBufferData2.pSysMem = cubeVertices2;
vertexBufferData2.SysMemPitch = 0;
vertexBufferData2.SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC vertexBufferDesc2(sizeof(cubeVertices2), D3D11_BIND_VERTEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&vertexBufferDesc2,
&vertexBufferData2,
&m_vertexBuffer2
)
);
unsigned short cubeIndices[] =
{
0,1,2
};
m_indexCount = ARRAYSIZE(cubeIndices);
D3D11_SUBRESOURCE_DATA indexBufferData = {0};
indexBufferData.pSysMem = cubeIndices;
indexBufferData.SysMemPitch = 0;
indexBufferData.SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC indexBufferDesc(sizeof(cubeIndices), D3D11_BIND_INDEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&indexBufferDesc,
&indexBufferData,
&m_indexBuffer
)
);
D3D11_RASTERIZER_DESC rdc;
ZeroMemory(&rdc, sizeof(rdc));
rdc.FillMode = D3D11_FILL_SOLID;
rdc.CullMode = D3D11_CULL_FRONT;
rdc.FrontCounterClockwise = true;
m_d3dDevice->CreateRasterizerState(&rdc, &m_pRasterizerState);
rdc.CullMode = D3D11_CULL_BACK;
m_d3dDevice->CreateRasterizerState(&rdc, &m_pRasterizerStateBack);
});
Renderメソッドの下部をメソッド抽出。
// 複数オブジェクトの描画に対応するためにメソッド化
// さらに増やしたい場合はVertexBufferを配列に格納してぐるぐる回すと良さそう
this->RenderObject(m_vertexBuffer);
this->RenderObject(m_vertexBuffer2);
}
/**
* 複数のポリゴンの描画に対応するためにメソッド抽出
*/
void CubeRenderer::RenderObject(Microsoft::WRL::ComPtr<ID3D11Buffer> m_vertexBuffer)
{
UINT stride = sizeof(VertexPositionColor);
UINT offset = 0;
m_d3dContext->IASetVertexBuffers(
0,
1,
m_vertexBuffer.GetAddressOf(),
&stride,
&offset
);
m_d3dContext->IASetIndexBuffer(
m_indexBuffer.Get(),
DXGI_FORMAT_R16_UINT,
0
);
m_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_d3dContext->IASetInputLayout(m_inputLayout.Get());
m_d3dContext->VSSetShader(
m_vertexShader.Get(),
nullptr,
0
);
m_d3dContext->VSSetConstantBuffers(
0,
1,
m_constantBuffer.GetAddressOf()
);
m_d3dContext->PSSetShader(
m_pixelShader.Get(),
nullptr,
0
);
m_d3dContext->RSSetState(m_pRasterizerState);
m_d3dContext->DrawIndexed(
m_indexCount,
0,
0
);
m_d3dContext->RSSetState(m_pRasterizerStateBack);
m_d3dContext->DrawIndexed(
m_indexCount,
0,
0
);
}
それぞれの処理は前回のものを繰り返し実行しているだけなんので、復習もかねて処理を眺めてみてください。
Please give us your valuable comment