今回は、前回解説して出現させた「ウィンドウフォーム」からDirect3D9デバイスを作成する方法を解説します。
1、デバイスの作成方法
Direct3D9デバイスの作成手順は以下のとおりになっています。
2、総括
今回はDirect3D9デバイスの作成方法と、そのための描画設定リストの設定項目について確認しました。設定項目の中には、解説不足なものも多くあったと思うので、今後それぞれ詳しく解説していきたいと思います。
次回からはこのDirect3D9デバイスを利用して画面への描画へと進んでいきます。
1、デバイスの作成方法
Direct3D9デバイスの作成手順は以下のとおりになっています。
ちなみに、このコードは前回配布したソースコードを抜粋したものです。各行について細かく説明をしていきます。
//Direct3D9デバイスを作成する
Device device; //代入用変数を用意
Direct3D direct3D = new Direct3D(); //Direct3Dインターフェースを作る(おまじない)
PresentParameters pp = new PresentParameters(); //デバイス作成にあたっての設定を容易
...
//上記で設定したパラメータでデバイスを作成
device = new Device(direct3D, 0, DeviceType.Hardware, frm.Handle, CreateFlags.HardwareVertexProcessing, pp);
- Direct3Dインターフェースを作成する(おまじない)
Direct3D direct3D = new Direct3D(); //Direct3Dインターフェースを作る(おまじない)
SharpDX.Direct3D9名前空間内Direct3Dクラスのインスタンスを作成しておきます。このインスタンスがないと、Direct3D9デバイスが作成できないので必ず作成しておく必要があります。 - 描画設定リストを作る
PresentParameters pp = new PresentParameters(); //デバイス作成にあたっての設定を容易
Direct3D9デバイスを作成するには、描画設定を予め伝えておかなくてはなりません。そのため、描画設定を格納する変数を用意します。型はそれ専用のPresentParameters(名前空間:SharpDX.Direct3D9)です。 - 描画設定(バックバッファ)を設定する
//バックバッファ関連
バックバッファとは、画面に直接描画するのではなく、代わりにメモリに書き込む機能です。この機能を利用することでCPUの処理とGPUの処理を分離して、全体的な流れの高速化が見込めます。また、メモリに完全に書き込んでから一気に画面に表示するので”ちらつき防止”の意味もあります。
pp.BackBufferCount = 1; //バックバッファを一枚用意
pp.BackBufferFormat = Format.A8R8G8B8; //バックバッファに保管する色要素はアルファ抜きRGB
pp.BackBufferWidth = frm.ClientSize.Width; //バックバッファの幅
pp.BackBufferHeight = frm.ClientSize.Height; //バックバッファの高さ
設定はソースコードを参照してください。バックバッファの大きさは、フォームの大きさを指定してください。 - 描画設定(Zバッファ)を設定する
//Zバッファとステンシルバッファの設定
Zバッファとは、一度書き込んだポリゴンのピクセルの遠さを記録しておくメモリです。これを有効にしておくと、遠くのものから近くのものにと順序に沿って物体を描画する必要がなくなります。Format.D16もありますが、精度不足に陥ることがよくあるのでD24X8を指定してください。
pp.AutoDepthStencilFormat = Format.D24X8; //Zバッファに24ビット,ステンシルバッファに8ビットの精度を与える
pp.EnableAutoDepthStencil = true; //Zバッファとステンシルバッファを有効にする - 描画設定(ウィンドウかフルスクリーンか)を設定する
//描画ウィンドウの設定
画面にどのように絵を描画するか設定します。この設定をfalseにするとフルスクリーンモードで描画ができるのですが、今回はウィンドウフォームを用いた描画なので解説しません。
pp.Windowed = true; //ウィンドウモードで設定 - 描画設定(フレーム更新タイミング)を設定する
//フレーム更新タイミング関連
描画した絵をどのタイミングで画面に表示させるか設定します。Defaultでは、ディスプレイの表示更新タイミングに合わせて表示させます。Immediateでは、ディスプレイを待たずに直ちに画面に反映させます。
pp.PresentationInterval = PresentInterval.Default; //ディスプレイの垂直同期に合わせて更新
このような性質上、ディスプレイの表示周波数によって設定をDefaultにした場合は、FPSがそれを超えることはありません。 - 描画設定(アンチエイリアス)を設定する
//アンチエイリアス設定
描画したポリゴンの縁がピクセル単位にまとめられてギザギザする減少を回避する機能がアンチエイリアスです。サンプルでは無効にしましたが、有効にしたい場合は、
pp.SwapEffect = SwapEffect.Discard;
pp.MultiSampleType = MultisampleType.None; //アンチエイリアス無効pp.MultiSampleType = MultisampleType.FourSamples; //アンチエイリアス有効
などと指定してください。 - デバイスを作成する
//上記で設定したパラメータでデバイスを作成
Direct3Dインターフェースと、フォームのハンドル、描画設定リストを使ってデバイスのコンストラクタを呼び出します。これが完了すれば、Direct3D9デバイスを取得することができ、いよいよ画面への描画が可能になってくるのです。
device = new Device(direct3D, 0, DeviceType.Hardware, frm.Handle, CreateFlags.HardwareVertexProcessing, pp);
2、総括
今回はDirect3D9デバイスの作成方法と、そのための描画設定リストの設定項目について確認しました。設定項目の中には、解説不足なものも多くあったと思うので、今後それぞれ詳しく解説していきたいと思います。
次回からはこのDirect3D9デバイスを利用して画面への描画へと進んでいきます。