2012年

11月

19日

SlimDXからSharpDXへ移植したかった・・・

以前「C#でBullet Physicsを使いたい」でチョロッと紹介したSharpDX。

今回SlimDXからこのSharpDXへ移植を試みました。

 

SlimDXからSharpDXへ移植する利点は以下の3点です。

・C++ Runtimeを必要としない

・Mono Developで動作可能

・SlimDXより処理が早い

 

開発者側にもエンドユーザー側にもうれしい利点です。

 

欠点は日本語のドキュメントが少ないことです。SharpDXに関したヘルプ・解説サイトは2012年11月現在、ほぼ存在しません。その点は不便かもしれません。

 

SharpDX 公式ページ

今回はSharpDX 2.4.0 Fullの「Standard-net40」を使用しました。

手ごろなところで、以前「DirectXを子ウィンドウで使いたいだけ」で書いたSlimDXのソースコードをSharpDXへ変更してみました。

 

私の開発環境はXPなので、DirectX9でアプリケーションを作りました。「SharpDX.dll」と「SharpDX.Direct3D9.dll」さえ参照追加すれば動きます。

 

SlimDXとSharpDXは仕様が殆ど一緒なので移植にはさほど時間は掛かりません。ただ、SharpDXにはRectangleクラスやColorクラスが用意されているので前のコードだとSystem.Drawingのクラスと競合するのでそこだけは修正しました。

 

あとメインループを指定するメソッドが「SlimDX.Windows.MessagePump.Run」から「SharpDX.Windows.RenderLoop.Run」に名前が変わるくらいです。引数は全く同じです。

 

で、実行結果。

注意すべき点はColor4クラスでしょうか?

 

SlimDX.Color4クラスのコンストラ クタはColor4(float alpha, float red, float green, float blue)の順番ですが、SharpDX.COlor4クラスだとColor4(float red, float green, float blue, float alpha)の順番になります。ライブラリを入れ替えるだけでコンパイルが通ってしまうので、Color4クラスを使っている場合はちゃんと修正しておき ましょう。

ソースファイル
DirectXSample_source.rar
圧縮ファイル アーカイブ 6.5 KB
バイナリファイル
SharpDXライブラリ同梱。

必要な環境
.NET Framework4 Client Profile
DirectXSample_binary.rar
圧縮ファイル アーカイブ 610.2 KB

ところが、本格的に実装を試みようとしたら・・・

使ってみたところ、幾つか不便な点を発見しました。

 

①Xファイル読み込みが出来ない

どこを探してもD3DXLoadMeshFromX、及びD3DXLoadMeshHierarchyFromXに相当する関数が見当たりません。おそらくXファイル書き込みも出来ません。

 

色々調べてみたところSharpDX.Direct3D9.D3D9クラス内で公開静的関数として定義されているらしいのですが、肝心のSharpDX.Direct3D9.D3D9クラスが非公開クラスの為、外部からの使用が出来ません。

 

他のモデルフォーマットと同じように自前で読み込めということでしょうか?DirectX10以降だとXファイルがサポートされてないのでまだ納得できますが、せっかくサポートされているDirectX9を使ってるのにこれはあんまりです・・・

 

②メッシュの作成が出来ない

DrawSubset、CloneMeshFVF等の関数はあるのですが、D3DXCreateMesh、D3DXCreateMeshFVFに相当する関数が見当たりません。ID3DXMESHインターフェースに相当するクラスは存在するのですが、コンストラクタはIntPtr型のネイティブポインタを渡すだけになっています。

解決方法

どちらの問題も、ラッパークラスを自作すれば解決します。C++/CLIでも、 DllImportでもどちらでも出来るでしょう。

 

しかしSlimDXだとLoadMeshFromXもCreateMeshもサポートされてるので、自作ライブラリを用意するくらいなら大人しくSlimDXを使い続けた方が良いでしょう。

 

ただ、私もこのライブラリを殆ど使ったことが無いので、間違っている可能性もあります。もしも私が見落としているだけで、どちらの関数も利用できるのであれば、遠慮なくご指摘していただけると助かります。

ということでXファイルを使わない、DirectXのMesh・Frameクラスを使わないのであれば問題なく利用できそうです。

 

私はXファイルを使いたいので、残念ながら結局今までどおりSlimDXを使い続けることにしました。SharpDXは今後DirectX10・11でアプリケーション開発をすることになった時に改めて使ってみようと思います。当分はSlimDXになりそうです。

 

