Direct3D を使用するための基本設定

Page updated :

The page you are currently viewing does not support the selected display language.

この Tips では「Microsoft Visual Studio 2005 Standard Edition」を使用して説明しますが、Visual Studio 2005 であれば基本的に他の種類でも設定はほとんど同じです。

とりあえずここからの説明は、「Visual Studio 2005 の使い方をある程度覚えた」「C# 言語をある程度理解している」「フォームのプロパティ設定、イベントの追加の仕方が分かる」ことを前程に説明していきます。

また、必要なコンポーネント(Visual StudioDirectX SDK)などはひととおりインストールしていることとします。


最初にプロジェクトを「Windows アプリケーション」で新規に作成します。フォーム名は「Form1」から「MainForm」へと変更しておきます。

Visual Studio 2005 で DirectX 関連のプログラミングを行うには、「参照設定」に DirectX 関連のコンポーネントを追加しなくてはなりません。

Direct3D」を使用するのですから、Direct3D 関連のクラスを使用することになります。しかし、今の状態だとコードを記述してもビルド時にクラスを認識してくれません。まずはじめにクラスを「参照」できる状態にします。ソリューションエクスプローラの「参照設定」を右クリックして「参照の追加」を選択します。

参照の追加

しばらくしてダイアログが表示されたら、「.NET」タブを選択して、以下の項目を選択します。複数選択するには「Ctrl」キーを押したまま項目をクリックしてください。

DLL の名前 バージョン
Microsoft.DirectX 1.0.2902.0
Microsoft.DirectX.Direct3D 1.0.2902.0
Microsoft.DirectX.Direct3DX 1.0.2911.0

参照の追加ダイアログ

インストールした DirectX SDK によっては同じ名前の DLL が複数あることがあります。April 2006 を使用する場合は上記のバージョンになります。ですが、多少古いバージョンでも掲載している Tips のプログラムは動作すると思います。ただし、バージョンが「2.0.0.0」のようにメジャーバージョンが2になっているものは Managed DirectX 2.0 なので注意してください。

「OK」ボタンを押すと「参照設定」に追加されたことがわかります。

追加後


次に MainForm のプロパティを下のテーブルのように変更します。すでに変更されている方は、そのままでいいです。

プロパティ名 説明
MaximizeBox False 最大化ボックスの有効フラグ
FormBorderStyle FixSingle フォームの枠
Text(この項目は任意) Managed DirectX サンプル フォームのタイトル名

MainForm のコードファイルを開き、下の赤文字を追加してください。

MainForm.cs

>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MDXSample
{
    /// <summary>
    /// メインフォーム
    /// </summary>
    public partial class MainForm : Form
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            // クライアントサイズ(フレームを除いたウインドウサイズ)
            this.ClientSize = new Size(640, 480);
        }
    }
}

フォームのクライアントサイズを「640×480」に設定します。クライアントサイズとは下の図のようなウインドウの枠を含まない領域のことです。ちなみに「640×480」とは、フルスクリーンゲームなどによく使われるサイズで、他にも「800×600」「1024×768」などがあります。このサイズはフルスクリーンで無ければ任意でかまいませんし、「ClientSize」プロパティを使わずに、デザイナでフォームのサイズを指定してもいいです。

クライアントサイズ


ではメインクラスのコード編集に移りますが、今回作成するコードはあくまでもサンプルとして説明しやすくなるように書き換えたものです。実際にソフト制作するときは、そのソフトにあわせたコードを書くようにして下さい。今回書くコードはどのソフトでも使用できるテンプレートではありません。


まずクラスをひとつ作成しましょう。基本的にサンプルはこのクラスにコードを書くようにします。プロジェクトを右クリックし、クラスを追加します。

クラス作成

下のようなダイアログが表示されますので、ファイル名を「MainSample.cs」としておきます。この名前がそのままクラス名となります。もちろん分かる人は自由に名前を付けてもらって結構です。

クラス作成

.cs」ファイルが作成され、画面に表示されました。

クラス作成


