こんにちは、星姫です。
DirectX 10 のサンプルを触るといきなりエフェクトファイル(.fx)を使用します。
(何の説明もなしとは言いませんが…理解に苦しみますよね。)
そこで、今回はエフェクトファイルの一部分である頂点シェーダをちょこっと触って
理解の突破口を開こうと思います。
前回作った SimpleDX10 ライブラリを使って、エフェクトファイルの作業のみに焦点を当てます。
今回の結果動画
頂点シェーダをちょこっと触るのが今回のレッスンです。
ここから本題に入ります。
まずは、SimpleDX10 を利用する環境を整えないといけませんね。
アプリケーションの種類を 016話 で紹介したやり方で Windows アプリケーションにして、空のプロジェクトを作成してください。
@ヘッダーファイルに次の StdAfx.h ファイルを追加します。
StdAfx.h
Aソースファイルに次の StdAfx.cpp, EntryPoint.cpp を追加します。
StdAfx.cpp
EntryPoint.cpp
これだけではコンパイルは通りませんので、次の作業をします。
B SimpleDX10.zip をダウンロードし
プロジェクトがあるフォルダの下に展開します。
Cプロジェクトのプロパティで「C++」→「追加のインクルードディレクトリ」に次の要領で
展開したフォルダの include フォルダへのパスを設定します。
$(ProjectDir)\ExtLibs\SimpleDX10\include、StdAfx.h があるフォルダへのパスの設定も忘れずに!
D同じくプロジェクトのプロパティで「リンカ」→「追加のライブラリディレクトリ」に次の要領で
展開したフォルダの lib フォルダへのパスを設定します。
$(ProjectDir)\ExtLibs\SimpleDX10\lib
E「C++」→「コード生成」にて設定している形式(ディフォルトでは「マルチスレッド デバッグ DLL (/MDd)」)
に合うライブラリを「リンカ」→「入力」→「追加の依存ファイル」の項目に指定してください。
ディフォルトなら「SimpleDX10_md_debug.lib」ですね。
F「C++」→「プリコンパイル済みヘッダー」→「プリコンパイル済みヘッダーの作成/使用」の項目を
「プリコンパイル済みヘッダー ファイルを使用する (/Yu)」にします。
さらに、StdAfx.cpp ファイルのプロパティで「プリコンパイル済みヘッダーの作成/使用」の項目を
「プリコンパイル済みヘッダーを作成する (/Yc)」にします。
@〜Fまで設定を完了させて、初めてコンパイルが通ります。
(注意!DirectX SDK のサンプルを動かせる環境でないと、これまたコンパイルできません。詳細は 017話 でやりました。)
さて、実行してみると次のように、指定したウィンドウサイズ、指定したウィンドウタイトルでウィンドウが表示されると思います。
上記のプロジェクトを実行したときの様子。
ここまで用意できた後の話をします。
ちなみに、ここまでの作業は「外部ライブラリを使うときに必ず行う作業」です。
忘れたなら、ここにきて思い出していただけたら幸いです。
さて、何かを描画するにしても、モデルデータが無くてはテストのしようがありません。
SimpleDX10 で使えるモデルデータというものを用意してみましょう。
まずは Blender で適当にモデルを作成します。
今回は「Grid」を作成し、「Vキー」で使えるようになる、「頂点ペイント」機能を用いて Simple な文字を書いてみました。
(シーズン的にクリスマス色を使用)
Blender で作成したモデル(Blender の 3D ビューでの表示)
Grid とは、このように平面をグリッド状にしたモデルのことです。
文字の部分を気持ち程度盛り上げてみました(笑)
モデルができたら、028話 で作成しました SimplestarExporter.zip を使って中間モデルデータを出力します。
SimplestarExporter の UI 画面の様子。
「Export All」を押しましたが、選択されていれば「Export Sel」でも同じことです。
ボタンは図に示したように、ディフォルトの状態のままでOKです。
こちらが、出力された中間モデルデータファイル(.xml)です。
XML Notepad 2007 でファイルの内容を表示しています。
030話 で作成しました、中間モデルデータファイル(.xml)から描画に必要な情報のみを取り出してバイナリデータを出力するツール
SimpleConverter.zip を使ってバイナリデータファイル(.smpl)を出力します。
図に示すように、頂点座標と頂点カラーにチェックを入れて出力します。
こちら、.smpl バイナリファイルの内容を Stirling(スターリング) を使って、表示した様子です。
このファイルを読み込み、解析して、頂点バッファとインデックスバッファを作成するコードを 031話 で紹介しました。
同じ機能を備えた SMPL クラスを作成し、頂点バッファとインデックスバッファを作成できるようにしておきましょう。
ここで、エフェクトを使う場合における問題点に気付きました。
現在 SimpleConverter はオブジェクト一つにつき、一つの.smplファイルを出力します。
SimpleDX10 で .smplファイルを使おうとすると、次の問題が発生することが予想できます。
・マテリアルごとに頂点レイアウトが異なるはずが、.smplファイルでは、ファイルに対しフォーマットが一つ設定される。
(これでは、オブジェクトにマテリアルを一つしか設定できないのと同じ)
理由は簡単で、そもそも現在のモデルデータにマテリアル情報を載せていないからです。
(作られるのは、頂点バッファとインデックスバッファのみ)
つまり、SimpleDX10 で使いやすい新しいデータフォーマットを作成する必要がある、ということ。
今回は、エフェクトファイルの入門講座なので、今回用にコードを用意しますが、今回以降で使いまわすことは無いものとします。
(フォーマット変更に関係する話、Blender 2.55 のエクスポーターをいじり、マルチテクスチャデータが出力可能なことを確認。
こっちのエクスポーターが完成したら、これまで作ってきたものはプロトタイプとして、実際に活用されることなくお蔵入りするかも…)
で、Blender 2.55 用のエクスポーターが完成しました。(2010/12/05) これをダウンロードに置いておきます。
ということで、SimpleStarExporter(Blender 2.49b用)とSimpleConverter(SimpleStarExporterのxmlファイル変換器)はお蔵入り決定!
今回の使用が最後ですね、さようなら(笑)
.smplファイルパスをコンストラクタで渡すと、頂点バッファとインデックスバッファの情報を持ったデータクラスになる。
という、イメージで作成します。
こんな感じ↓
あとはメインのファイルをこう↓書けば、完成です。
このプロジェクトを実行すると、次の結果が得られます。
(モデルが回転しているだけの映像)
この段階になって、初めてエフェクトファイルについて勉強できるようになります。
やっと、です。やっぱり初心者にはハードル高いですよね…
とりあえず、今回使用したエフェクトファイルの内容を確認してみましょう。
Tutorial05.fx ファイル内の記述
今回はグリッドに波打ってもらいましょう。
ということで、Vertex Shader と書かれている所に注目!
ワールド変換行列とビュー変換行列で頂点位置を移動させている所があると思いますが、ここに次のコードを挿入します。
output.Pos.y = output.Pos.y + 0.06f * sin(World._11 * 3.14f + output.Pos.x * 8.0f) + 0.06f * sin(World._11 * 3.14f + output.Pos.z * 8.0f);
すると、冒頭で示した動画の結果が得られます。
ここで、参考にしたページがこちら。
今回のように、Posの中に.yプロパティがあるかどうかを確かめるために参照したページがこちら↓
成分ごとの演算 (DirectX HLSL)
正弦波とか、算術関数はここに一覧があります。
組み込み関数 (DirectX HLSL)
つまり、HLSLで困ったらここ↓に来れば何かしら情報が得られるはず…次回はもう少し凝ったシェーダプログラミングを勉強してみましょう。
HLSL リファレンス
2010/11/21 初記。
2010/11/23 追加。
2010/12/05 追加。