実際にやってみた→SharpDXでXファイル読み込み

コメントをお書きください

コメント: 5
  • #1

    春条 (木曜日, 22 11月 2012 17:18)

    はじめまして。
    こちらのページをよく参考にプログラムをさせていただいています。


    SharpDXについて、ウンチクになってしまいますが、ひとつコメントさせて頂きます。

    元々SharpDXの起りはDX10,11系のみでした。
    コミュニティにて頻繁に要望が上がったため、DX9にも”ついで”に対応したという感じで、DX9についての機能はあまり手厚くないようです。


    私も同様にモデルの問題に遭遇しましたが、個人的に実績のあったXNA標準のモデルローダーからデータをコンバートする形で対応していました。

    GTAViewerやMMD関連では、そういった”逃げ”が効かないので、あまり参考にはならないかと思いますが…

    手としてはSlimDXで読み込んだデータをSharpDXで使う、または、ロード部分だけSlimDXを静的リンクしてしまうといった方法は如何でしょうか?

    ただ、これをやるとライセンス表示が不恰好になりますけど、工数は稼げるのではないかと思います。

    ご参考になりましたら幸いです。

  • #2

    ze10 (金曜日, 23 11月 2012 01:34)

    >>春条様 アドバイスありがとうございます。

    >>元々SharpDXの起りはDX10,11系のみでした。
    なるほど、SharpDXにはそういう経緯があったんですか・・・全然知らなかったです。

    SlimDXとの合わせ技は考えたんですけど、dllが余分に増えてしまうのが嫌だったので、結局Dllimportでの実装に落ち着きました。それでも実装できない機能はいくつかありますけどね・・・

    >>こちらのページをよく参考にプログラムをさせていただいています。
    こんな書き散らしたサイトを参考にしていただきありがとうございます。私も春条様のサイトは度々拝見しており、参考にさせていただいてます。

    実は今回SharpDXへの移植を思い立ったキッカケは、春条様のブログの記事「SlimDXの問題点とSharpDX」からだったり・・・

  • #3

    春条 (金曜日, 23 11月 2012 13:16)

    返信いただきありがとうございます。

    >SlimDXとの合わせ技は考えたんですけど、
    >dllが余分に増えてしまうのが嫌だったので、
    >結局Dllimportでの実装に落ち着きました。
    なるほど、そういうことでしたか。
    ILMergeって手もありますが、管理やら手間の問題もありますよね・・・

    >実は今回SharpDXへの移植を思い立ったキッカケは、
    >春条様のブログの記事「SlimDXの問題点とSharpDX」からだったり・・・

    あの分かり難いブログを参考にされたのですかぁ。
    これは、もっとちゃんとした記事を書くようにしないといけませんね(笑


    私はいまze10さんのOpenTK、AL周りの記事をよく参考させてもらってます。
    なぜか逆行しちゃってますねw


    もののついでで申し訳ありませんが、じつはSharpDXには、速度以外にも大きな利点があるのですよ。

    SharpDXはMonoに対応しているため、Monoに付属しているmkbundleという機能を利用して、.Netレス化が出来るのです。(もちろんOpenTKも同様です)

    Win32標準のGUIの出力結果に割りと癖があって、業務アプリには向きませんでしたが、Win32のGUIの表示がないゲームの配布の際には強力なアドバンテージなります。


    当時はマニアックすぎてニーズがないかなぁと思い、内容についてはツイッターのつぶやきにとどめて、
    ブログの記事にしませんでした。

    しかしながら、こうやって見回すと
    いつもまにやらSharpDXを使われる方がちらほらいらっしゃるので、
    近々、手持ちのソフトをSharpDX2.xに対応するついでで
    記事を起こそうかと思っていますので、もしよろしければご参考ください。

  • #4

    ze10 (土曜日, 24 11月 2012 01:27)

    >>春条様

    確かに.Netレス化出来るのは大きな利点ですね。Mono自体は以前に一度Linux環境の方でやってそれっきりなんですけど、いい機会なのでまた触れてみようかと思います。

    >>記事を起こそうかと思っていますので、もしよろしければご参考ください。
    次の記事も楽しみに待ってます。今後も参考にさせていただきます

  • #5

    春条 (木曜日, 29 11月 2012 11:27)

    ネイティブ化の記事を起こしましたので、もしよろしければご覧ください。

    気合入れすぎて、かなり長い記事になってしまいました(^^;