まず技術を準備しましょう。
@Collada モデルを C# で読み込む方法を確認する。
ASharpDX でインデックスリストを用いて描画する方法を確認する。
ここまで問題なく理解できる方は、きっと次のトピックを読んで楽しめることでしょう。
前回は透視投影行列を使わない描画だったので、直接頂点位置をスクリーン座標として描画しました。
メニューのような画面に張り付いて表示されるものについてはこれで良いのですが、3Dの描画をしてこそ…ですよね。
ということで元々のエフェクトファイル(.fx シェーダ記述ファイル)を次に示します。
透視投影行列(ワールドビュープロジェクション行列)を変数として追加し、頂点シェーダを修正します。
修正したエフェクトファイルを次に示します。(修正箇所をハイライト)
シーンのソースコードも編集しました。(変更箇所をハイライト)
スライダーコントロールでオーバーレイの値を変更できるようにもしています。
この辺はプロパティを用意して、スライダーの値変更イベントで値を変更しているだけなので
説明は不要でしょう。(わからない人はコチラ)
実行結果を次に示します。
エフェクトファイルの編集、エフェクト変数の設定、透視投影行列を使った3DのCubeの描画を示しました。
3Dオブジェクトの描画に関する基礎はこれくらいで十分でしょう。
あとは Collada ファイルから頂点リスト、インデックスリストが取得出来れば…
すでにパーサーを介して値の取得まで、できていますので、思うままソースコードをいじるだけです。
その前に、テクスチャマッピングとサンプラーの設定方法について先に示します。
DirectX 10 はコード側からサンプラーの設定ができない模様、DirectX 11 はできます。
しかし、なぜ WPFHost は DirectX 10 で作られているのだろうか?
ソースコードの修正箇所を次に示します。
修正箇所をハイライトしています。(というか全部ですね)
エフェクトごとにマテリアルカラー、ライト方向を設定し
頂点には位置、法線、テクスチャ座標を格納します。
あとはライティングの基本的な計算式を頂点シェーダ、ピクセルシェーダに書いています。
(シェーダについてわからない方はコチラ。普通の人は法線マップくらいまでなら理解できるはず…)
シーンのコードにも修正を入れます。
修正箇所にハイライトを入れています。
ひとまずこんな風に実装すれば、テクスチャ付きモデルのライティング結果が得られます。
実行結果を次に示します。
DirectX 10 を使うとコードからサンプラーを設定する手段がないことを確認しました。
APIリファレンスにも無いことを確認しています。
しかし DirectX 11 のAPIリファレンスにはあります。
ちょっと悔しかったし、DirectX 11 も WPF で利用できるのか試してみたかったので手を付けてみました。
一つ上のトピックで示した WPFHost プロジェクトを DirectX 11 対応にしてみました。
興味ある方はコードを参考にしてください。
ハイライトした部分を試してみたかっただけです。
結果、コードからサンプラーを設定できることを確認できました。
一つ、コードを編集してコンパイルを通しただけで安心してはいけません。
次に示すDLLファイルをプロジェクトにリンクとして追加する必要があります。
SharpDX\Bin\Standard-net20\sharpdx_direct3d11_effects_x64.dll
SharpDX\Bin\Standard-net20\sharpdx_direct3d11_effects_x86.dll
出力ディレクトリに新しい場合はコピーするようプロパティから設定するのも忘れずに。
実行結果を次に示します。
前回と絵が一緒だったのでマテリアルカラーだけ青に変更しています。
ちょっと準備に手間取ってしまいましたが、ここから本題の COLLADA ファイルモデルの描画トピックです。
まず、読み込むデータを用意します。
いきなり躓いてしまったので、手順を次の Tips にメモとして残しました。
はい、ではこのモデルを読み込んで描画してみましょう。
…うん、簡単だけど作業量が多いなぁ
途中でViewerに Collada から頂点バッファを作成するコードを書くことが
良くないことに気づいたので、CUIコンバータを作成しました。
ひとまず頂点バッファブロックだけをファイル出力する機能だけ確認して
これを読み込んで表示する機構を用意しました。
結果を次に示します。
WPF + SharpDX + Collada 読み込み、描画が確認できました。
ちょっと前に作った、出目モンキーモデルも読み込んでみましょう。
結果を次に示します。
描画して確認できたこととして、やはり座標系の問題があります。
Blender は Z-up の右手座標系です。DirectX の Y-up 左手座標系で表示するには
Z と Y を交換して、頂点のワインディングを逆回しにする必要があります。
コンバーターに座標変換を指定できるオプションを追加して対処するようにしたいと思います。
コンバーターの作成、モデルの読み込みに関しては詳細は示しません。
(Collada のフォーマットを理解して、C#の配列操作、ファイル操作を勉強するだけですので)
次回
もう少しコンバータからちゃんとしたファイルを出力するようにして
どんなファイルでも描画できるようにしたいと思います。
ひとまず今回はこんなところで失礼します。
ではまた。
2012/06/23 初記。