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でも表示できるという利点が有ったのですが、諦めましょう。