MMEのマネをする
MMEを日々楽しく使用させて頂いてます。
MMEでは、HLSLのセマンティックス、アノテーションを使用することで、アプリケーション側とエフェクトファイル側で対話的に変数の値設定をしたり、描画タイミングを制御し、エフェクトを実装しています。
この対話的な方法を使用することで、アプリケーション側からエフェクト処理を分離することが可能になります。
MMEを使用していて、この仕組みは便利だと思いましたので、自分のプログラムでも実装してみました。
(MMEを使う前までは、HLSLのセマンティックス、アノテーションの意味がよくわからなかったけど、対話的なエフェクト処理実装のために必要だったんですね。)
実装してみると、HLSLのセマンティックス、アノテーションのスクリプト解析プログラムを書くのは大変でしたが、今までアプリケーション側でガリガリ書いていた、特定のエフェクト処理のための汎用的ではないコードが消えスッキリしました。また、MMEで使用されているエフェクトが自分のプログラムで使えるのはおもしろいです。
今後、hlslを業務で使うことはないかもしれませんが、役に立つといいなあ。
「ビームマンさんのMirrorWaterエフェクトを使わせていただきました」
実装する場合のポイントメモ:
(1)
・MME付属のREFERENCE.txtは丁寧に仕様が決められているので、REFERENCE通りに作れば作れる。
(2)
・「_INDEX」セマンティックスは、以下のことである。
D3DVERTEXELEMENT9の
Usage = D3DDECLUSAGE_PSIZE
UsageIndex = 15
・エフェクトファイルを読む時にD3DXCreateEffectFromFile関数のpDefines引数を使用して、「_INDEX」を「PSIZE15」に置き換えれば良い。以下を引数に設定する。
//MMEで使用されるエフェクトで使われているマクロを定義する。
D3DXMACRO d3dxMacros[2] =
{ //マクロ マクロ名
{"_INDEX","PSIZE15" },// <-- ここで定義する部分を設定して
{ 0, 0 }// <-- ここで終端を示すようにヌルターミネートしておく
};
(3)
・MMEで使用されているDirectX SDKのversionは、DirectX SDK February 2007。
・MMEのエフェクトファイル読み込み時には、D3DXCreateEffectFromFile関数のD3DXSHADERコンパイル オプション引数に、「0」をしている。
・最近のDirectX SDKを使用する場合は、「D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY」か「D3DXSHADER_USE_LEGACY_D3DX9_31_DLL」を指定すればよい。
※(2)(3)は、某掲示板で教えてもらいました。有難うございます。
参考:
http://msdn.microsoft.com/ja-jp/library/cc324434.aspx
※セマンティックス、アノテーション解析sample。
『VPVP wiki - 拡張表示系ツール』
http://www6.atwiki.jp/vpvpwiki/pages/219.html#MME
※MMEの場所。
『ビームマンのエフェクト置き場』
http://www43.atwiki.jp/beamman/
※エフェクト使わせてもらいました。有難うございます。
『CompileEffect - すらりん日記』
http://watery.dip.jp/~slash/0130
http://watery.dip.jp/slash/archives/134
※D3DXMACROについて参考にしました。有難うございます。