初心者によるDirectX 9.0 入門講座

デバイスの作成

 さて、いよいよ Direct3D を使用してみましょう。プロジェクト等々の下準備は < コードを書く、その前に > を参照してください。下準備が完成すると、見慣れた何もないフォームに、コードを追加していきましょう、といいたいところですが、まずすることがあります。今回は、Sub Main をスタートアップに設定する必要があります。ソリューションエクスプローラのプロジェクトを右クリックして、プロパティをクリック。スタートアップの設定を Sub Main に設定します。では、改めてコードを書いていきましょう。

 まずは、Direct3D のデバイスの変数を宣言します。フォームのクラスのメンバ変数として宣言してください。

'Direct3Dのデバイス
Private dev As Device = Nothing

 ここで、Device クラスは Direct3D.Device のことを指します ( Microsoft,DirectX.Direct3D をインポートしているため ) 。
Device クラスは描画処理等々を担当するクラスです ( と勝手に思っています ) 。寿司屋で言えば寿司職人さんのような存在です ( ぇ 。

 次に、Direct3D を初期化する関数を追加します。フォームのクラスのメソッドとして宣言してください。

'デバイスの初期化
Friend Function InitializeGraphic() As Boolean
    Try
        '名前から想像するに、現在のパラメータ
        'デバイスの生成に必要な設定項目と思われる
        Dim presentParams As PresentParameters = New PresentParameters()

        'Trueならウィンドウモード、Falseならフルスクリーンモード
        presentParams.Windowed = True

        'Discardにすると、バックバッファの内容を更新せずに表示する
        presentParams.SwapEffect = SwapEffect.Discard

        dev = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)
        Return True
    Catch err As DirectXException
        Return False
    End Try
End Function  

 PresentParameters クラスは、コメントにもありますが、Device クラスを生成するときに必要な設定項目のようです。ここでは必要最低限のものを記述してあります ( 多分 ) 。その後いろいろ変更していくかもしれません。
 また、Device のコンストラクタの引数ですが、まったく分かりません ( w 。せいぜい分かるのは、DeviceType.Hardware くらいです。とりあえず、MS の DirectX SDK サンプルと同じ値を渡しているので問題は無いと思います。
 この関数は、初期化に成功すると True を、DirectX Exception が発生した場合 ( 初期化に失敗した場合 ) に False を返します。

 その次は、描画処理を行うメソッドを追加します。

'シーンのレンダリング(描写)
Private Sub Render()

    '画面を綺麗さっぱり指定色で塗りつぶす(初期化)
    dev.Clear(ClearFlags.Target, Color.Blue, 1.0F, 0)

    'シーンを開始
    dev.BeginScene()

    'ここにいろいろ描画処理を書く
    'dev.DrawPrimitive...等々

    'シーン終了
    dev.EndScene()

    'バックバッファを表示
    dev.Present()
End Sub

 Clear メソッドは、バッファや画面などを指定した色で塗りつぶします。つまり、前の画面の映像を消し去るわけです。引数に関して説明ですが、第一引数には、ClearFlags 列挙体を渡します。ClearFlags.Target は画面のクリアを行います。そのほかにも、ClearFlags.ZBuffer はZバッファの初期化、ClearFlags.Stencil はステンシルバッファの初期化があります。Zバッファとは、ポリゴンの前後関係をうまく描画するために使用するバッファのことです。ポリゴンをただ順番に描画していくと、先に描画してしまったポリゴンの上に、奥のほうにあるポリゴンが重ねて描画され、前後関係がおかしくなってしまうことがありますが、それを防止するための一時的にポリゴンを描画する場所、という風に思ってください。ステンシルバッファは知りませんw
 BeginScene と EndScene メソッドは、シーンの開始と終了を行うメソッドです。ポリゴンの描画は、シーンが始まっているときにしかできません。そして、描画が終わるとシーンを終了します。
 Present メソッドは、バックバッファに描画したポリゴンを、実際に画面に表示します。

 さて、残るは Main メソッドです。

'プロジェクトのスタートアップをSub Main()にしておく
Friend Shared Sub Main()
    Dim frm As Form1 = New Form1()
    'フォームのサイズ変更
    frm.Size = New Size(640, 480)

    'サイズ変更できないようにする
    frm.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide

    'グラフィックを初期化
    If Not frm.InitializeGraphic() Then
        MessageBox.Show("DirectX の初期化に失敗してしまいました。" & vbNewLine & "アプリケーションを終了します")
        Return
    End If

    'フォーム表示
    frm.Show()

    While frm.Created
        frm.Render()
        Application.DoEvents()
    End While
End Sub

 まず、Sub Main は Shared 修飾詞をつけなければいけないようです。
 その次、Form1 クラスは現在のフォームのクラスの名前です。そして、フォームの設定云々をした後、Direct3D の初期化メソッドを呼び出します。False を返されると終了するようになっています。
 While ループですが、frm.Created はおそらくウィンドウを右上の×ボタンを押すと False になると思われます。つまり、フォームが開いている間 ( 厳密には違うと思いますが ) は、ループするということを意味します。そして、そのループの中で Render メソッドを呼び出して描画処理を行います。また、 Application.DoEvents メソッドは、半無限ループでは通常マウスポインタが砂時計になってPCが危ない状態になりますが、それを回避してくれます。くわしい説明はこちら

 これで、デバイスの生成を行うプログラムの作成が終了しました。ビルドして実行してみてください。青い画面 ( もしくは指定した色 ) で塗りつぶされたフォームが現れると思います。エラーが出た人は、↓からソースをダウンロードしてどこがまずいか見比べてください。

 さて、次回はいよいよポリゴン ( 三角形 ) を描画してみます。ちょっとソースが長くなったりするので、すべての解説はしません。今回作成したソースを改造しながら作っていくので、同じ説明は2度しませんよ。
 また、次回あたりからソースを自分なりに改造していろいろ遊んでみてください。新しい発見があるかもしれません。では、今回はここまで。

・今回のソース
 download

BACK

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル