2010年10月25日月曜日

SlimDXを勉強中

SlimDXとManaged DirectX、XNA、WPFと、C#のグラフィックを扱えるものは沢山あって、どれを使えば良いのかわからないという人は多いと思います。
私もすごく悩みました。

実はこの悩む時間は無駄でした。
だって、どれもすごく似ていてどれも面倒くさいのには変わりないんですもん。


WPFは系統が全く違うので別として、ネットで調べた感じではXNAが一番使いやすいらしいです。ただ、私はVisual Studio2008を使う気になれなかったので止めました。

それじゃあ、SlimDXかManaged DirectXですが、SlimDXのほうが圧倒的に機能が豊富で先進的ということでSlimDXにしました。

SlimDXC#でDirectXを使っちゃおうというものです。

中身はDirectXをラップしたただのライブラリですので、使い方が分からないと悩む必要は全くなく、DirectXの入門サイトをほぼそのまま参考にできます

Managed DirectXともそっくりですので、こちらの文献も参考にできます。

XNAもちょっとだけ似ているので参考にできます。


ダウンロードとインストールはこちらです。

現在(2010/10/25)、ランタイム(.NET 2.0 End User Runtime)とSDK(Developer SDK)があります。
プログラムを開発する人はSDKを使います。
作ったソフトを使うユーザーはランタイムをインストールすればOKです。ただし、.NET 2.0とわざわざ書いてあるように、.NET 4.0には対応していません。いずれ対応すると思いますが、.NET 4.0で作ったソフトはランタイムだけでは動かせないということを意識しておかなければいけません。もちろんSDKをインストールすれば動きます。

SlimDXのプログラミングを行うには、"SlimDX.dll"というファイルが必要です。SDKをインストールすればどこかにあるので、頑張って探してコピーしたり、Visual Studioなら参照して使ってください。

ちなみに"SlimDX.dll"4つもあるから全部探してみよう♪


サンプルとかは私がもっと勉強したら公開するかもしれません。
このサイトを参考にすれば全て分かる! というサイトが見つからないのでかなり面倒です。誰かすんごいサイト作って。

ちょっとだけ置いておきます。

SlimDXからDirect3D9を使うことにより、お茶をさすときに人が手を加えずとも茶瓶を回してくれる超イケてるサンプル。
using System;
using System.Drawing;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D9;
using SlimDX.Windows;

static class Program
{
  [STAThread]
  static void Main()
  {
    /* フォームを作るね */
    var form = new RenderForm("SlimDX - Mesh");

    /* いわゆる初期化ね */
    var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters(){
        BackBufferWidth        = form.ClientSize.Width,
        BackBufferHeight       = form.ClientSize.Height,
    });
    device.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
    device.SetRenderState(RenderState.CullMode, Cull.None);
    device.SetRenderState(RenderState.Lighting, false);

    /* 茶瓶を作るね */
    var mesh = Mesh.CreateTeapot(device);

    /* いわゆるメッセージループね */
    MessagePump.Run(form, ()=>{

        /* 描画前にクリアね */
        device.Clear(ClearFlags.Target|ClearFlags.ZBuffer, Color.Black, 1.0f, 0);

        /* BeginSceneとEndSceneの間でレンダリングというのをするらしいね */
        device.BeginScene();

        /* カメラの場所を変えるね */
        device.SetTransform(TransformState.World, Matrix.RotationY(Environment.TickCount/1000.0f));
        device.SetTransform(TransformState.View, Matrix.LookAtRH(
            new Vector3(0.0f, 3.0f, 0.0f-5.0f),
            new Vector3(0.0f, 0.0f, 0.0f),
            new Vector3(0.0f, 1.0f, 0.0f)
        ));
        device.SetTransform(TransformState.Projection,Matrix.PerspectiveFovRH(3.0f/4.0f, 1.0f, 1.0f, 100.0f)); 

        /* 茶瓶を描くね */
        mesh.DrawSubset(0);

        device.EndScene();

        /* 描いたやつを画面に表示するね */
        device.Present();
    });

    /* 作ったオブジェクトを全部削除するね */
    foreach(var item in ObjectTable.Objects){
      item.Dispose();
    }
  }
}

実は茶瓶じゃなくて自分が回ってるんだけどね!!!

.NET4.0を使っています。コンパイルするときは"SlimDX.dll"を参照しなければなりません。


※2011/3/4追記

Direct3Dに関してよさげな本を見つけました。

DirectXってさぁ、ネットで入門サイトを検索して、サンプルをコピペすれば動くんだけどさ、凄そうなんだけどさ、

これ使って何ができて何ができないの?

どこをどうプログラミングすれば良いの?

そもそもDiredctXって何なの?

私は、Direct3Dが描画の際にレンダリングパイプラインというのを使うのは色々調べているうちに知っていたのですが、上で書いたサンプルのどことどう関係しているのかいまいち分からなかったのです。それがこの本で理解できました。


これはシェーダプログラミングというDirectXのちょっと高度な使い方の入門書なのですが、最初のほうにDirectXの初歩について書いてあります。それが分かりやすかったです。
約400ページの全6章構成の超大作なのですが、私が読んだのは1章の1~7、25~31、2章の47~65だけです。他は必要になったら読むとしてこれだけでレンダリングパイプラインのことと、どこをプログラミングすべきなのかが良くわかりました。

おすすめです。

0 件のコメント:

コメントを投稿