やっと初期化です。1つ1つの説明は後回しにして、とりあえずソースです。
using System; using System.Drawing; using System.Windows.Forms; //追加 using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Project1 { /// <summary> /// md3d1 の概要の説明です。 /// </summary> public class MD3D1:Form { //クライアント領域のサイズ const int clientHeight =600; const int clientWight =800; public MD3D1():base() { //最小サイズを設定 this.MinimumSize = new Size(60,60); //下は任意です。 //固定サイズのフォーム //this.FormBorderStyle = FormBorderStyle.FixedSingle; //サイダかボタン無し //this.MaximizeBox = false; //クライアント領域サイズ this.ClientSize =new Size(clientWight,clientHeight); //ウィンドウの名前(かっこいいのを付けてあげてください) this.Text ="Direct3D-My"; } private Device device_; /// <summary> /// Direct3Dの初期化を行います。 /// </summary> /// <returns>初期化が成功したかどうか</returns> public bool DXInitialize() { try { //プレゼンテーションパラメータを作成 PresentParameters pp = new PresentParameters(); //ウィンドウモード pp.Windowed =true; //スワップエフェクトを設定。 pp.SwapEffect = SwapEffect.Discard; //デバイスを作成 device_ = new Device(0,DeviceType.Hardware,this ,CreateFlags.HardwareVertexProcessing,pp); //初期化成功 return true; } catch { //初期化失敗 return false; } } public void Render() { //描画を行う。 } } /// <summary> /// エントリクラス /// </summary> class Program { public static void Main() { using(MD3D1 dxform =new MD3D1()) { //Direct3Dの初期化を実行 if(!dxform.DXInitialize()) { MessageBox.Show("Direct3Dの初期化に失敗しました。" ,"初期化の失敗"); return; } //ウィンドウを表示 dxform.Show(); //メッセージループ //フォームがある間だけまわるようにする while(dxform.Created) { //描画する dxform.Render(); //たまっているメッセージを処理する Application.DoEvents(); } } } } }
とりあえずソースコードの頭の方で「Microsoft.DirectX」と「Microsoft.DirectX.Direct3D」をusingしてください。
これは、デバイスにどのようなプレゼンテーションを行って欲しいかを設定するクラスです。今回はウィンドウモードで動くのでWindowedはTrueです。
SwapEffect(スワップエフェクト)とは、バックバッファとフロントバッファを切り替えるときにどのように切り替えるかを設定する物です。
バックバッファフロントバッファとは「バッファ」という名の付くように一時領域です。この一時領域の中に何があるのかというと、ディスプレイに表示される絵があります。このとき、ディスプレイに表示するためにデータを保持しているバッファをフロントバッファと言います。逆にフロントバッファの裏で、プログラムによって書き込みが行われているバッファをバックバッファと言います。そして、バックバッファへの描画が終わるとバックバッファとフロントバッファを取り替えます。
何故このようにバッファの役割が別れているのかというと、描き途中の絵を表示させないためです。この方法はバッファを2つ以上使うので「マルチバッファリング」と言ったりもします。
そして、このバッファの切り替えの時にどのように切り替えを行うかを設定するのが「SwapEffect」です。これは特にいじらなくても構いません。この設定が一番パフォーマンスが高いです。
今まで設定してきた情報を利用してデバイスの作成を行います。ここでは例外が起こる可能性あります。そのため、しっかりと「try catch」を行ってください。
public Device( int adapter, DeviceType deviceType, Control renderWindow, CreateFlags behaviorFlags, PresentParameters presentationParameters );
それでは1つ1つ説明していきます。
ディスプレイ アダプタとはWindows上ではグラフィックボードの事を指すらしいです。つまり、グラフィックボードが複数ある環境で役に立つ設定のようです。内蔵グラフィックアクセラレーターにボードを追加した環境では
つまり、ここで設定する数はどのデバイスを通して描画を行うかを設定する項目なります。0を指定する事で、プライマリディスプレイ(デフォルトのディスプレイカード)を選択します。
以前まではディスプレイが液晶ディスプレイや、CRTを指すように書いていましたが、そうではなくグラフィックボード(内蔵の場合はそれも含め)の事なので注意。
この設定は列挙型です。
上のような感じです。つまり、大抵は「Hardware」を利用します。デバック時や、ハードウェアが機能しないとき、フル機能を使いたいときは「Reference」を利用するという感じです。
名前の通り、描画して欲しいウィンドウを指定します。ここでは自分のフォームの上に描画して欲しいので「this」を指定します。
ここが結構重要かもしれません。どんなに見直しても例外で終了するときはここをまずいじってみてください。
大量にありますが、重要なのは最後の三つです。「MixedVertexProcessing」「HardwareVertexProcessing」「SoftwareVertexProcessing」ここでは、これらのうちどれか1つを設定しなければいけません。
これらの内容は頂点処理を誰が(「ソフトウェア」or「ハードウェア」)行うかを指定する物です。例外が出る場合は「SoftwareVertexProcessing」にしてみてください。
あらかじめ作っておいたPresentParametersをセットしてください。
とりあえず、これでDirect3Dでの初期化は終わりです。Main関数の中身もちゃんと書き換えたら実行してみてください。コード数も短く良い感じです。もしも例外が出た場合は次の通りにしてみて下さい。
とりあえずは、「CreateFlags behaviorFlags」をいじってください。それでもダメなら、「DeviceType deviceType」を「Reference」に設定してください。
もしもこれでもダメなら、メール・掲示板などで対応しています。