シェーダエフェクト 自作FXファイルフォーマット

前回、使用するシェーダ関数名やステートをソースコードに直接記述していたので、これらの情報を専用のファイルで定義するようにします。DirectX11はfxファイル(techniqueやpassの定義)に対応していないようなので、DirectX9のfxファイルを参考に独自のfxファイルを作成します。

左:きれいな半透明 中:アニメ調 右:汚い半透明
左:きれいな半透明 中:アニメ調 右:汚い半透明

自作FXファイルフォーマット

DirectX11でのFXファイル

DirectX11では、今まであったtechniqueやpassの定義に対応していないようです。DirectXTKにもありません。11になってからいろんな機能が削除されてしまっています。「必要なものは自分で作れ」という方針になったような気がします。
なので、techniqueやpassの対応を自作することにしました。

zgfx(勝手に命名)自作FXファイルフォーマット

フォーマットはDirectX9のfxファイルを参考に作成します。対応する定義は、シェーダ関数、techniqueとpass、pass内のステート設定。ステート設定は、D3D11_RASTERIZER_DESC、D3D11_BLEND_DESC、D3D11_DEPTH_STENCIL_DESCの各メンバの値を設定可能にする。ステート値は、enum宣言の一部(例 D3D11_CULL_FRONTのFRONT)を記述。

簡単な構造なので、特に説明はなくていいと思います。
#ifdef ZGSX ~ #endifは、そのままだとシェーダコンパイル時にエラーになるので#ifdefマクロで無効化しておきます。zgfx定義の範囲判定にも使用しています。

サンプルプログラム

ダウンロード
zgfx自作FXファイルで描画

zgfxの解析 再びboost spirit qi

以前、もう使わないかもと言っていましたがパーサを書くのが面倒なのでboost spiritを使用してzgfxファイルの解析を行いました。今回手間取ったのは、コメント処理と#ifdefの解析。プリプロセッサは使えないので、空白文字を空白+改行+コメントとして処理。簡単にできそうだった「指定文字列までスキップ」も少し悩みました。

class ShaderEffect;

zgfxファイルに対応したクラス。DirectX11リソース(シェーダ、シェーダコードバイナリ、ステート)を作成、保持します。このクラスと3Dモデルの形状データと組み合わせて描画処理を実行します(組み合わせ用のクラスがShaderPass)。

ShaderPassのソート

zgfxファイルから作成したShaderEffectクラスと3Dモデルデータを組み合わせたクラスがShaderPass。ShaderPassクラスは、独立(単独で描画処理、処理順序に非依存)した処理なのでソートが可能です。サンプルプログラムでは、モデル番号とパス番号でソートすることで、きれいな半透明処理を実現しています(パス0:Z値だけを先に更新、パス1:Z値が一致するピクセルだけ描画)。ソートしない場合、マテリアル単位でパス0、パス1と交互に実行されて中途半端に透けた状態になります。

サンプルプログラムダウンロード
zgfx自作FXファイルで描画

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.