DirectX11の描画の始まりと終わり

概要

最終更新日:2020/03/01

DirectX11の描画の開始と終了に必要な処理について書いています。
この記事は以下の内容を知りたい方に向けて書いています。
  • DirectX11で描画をするために必要なことを知りたい

サンプル

サンプルはここからダウンロードでき、環境については以下の内容となっています。

開発環境
VSのバージョン VisualStudio 2019
DirectXのバージョン DirectX11


描画の流れ

DirectX11の描画は以下のようにポリゴン等の描画の前後で行うべき処理があります。
  1. ビューをクリアする
  2. 画面に必要なデータを描画する
  3. ビューをフロントバッファに送信する

描画開始に必要なこと

DirectX11はDirectX9のように描画の開始を宣言する必要はなくなりました。
ですが、レンダーターゲット、デプスステンシルのビュークリアは
毎フレームの描画を開始する前に行わないと描画内容がおかしいことになります。
この事から描画開始に必要なことは各ビューのクリアです。
クリア関数はDirectX11で用意されており、レンダーターゲットビューのための関数と
デプスとステンシルの二つをまとめてクリアする関数があります。

レンダーターゲットビューのクリア

レンダーターゲットビューのクリアはのID3D11DeviceContextの
「ClearRenderTargetView関数」で行います。

directx_0143
// レンダーターゲットビューのクリア
m_Context->ClearRenderTargetView( 
	m_RenderTargetView,	// クリア対象のView
	clear_color );		// クリアカラー


第二引数に指定した色でターゲットビューがクリアされるので
デフォルトのウィンドウの背景色はここで指定できます。

デプスとステンシルビューのクリア

デプスとステンシルビューのクリアはのID3D11DeviceContextの
「ClearDepthStencilView関数」で行います。

directx_0144
// DepthViewとStencilViewのクリア
m_Context->ClearDepthStencilView( 
	m_DepthStencilView,				// クリア対象のView	
	D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL,	// クリアフラグ(今回はDepth、Stencilともにクリア)
	1.0f,						// 深度クリア値
	0 );						// ステンシルクリア値

第二引数はクリアするビューのフラグになっており、
上のサンプルのように二つのフラグを指定する場合は
ビット演算の「|」を使用します。
第三と第四は、それぞれデプスとビューのクリア時の初期値を設定しています。

描画終了に必要なこと

モデルなどの描画処理が終了したら、描き込んだレンダーターゲットビューの内容を
画面(フロントバッファ)に送信することで、描画処理が完全に終了となります。
この送信処理はIDXGISwapChainの「Present関数」を実行します。

directx_0145
// バッファを切り替える
m_SwapChain->Present(
	// 垂直同期のタイミング
	0,
	// 出力オプション
	0 );

Presentを実行することでレンダーターゲットがフロントバッファに転送されるので、
ウィンドウに描画された内容が出力されます。
第一引数は垂直同期のタイミングですが、0を指定すれば即時対応となるので、
基本的に値を変更する必要はありません。
第二引数は出力オプションですが、こちらも基本的には0指定で問題ありません。