前ページで描画に必要なものは作成したので、描画の実装を行います。
1:デバッグレイヤーの有効化
2:デバイスの作成
3:その他諸々の作成
4:バックカラー変更の実装
コマンドのリセット
フレームの最初で描画コマンドを空にしたいので、コマンドリストとアロケータのResetを呼ぶ関数を用意しておきます。
// コマンドのリセット
void Graphic::ResetCommand()
{
m_pCommandAllocator->Reset();
m_pCommandList->Reset(m_pCommandAllocator, nullptr);
}
レンダーターゲットの設定
描画する画面の設定を行います。
OMSetRenderTargetsを使用します。
ついでに画面のクリアも行っています。
ClearRenderTargetViewを使用します。
// レンダーターゲットの設定
void Graphic::SetRenderTarget()
{
// リソースバリアの設定
D3D12_RESOURCE_BARRIER desc;
// 遷移
desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
desc.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
// レンダーターゲットのリソースをセット
desc.Transition.pResource = m_pRenderTargets[m_FrameIndex];
desc.Transition.Subresource = 0;
// present → render targetへ
desc.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
desc.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
// リソースの状態を遷移させる
m_pCommandList->ResourceBarrier(1, &desc);
D3D12_CPU_DESCRIPTOR_HANDLE handle = m_pRenderTargetHeap->GetCPUDescriptorHandleForHeapStart();
handle.ptr += m_FrameIndex * m_RTVIncrementSize;
// レンダーターゲットビューを設定
m_pCommandList->OMSetRenderTargets(
1, // レンダーターゲットの数
&handle,
true, // 一旦true
nullptr // 深度用
);
// 画面全体をクリア
float color[] = { 0.5f, 0.5f, 0.5f, 1.0f };
m_pCommandList->ClearRenderTargetView(
handle,
color, // 色
0,
nullptr // nullで全体
);
}
リソースバリア
今のリソース状態を設定するためのもの。
なくても実行はできたが、デバッグレイヤーのエラーが出力される。
状態は色々ありますが、今回は「present → render target」と「render target →present」のみ使用します。
コマンドの実行
コマンドの追加が終わったら、リソースバリアで状態を遷移させ、Closeを呼んで閉じます。
その後、ExecuteCommandListsでコマンドを実行して、Presentで画面を交換します。
あとは処理が完了するまで待って、インデックス番号を更新。
// コマンドを実行
void Graphic::ExecuteCommand()
{
// リソースバリアの設定
D3D12_RESOURCE_BARRIER desc;
desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
desc.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
desc.Transition.pResource = m_pRenderTargets[m_FrameIndex];
desc.Transition.Subresource = 0;
// render target → presentへ
desc.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
desc.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
// リソースの状態を遷移させる
m_pCommandList->ResourceBarrier(1, &desc);
// クローズ
m_pCommandList->Close();
// コマンドを実行
ID3D12CommandList* commandList[] = { m_pCommandList };
m_pCommandQueue->ExecuteCommandLists(1, commandList);
// 画面を交換
m_pSwapChain->Present(1, 0);
// 完了するまで待つ
const UINT64 fence = m_FenceValue;
m_pCommandQueue->Signal(m_pFence, fence);
m_FenceValue++;
if (m_pFence->GetCompletedValue() < fence)
{
m_pFence->SetEventOnCompletion(fence, m_pFenceEvent);
WaitForSingleObject(m_pFenceEvent, INFINITE);
}
// インデックスを更新
m_FrameIndex = m_pSwapChain->GetCurrentBackBufferIndex();
}
あとはmain.cppでグラフィッククラスの処理を追加すれば背景色が変わるはずです。
// DirectX関連のクラス
Graphic directX;
if (directX.Initialize(hwnd))
{
// メインループ
MSG msg = {};
while (true)
{
// コマンドをリセット
directX.ResetCommand();
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 終了
if (msg.message == WM_QUIT) {
break;
}
// レンダーターゲットの設定
directX.SetRenderTarget();
// コマンドを実行
directX.ExecuteCommand();
}
}
さいごに
駆け足気味でしたが、背景の色が変更できました!
次は三角形を表示させたい。
コメント