[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>本当の3D(2.0)

本当の3D(2.0)

ここに書いてあるソースは1.1の改造版です。まずはそちらをお読み下さい。

コレを作っている過程で原因不明の表示できない症状に襲われました。このソースコードは大丈夫だと思いますが、もしもダメな場合は対応します。

ソースコード

カメラ、ライトで若干の変化があります。

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX.Generic;
using Microsoft.DirectX.Direct3D.CustomVertex;



namespace Project1
{
    /// <summary>
    /// md3d1 の概要の説明です。
    /// </summary>
    public class MD3D1 : Form
    {

        public MD3D1()
            : base()
        {
            //最小サイズを設定
            this.MinimumSize = new Size(80, 60);
            this.ClientSize = new Size(300, 300);
            this.Text = "Direct3D-My";
        }

        private Device device_;

        /// <summary>
        /// Direct3Dの初期化を行います。
        /// </summary>
        /// <returns>初期化が成功したかどうか</returns>
        public bool DXInitialize()
        {
            try
            {
                //プレゼンテーションパラメータを作成
                PresentParameters pp = new PresentParameters();

                //ウィンドウモード
                pp.IsWindowed = true;

                //スワップエフェクトを設定。
                pp.SwapEffect = SwapEffect.Discard;

                //デバイスを作成
                device_ = new Device(0, DeviceType.Hardware, this.Handle
                    , CreateFlags.HardwareVertexProcessing, pp);

                //#################################################追加
                //頂点バッファを作成
                this.creatVertex();
                //#################################################ここまで
                //初期化成功
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                //初期化失敗
                return false;
            }

        }

        //#################################################追加
        /// <summary>
        /// 頂点バッファ
        /// </summary>
        private VertexBuffer vertexBuffer_;

        /// <summary>
        /// 頂点バッファ作成関数
        /// </summary>
        private void creatVertex()
        {
            //頂点バッファ領域を確保
            vertexBuffer_ = new VertexBuffer(device_
                , PositionColored.StrideSize * 3, 0
                , PositionColored.Format, Pool.Default
                , new EventHandler(setVertexData));

        }

        /// <summary>
        /// 何故かイベントを受け取ってから処理する
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void setVertexData(object sender, EventArgs e)
        {
            VertexBuffer vb = ((VertexBuffer)sender);

            PositionColored[] verts = new PositionColored[3];

            //頂点データ
            verts[0].Position = new Vector3(0, 2.0f, 0);
            verts[0].Color = System.Drawing.Color.LightPink;
            verts[1].Position = new Vector3(1.0f, 0, 0);
            verts[1].Color = System.Drawing.Color.Aqua;
            verts[2].Position = new Vector3(-1.0f, 0, 0);
            verts[2].Color = System.Drawing.Color.Brown;




            //バッファをロック
            GraphicsBuffer<PositionColored> gb
                = vb.Lock<PositionColored>(0, 0, 0);

            //頂点データをバッファに書き込み
            gb.Write(verts);


            //バッファのロックを解除
            vb.Unlock();
        }

        public void Render()
        {
            if (device_ == null) return;
            if (this.WindowState == FormWindowState.Minimized) return;

            //カメラの設定を行う
            device_.Transform.View = Matrix.LookAtLeftHanded(
                new Vector3(0.0f, 0.0f, -5.0f),
                new Vector3(0.0f, 0.0f, 0.0f),
                new Vector3(0.0f, 1.0f, 0.0f));

            device_.Transform.Projection =
                Matrix.PerspectiveFieldOfViewLeftHanded((float)Math.PI / 4,
                (float)this.ClientSize.Width / (float)this.ClientSize.Height,
                3.0f, 15.0f);


            device_.RenderState.Lighting = false;
            //クリア処理
            device_.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);


            //描画開始
            device_.BeginScene();

            //頂点バッファをセット
            device_.SetStreamSource(0, vertexBuffer_, 0
                , PositionColored.StrideSize);
            //頂点バッファのフォーマットをセット
            device_.VertexFormat = PositionColored.Format;
            //描画
            device_.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

            //描画終わり
            device_.EndScene();

            //更新
            device_.Present();
        }
    }

    /// <summary>
    /// エントリクラス
    /// </summary>
    class Program
    {
        public static void Main()
        {
            try
            {
                using (MD3D1 dxform = new MD3D1())
                {
                    //Direct3Dの初期化を実行
                    if (!dxform.DXInitialize())
                    {
                        MessageBox.Show("Direct3Dの初期化に失敗しました。"
                            , "初期化の失敗");
                        return;
                    }

                    //ウィンドウを表示
                    dxform.Show();

                    //メッセージループ
                    //フォームがある間だけまわるようにする
                    while (dxform.Created)
                    {
                        //描画する
                        dxform.Render();
                        //たまっているメッセージを処理する
                        Application.DoEvents();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

変更点

カメラの部分のメソッド名が変化しているようです。

省略されていた名前が展開されています。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ

初版2006-3-11
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>本当の3D(2.0)