マイクロソフトはVirual C++用にMFCライブラリというものを提供してくれています。
MFCではメッセージハンドラやウインドウフレームワークなどの基本的な部分をパッケージ化してくれているので、Windowsアプリケーションを作成がとても楽になります。
MFCライブラリを使ったアプリケーションから DirectX 11 を利用する方法について考えてみます。
右の図のような三角形を表示するアプリケーションです。
アプリケーションのウインドウはMFCのテンプレートを使って作成し、そのウインドウ内の描画を DirectX 11 を使って行っています。
三角形を描画する部分は以下の記事も参考にしてみてください
プロジェクトを作成する
作成するプロジェクトは「MFCアプリケーション」テンプレートを使って作成してみる事にします。
※Visual Studioを使って開発する事を前提としています
ウインドウの作成などをコードを書くことなくウィザードを進めていくだけで作れるので楽ちんです。
アプリケーションの種類では「シングル ドキュメント(S)」を選びます。
その他でも作ることは出来ますが、DirectXを使うアプリと言えば大体シングル ドキュメントになると思うので。
また、「ドキュメント/ビュー アーキテクチャのサポート(V)」のチェックは外しています。
これを使うほどのアプリではないしソースが複雑になるので。
システムメニューやステータスバーの有無などもウィザードで選択するだけ。
完了すると以下のような名前のクラスが出来上がってきます。
- CMFCxDX11App ・・・ メインウインドウの作成から終了までを管理する。(プロジェクト名のクラス)
- CMainFrame ・・・メインウインドウのクラス。メニュー・ステータスバー・描画エリアなどを管理する。
- CChildView ・・・ 描画エリアを管理するクラス。
DirectX 11ライブラリのインクルード
DirectX のライブラリを参照できるように、ヘッダーファイルなどのインクルードを行います。
stdafx.hファイルの一番最後に以下の定義を書き加えていきます。
: : : #include <d3d11.h> #pragma comment(lib, "d3d11.lib")
DirectX で三角形を描画するクラスを作成
CChildViewクラスなどにコードを書き加えていってもいいのかもしれませんが別クラスで作っています。
三角形を描画する部分は以下の記事を参照してください。
~プログラミング~ DirectX 11で三角形を表示しよう
~プログラミング~ DirectX 11で三角形を表示しよう(ソースコード)
ヘッダーファイルとソースファイル
ヘッダーファイルとソースファイルの作成は「ソリューションエクスプローラ」から追加するのが簡単かと思います。
.hファイルは「ヘッダーファイル」フォルダを右クリックして、
.cppファイルは「ソースファイル」フォルダを右クリックしてから
「追加(D)」→「新しい項目(W)...」を選んでファイルを作成していきます。
シェーダーファイル
頂点シェーダーとピクセルシェーダーもそれそれ作成します。
シェーダーファイルの作成とコンパイルについては以下を参照してください。
~プログラミング~ DirectX 11でシェーダーをコンパイルしよう
コンパイル時に「/Fh」オプションを使うとヘッダーファイルが作成されます。
出来上がったファイルはプロジェクトフォルダへ格納します。
ヘッダーファイルをインクルード
作成したヘッダーファイルをプロジェクトが参照できるようインクルードします。
stdafx.hファイルの一番最後に以下の定義を書き加えていきます。
: : : #include <d3d11.h> #pragma comment(lib, "d3d11.lib") #include "vs_test.h" #include "ps_test.h" #include "CD3DTest.h"
DirectX の初期化から表示まで
インスタンスの作成
先ずは自作したCD3DTestクラスのインスタンスを作成します。
描画エリアのウインドウを管理するCChildViewクラスのメンバ変数として持たせます。
class CChildView : public CWnd { public: CD3DTest m_D3D; //←ココを追加 : : }
DirectXの初期化
本来ならCChildViewが作成される時(onCreateメソッドの中)でDirectXの初期化をしたいところですが、この時はウインドウサイズが0な状態なため、サイズ変更時「OnSizeメソッドの中」で行うようにしています。
※DirectX初期化時に作成しているバックバッファをウインドウサイズと同じにしたい為
ChildView.hを開いてからプロパティウインドウを表示し、「WM_SIZE」メッセージに応答するOnSizeメソッドを追加します。
OnSizeメソッドへ以下のように初期化のためのコードを書き加えていきます。
void CChildView::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if ( ( 0 < cx ) && ( 0 < cy ) ) { if (NULL == m_D3D.m_pDevice) { m_D3D.Create( m_hWnd ); } } }
※エラー処理だったり再度ウインドウサイズを変えられた場合の処理が無いなど足りない部分の多いコードですが。
描画する
通常なら秒間数十フレームという速度で描画し続ける作りにするところですが、今回は取りあえず必要な時だけ表示するという感じにしています。
ウインドウの再描画が必要な時にポストされるWM_PAINTメッセージで描画を行います。
void CChildView::OnPaint() { CPaintDC dc(this); // 描画のデバイス コンテキスト m_D3D.Render(); }
- ~プログラミング~ DirectX 11を始めよう
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その1
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その2
- ~プログラミング~ DirectX 11の初期化をしよう その1
- ~プログラミング~ DirectX 11の初期化をしよう その2
- ~プログラミング~ DirectX 11で深度/ステンシルバッファを準備しよう
- ~プログラミング~ DirectX 11でシェーダーをコンパイルしよう
- ~プログラミング~ DirectX 11で三角形を表示しよう
- ~プログラミング~ DirectX 11の頂点バッファとインデックスバッファ
- ~プログラミング~ DirectX 11で立体を表示しよう その1
- ~プログラミング~ DirectX 11で立体を表示しよう その2
- ~プログラミング~ DirectX 11で平行光源ライティング
- ~プログラミング~ DirectX 11で点光源ライティング
- ~プログラミング~ DirectX 11で拡散反射 (Diffuse reflection)
- ~プログラミング~ DirectX 11で鏡面反射 (Specular reflection)
- ~プログラミング~ DirectX 11で環境反射 (Ambient reflection)
- ~プログラミング~ DirectX 11でフォン反射モデル
- ~プログラミング~ DirectXTexライブラリを導入しよう
- ~プログラミング~ DirectX 11でテクスチャマッピング
コメントをお書きください