​塗りつぶし

 DirectXを使った最初のプログラムとして、画面を塗りつぶすプログラムを作ってみたいと思います。そして今回作るプログラムは、今後作っていくDirectXのプログラムとしては、最小で最低限必要な内容となっています。それでは、そんな最小の内容を構成する主要メンバを見ていきたいと思います。今回は以下の4つです。


1. IDXGISwapChain
2. ID3D11Device
3. ID3D11DeviceContext
4. ID3D11RenderTargetView

 

1. はスワップチェインといって、イメージの出力先を管理するところです。2. ではDirectXが描画を行うための環境やリソースの作成を行います。3. は実際に何かを描画する際の実行命令を出し、描画を制御するところです。4. はDirectX本体とそこで使用されるリソース(頂点や法線、その他定数、画像等のテクスチャ)とを繋いで受け渡しを手伝う役割があります。
 

DirectX本体からでは、直接リソースへのアクセスができません。DirectX本体とリソースとを繋ぐものはビューを呼ばれています。ビューには何種類かあり、今回使用したものは、レンダリング結果とその描画先バッファとを繋ぐ、レンダーターゲットビューと呼ばれているものです。

 全体の流れとしては、1.と2.を最初に作成します。ここまでが、描画を行うための準備段階です。準備が終わると、実際に描画を行います。描画を行うに当たっての命令を3.によって出してあげます。出来上がったイメージは4.を経由してスワップチェイン内のバッファへ書き込まれます(ここまでが舞台裏の作業になります)。書き込みが終わったバッファは、すぐにスワップチェインによって描画先のウインドウへ送られて、表舞台に姿を表し目に見れるようになります。

​コード解説

① SwapChainの作成
 SwapChainとは、イメージを出力するためのバッファ関連を管理しているところです。SwapChainを作成するためには、DXGI_SWAP_CHAIN_DESC構造体にこれから描画を行う対象の大まかな情報を指定する必要があります。例えば、出力イメージの大きさや品質、描画先ウインドウの指定などです。

上記の中では、2行目、3行目で作成するバッファの大きさを横1000、縦800で指定しています。ちなみに、ここで指定している大きさは、最終的に出力されるイメージの大きさであり、実際のウインドウ上で表示される大きさではありません。今回の塗りつぶすだけのサンプリでは分かりにくいですが、他のサンプルなどで値を縦横50なんかにしてみると、その意味していることが分かるかと思います。

② 描画先の作成
 レンダーターゲットビューとスワップチェインが持っている描画先バッファとの関連付けを行います。

ID3D11Texture2Dへ描画先バッファをスワップチェインから取得して(2行目)、3行目でレンダーターゲットビューと描画先バッファとの関連付けを行っています。描画先バッファの取得の際に使用したID3D11Texture2Dは、ここ以外で使われないため、4行目で解放しています。

③ 描画処理
 ウィンドウに対してメッセージが来た場合にはメッセージ処理を、それ以外の場合は、常にDirectXの処理をするように通常のメッセージループ部分を以下のように少し変えてあげます。

この中でも今回DirectXの描画として実行されている部分は7行目~9行目のたったの3行です。それをひたすら実行し続けます。それぞれ簡単に説明すると、


6行目:背景色の指定
7行目:指定された色を背景に設定
8行目:ウインドウ上に表示

 

といった感じになります。

サンプル​コード

< 動作確認環境 >
 ・Windows10 Pro
 ・Visual Studio Community 2017


基本的には空のプロジェクトを作ってもらい、以下のソースコードをコピペするだけでうまく実行できるかと思います。もしうまくいかない場合がありましたら、サンプルコードの実行に関する注意事項を一度参照してみてください。


サンプルプログラム1