プログラマブルシェーダーをいじってみる

今日は、プログラマブルシェーダーをいじっていました。
固定パイプラインも使いこなしているわけではないのですが、まぁ、いいでしょう。

「ゲームエフェクトマニアックス」という本に載っていた基本のシェーディング(多分、ランバート)を動かしてみることにしました。固定時とは違って、DeviceではなくEffectなるクラスに変数(主に行列)を設定したりとかで色々と面倒です。というか、そもそもEffectクラスを作るのに苦労したり。

どうやら、プログラムの実行時に「*.fx」ファイルをコンパイルして読み込ませるみたいで、fxファイルが見つからないと動かない。(調べてみると、HLSL用のコンパイラがあって、それをうまく利用すればプログラム内にデータを埋め込めそう)

で、Effectの生成が終わって、必要な行列も設定したのですが、今度は表示されない。。。どうやら、Meshを描画する際にエラーが出ているよう。困った。

2時間くらい格闘して、何とか表示されました。原因は、Direct3D.Deviceの生成時に「CreateFlags.HardwareVertexProcessing」でハードウェア頂点処理にしないと駄目みたい。(当たり前なのか。)


こんな感じで描画されました。(5時間かかった)

ちなみに、ソフトウェア頂点処理をする際には「ShaderFlags.ForcePixelShaderSoftwareNoOptimizations | ShaderFlags.ForceVertexShaderSoftwareNoOptimizations」でEffectを生成するとうまく表示されました。ハードウェアが使えないときはこれで何とか対応。

一応表示が出来たので、色々な設定をしていこうと思います。マルチターゲットレンダリングもしたいし。