日別アーカイブ: 2007年7月26日

Direct3D 10 HLSL(fx) の書き方とサイズ

HLSL で記述した Effect(fx) ファイルには複数の technique を記述して
おくことができます。
またそれぞれの technique は複数の pass を含めることができるので、
1つの Effect ファイルにはたくさんのシェーダーが入っている可能性があります。

その記述方法としては、例えばこんな感じになります。

———————————————————————
technique10 Main
{
  pass P0
  {
    SetVertexShader( CompileShader( vs_4_0, VS_Main() ) );
    SetGeometryShader( CompileShader( gs_4_0, GS_Main() ) );
    SetPixelShader( CompileShader( ps_4_0, PS_Main() ) );
  }
}

technique10 Animation
{
  pass P0
  {
    SetVertexShader( CompileShader( vs_4_0, VS_Animation() ) );
    SetGeometryShader( CompileShader( gs_4_0, GS_Main() ) );
    SetPixelShader( CompileShader( ps_4_0, PS_Main() ) );
  }
}
———————————————————————

ここで technique Main と Animation の違いは VertexShader だけです。
Direct3D10 の fx_4_0 では、GeometryShader と PixelShader を
あらかじめコンパイルしておいて下記のように記述することができます。

———————————————————————
GeometryShader gs_main= CompileShader( gs_4_0, GS_Main() );
PixelShader ps_main= CompileShader( ps_4_0, PS_Main() );

technique10 Main
{
  pass P0
  {
    SetVertexShader( CompileShader( vs_4_0, VS_Main() ) );
    SetGeometryShader( gs_main );
    SetPixelShader( ps_main );
  }
}

technique10 Animation
{
  pass P0
  {
    SetVertexShader( CompileShader( vs_4_0, VS_Animation() ) );
    SetGeometryShader( gs_main );
    SetPixelShader( ps_main );
  }
}
———————————————————————

この両者やってることは変わらないのに、下の方がコンパイルした後のバイナリ
サイズでちょうど重複するシェーダーの分だけ小さくなります。
おそらくコンパイル時間も短縮されているのでしょう。
technique 間のシェーダー流用は多いし、コードもだんだん複雑に長くなって
きているので、この辺しっかり注意して書いた方がよさそうですね。