DirectX 11 基本三角形のレンダリング
デバイスから描画まで三角形を描く
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
DirectX 11で三角形を描画するには、Device、DeviceContext、SwapChain、RenderTargetView、VertexBuffer、Shaderが必要です。 ウィンドウ生成コードを除いて、レンダリングに必要なコアフローだけをまとめてみましょう。
デバイスとスワップチェーンの作成
DXGI_SWAP_CHAIN_DESC Desc{};
Desc.BufferCount = 1;
Desc.BufferDesc.Width = Width;
Desc.BufferDesc.Height = Height;
Desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
Desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
Desc.OutputWindow = WindowHandle;
Desc.SampleDesc.Count = 1;
Desc.Windowed = TRUE;
Desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&Desc,
&SwapChain,
&Device,
nullptr,
&DeviceContext
);
DeviceはGPUリソースを作成し、DeviceContextはコマンドの書き込みと実行に使用します。 SwapChainは画面に表示するBackBufferを置き換えます。
RenderTargetViewの作成
ID3D11Texture2D* BackBuffer = nullptr;
SwapChain->GetBuffer(0, IID_PPV_ARGS(&BackBuffer));
Device->CreateRenderTargetView(BackBuffer, nullptr, &RenderTargetView);
BackBuffer->Release();
BackBufferテクスチャをレンダーターゲットとして使用できるようにViewを作成します。
頂点バッファの生成
struct Vertex
{
DirectX::XMFLOAT3 Position;
DirectX::XMFLOAT4 Color;
};
Vertex Vertices[] =
{
{ { 0.0f, 0.5f, 0.0f }, { 1, 0, 0, 1 } },
{ { 0.5f, -0.5f, 0.0f }, { 0, 1, 0, 1 } },
{ { -0.5f, -0.5f, 0.0f }, { 0, 0, 1, 1 } }
};
D3D11_BUFFER_DESC BufferDesc{};
BufferDesc.ByteWidth = sizeof(Vertices);
BufferDesc.Usage = D3D11_USAGE_DEFAULT;
BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA InitialData{};
InitialData.pSysMem = Vertices;
Device->CreateBuffer(&BufferDesc, &InitialData, &VertexBuffer);
各フレームを描く
const float ClearColor[4] = { 0.08f, 0.08f, 0.12f, 1.0f };
DeviceContext->ClearRenderTargetView(RenderTargetView, ClearColor);
UINT Stride = sizeof(Vertex);
UINT Offset = 0;
DeviceContext->IASetVertexBuffers(0, 1, &VertexBuffer, &Stride, &Offset);
DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
DeviceContext->IASetInputLayout(InputLayout);
DeviceContext->VSSetShader(VertexShader, nullptr, 0);
DeviceContext->PSSetShader(PixelShader, nullptr, 0);
DeviceContext->OMSetRenderTargets(1, &RenderTargetView, nullptr);
DeviceContext->RSSetViewports(1, &Viewport);
DeviceContext->Draw(3, 0);
SwapChain->Present(1, 0);
Draw(3, 0)は頂点3個を0回から読み、三角形一つを描く。 黒い画面だけが出たら、頂点順、Viewport、Shaderコンパイル結果、RenderTarget接続から確認するのが良い。