では、MainSample.cs のコードファイルを書き換えます。下のコードを参考にしてください。

「///」と記述してある部分はコメントです。ただ、「//」と違い「XML」というものが関係していますが、深く考えずにコメントだと思ってもらってかまいません。詳しく知りたい人は調べてみてください。

MainSample.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace MDXSample
{
    /// <summary>
    /// メインサンプルクラス
    /// </summary>
    public class MainSample : IDisposable
    {
        /// <summary>
        /// メインフォーム
        /// </summary>
        private MainForm _form = null;


        /// <summary>
        /// アプリケーションの初期化
        /// </summary>
        /// <param name="topLevelForm">トップレベルウインドウ</param>
        /// <returns>全ての初期化がOKなら true, ひとつでも失敗したら false を返すようにする</returns>
        /// <remarks>
        /// false を返した場合は、自動的にアプリケーションが終了するようになっている
        /// </remarks>
        public bool InitializeApplication(MainForm topLevelForm)
        {
            // フォームの参照を保持
            this._form = topLevelForm;

            return true;
        }

        /// <summary>
        /// メインループ処理
        /// </summary>
        public void MainLoop()
        {
        }

        /// <summary>
        /// リソースの破棄をするために呼ばれる
        /// </summary>
        public void Dispose()
        {
        }
    }
}

InitializeApplication メソッドは、Direct3D 関連のデータや各種データを初期化するためのメソッドです。フォームが表示される前に1度だけ呼ばれます。初期化、作成に失敗した場合は false を返すようにすると、アプリケーションがそのまま終了するようになります。

MainLoop メソッドは、3Dの計算描画を常に繰り返し行うためのメソッドです。このメソッドは Program クラスで毎回呼ばれるようにします。

Dispose メソッドは、Direct3D 関連の作成したリソースなどを解放するためのメソッドです。フォームが閉じた後に1度だけ呼ばれます。このメソッドは「IDisposable インターフェース」を継承しているので、Program クラスで必ず呼ばれるように設定しています。

念のためビルドしてみて、エラーがなければ次のセクションに進んでください。エラーがあると下のようにエラー内容が出るので、そこを修正してください。

エラー 初心者は意外と「;(セミコロン)」を忘れやすい


次に Program.cs ファイルのコードを書き換えます。このように書き換えておけば、今後このファイルは Direct3D の Tips でほとんど書き換えることはありません。説明は各行のコメントを見てください。

Program.cs

using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;

namespace MDXSample
{
    /// <summary>
    /// アプリケーション開始クラス
    /// </summary>
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // コントロール等を Windows XP のスタイルにします。
            // はずしてもかまいません。
            Application.EnableVisualStyles();

            // GDI+ を使用してコントロールのテキストを描画します。
            // はずしてもかまいません。
            Application.SetCompatibleTextRenderingDefault(false);

            // フォームとメインサンプルクラスを作成
            // using() で作成されたリソースは {} を外れると自動的に破棄される
            // ここでは frm と sample が対象
            using (MainForm frm = new MainForm())
            using (MainSample sample = new MainSample())
            {
                // アプリケーションの初期化
                if (sample.InitializeApplication(frm))
                {
                    // メインフォームを表示
                    frm.Show();

                    // フォームが作成されている間はループし続ける
                    while (frm.Created)
                    {
                        // メインループ処理を行う
                        sample.MainLoop();

                        // CPUがフル稼働しないようにちょっとだけ制限をかける。
                        // パフォーマンスを最大限にあげるなら「0」を指定、
                        // または「Thread.Sleep」をはずす。
                        Thread.Sleep(1);

                        // イベントがある場合はその処理する
                        Application.DoEvents();
                    }
                }
                else
                {
                    // 初期化に失敗
                }
            }
        }
    }
}

ビルド実行で何も問題なければ、この Tips は終了です。DirectX らしい処理は何もしていませんが、これらの設定は以降の Tips の基本として使いますので、覚えておいてください。ちなみに実行すると下のようになります。

実行