FX Composer 2.5(HLSL)でShaderバイトコード(pso,vso)を吐かせる
Shaderアセンブラ吐けないと思ってたら吐けるじゃないですか。
なら初代よりもこっち使った方が良いですね。
http://developer.nvidia.com/object/fx_composer_home.html
適当に「Create-Effect-FX」で作って、CompileしてAnalize(Compile飛ばすと更新箇所が反映されないよ)すると、下のウインドウに結果が出ます。
ってこれが微妙に長いんですが。
その中に「ASM」があるのでそこで確認できます。
吐かせてみると
// Default values: // // vSize // c0 = { 256, 256, 0, 0 }; // // pAddH // c1 = { 0, 0.0078, 0, 0 }; ps_2_0 dcl t0.xy dcl t1.xy dcl t2.xy dcl t3.xy
ってな感じで、受け渡しようのconst定数の対応まできっちり出力されるので、非情に便利です。(前のバージョンでは手作業で対応を導く必要があったので)
初期状態では対象GPUが「GeFroce8400GS」ですが、SettingのShaderPerf項目より目的のGPUが選べるようです。
古いGPUも動作候補に入れたい場合は変えると良いかもしれません。
あとは、ココに吐かれたアセンブラ分を全部コピーして、テキストファイル(〜.psa/vsa)に貼り付けて、コンパイルという流れになります。
貼り付ける際に先頭4行分「# Technique: Main」を入れるとエラーになりますので。
で、後はDirectX SDK付属のコンパイラ「psa.exe/vsa.exe」にそれぞれ通して終わりです。
path [Drive]:\Microsoft DirectX SDK\Utilities\Bin\x86\ psa sample01.psa vsa sample01.vsa pause
こんな感じでバッチ(.bat)を入れとけば、内容変更の際に楽でしょうか。
これで、同フォルダにコンパイル済みの「pso/vso」が出来ます。
でも最近のSDKでは「psa,vsa」は抜かれちゃったみたいで「fxc」しか入っておりません。
Pixel/VertexShaderオンリーなFXファイルならこいつで吐けるのですが、残念ながらアセンブラからのコンパイルは出来ません。困ったものですね。
さて、出力したpso/vsoをプログラムに持ち込む際は、ShaderInterfaceClassを生成し読み込ませて、D3DDeviceにセットした後、受け渡し用のconst定数をSetPixelShaderConstantF,SetPixelShaderConstantFで設定します。
// vSize // c0 = { 256, 256, 0, 0 }; // pAddH // c1 = { 0, 0.0078, 0, 0 };
この部分ですね。
c0ならSetPixelShaderConstantF(0,〜)に対応します。
さて、NVIDIAさんでは「ShaderPerf.exe」という、Analize機能に相当するものも配布しており、それを使ってもアセンブラを出力できます。
それを使ってみると
frc r6.xy, r mul r6.zw, r6.wzyx, r6.wzy mul r7.xy, r6, r6.wzy mul r8, r6.z, c mul r9, r6.w, c
・・・ん?
あぁ・・・最後の1文字だけ何故か欠けてるんですな。ってダメじゃないですかーヤダー!
FX Composer 2.5で読み込めないFXでも表示できるという利点が有ったのですが、諦めましょう。