【DX12を学びたい】デバイス作成~背景の色を変更する

背景色の変更 DirextX

前ページで描画に必要なものは作成したので、描画の実装を行います。

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();
	}
}

 

さいごに

駆け足気味でしたが、背景の色が変更できました!

次は三角形を表示させたい。

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
DirextX
スポンサーリンク
シェアする

コメント