Hatena::Groupprogram

桜、抹茶、白、日記(支店)

2010-12-10

[] WPF with Direct3D10 #adcjcs はてなブックマーク -  WPF with Direct3D10 #adcjcs - 桜、抹茶、白、日記(支店)

自分はC++プログラマなのですが、何故か?C# Advent Calendar jp: 2010(#adcjcs)に参加しましたので、ちょっとC#に関する話題を書いてみる事にしました。とはいってもDirectXネタなのであまりC#関係ないかも知れませんが・・・。

前日は@さんで、明日は@さんです。

gihyo.jp > 本日12月1日より,プログラマ有志による技術系Advent Calendarが各所ではじまる

http://gihyo.jp/news/info/2010/12/0102

http://cielquis.net/advent-calendar/

http://cielquis.net/advent-calendar/cs-jp-2010.html

何で今更Direct3D10(DirectX 10)なのか?というのは、たまたま今やっている作業のターゲットがNVIDIADirectX 10までにしか対応していないVGAカードだからですw

HPとかDellとかのPC構成でも普通にDirectX 10対応品が最上位だったりするものもあったりします。


まず、WPFDirectXによる描画を行う場合、以下のような選択肢があります。

  1. WPFD3DImageクラスを利用する
  2. Windows Vista以降のDirect3D9Exデバイスを使う
    • Direct3D10/Direct3D11で描画する場合はプログラム上ではDirect3D9ExとDirect3D10/Direct3D11の2つのデバイスを持った状態となる。またこの方法で実装した場合、DXGIの利用は出来ずSwapChainも利用できない。
  3. 自分でウィンドウ(コントロールの描画領域)を作成し、Direct3Dデバイスと紐づける

という事でWPFにおいて、Direct3D10で描画する為には何をしなくてはいけないか。マイクロソフトの川西さんのブログに分かり易い図が掲載されているのでそちらをご覧下さい。

川西 裕幸のブログ > WPF + Direct2D のサンプル(サーフェイスの共有)

http://blogs.msdn.com/b/hiroyuk/archive/2010/05/06/10008314.aspx

WPFでDirect3D10による描画を行う為には、別途Direct3D9デバイスも用意して共有サーフェイスを経由して描画する必要があるようです。先に書いたように自分でウィンドウを作った場合でもDirect3D10による描画は可能です。


ここで話題をちょっと変えて、.NET FrameworkDirectXを利用するにはどうすれば良いのでしょうか。

  1. Windows API Code Pack for Microsoft .NET Framework
    • DirectX 10~11に対応
    • DirectX用のランタイムは別途ビルドする必要があります。DirectX SDKVC++が必要です。またこのランタイムはCode Packの本体には依存していません。
    • DirectX 10の全てのクラスが実装されている訳では無い(Spriteは実装されていない)
    • WPF+Direct3D10のサンプルは、自分でウィンドウ作成+Diret3D10で行うもの
  2. SlimDX
    • DirectX 9~11に対応
    • MIT License
    • WPF+Direct3D10のサンプルは、Direct3D9Ex+Diret3D10で共有サーフェイスを利用するもの
  3. 自分でC++/CLIを使ってラッパーを書く
  4. etc.

今回は、ベーシックに?SlimDXのサンプルプログラム「WpfSample10」を改良してマンデルブロー描画する処理を追加してみました。

  • 変更点
    1. .NET Framework 4ベース
    2. Scene.csシェーダーの処理はとりあえずいらないのでごっそり削除
    3. Scene.csにShaderResourceViewとそれに対応するTexture2Dクラスを追加
    4. ShaderResourceViewを表示する為のSpriteを追加

f:id:youandi:20101210000130p:image

VS2010のプロジェクトはこちら。


やってみて気になった点

  1. Direct3D10デバイスを使って実装すると制限が多すぎて実装出来ない
    • API的にはDirect3D10.1のものを利用する必要がある → Windows Vista SP1以降必須?
    • 色々なビューを作成する必要があり、何がどうなっているかよく分からない

今更ですが、DirectX9からDirectX10ってかなり変更があるなと。またDirectX11でも結構違いがあるようなので、色々と勉強しないといけないなぁと思った次第です。

MESH GURU with Direct3D10/11 (Direct3D10 Direct3D11でメッシュを極めろ!)

MESH GURU with Direct3D10/11 (Direct3D10 Direct3D11でメッシュを極めろ!)

この本が良さそうなのでとりあえず入手しました。