DirectX SDK April 2007, New HLSL Compiler and XNA

DirectX SDK April 2007』,ダウンロードセンターには出てますね.
最近 HLSL (and Effect) コンパイラのアップデートが激しいので,Direct3D 9 の利用者であっても一応チェックしておいた方が良いように思います.
状況を軽く整理しておくと,こんな感じ.


  • Shader Model 4.0 / D3D10 用に新しいエフェクトコンパイラが作成されていたが,そのうち Shader Model 2.0/3.0 にも応用できる部分が Direct3D 9 向けにバックポートされた.もちろん D3D9 環境で D3D10 命令が動くという意味ではなくて,単に Shader Model 2.0/3.0 のコンパイラが賢くなっただけ.
  • 新しいコンパイラVista リリース後の最初の SDK Update である December 2006 SDK で正式にリリースされた.以下これを Dec 2006 バージョンと呼ぶ.
    • Dec 2006 バージョンは Shader Model 1.x をサポートしない.
    • D3DX (d3dx9_32.dll) や fxc.exe は,デフォルトで Dec 2006 バージョンのコンパイラを使用する.
    • D3DXSHADER_USE_LEGACY_D3DX9_31_DLL フラグまたは fxc.exe への /LD フラグによって旧バージョンのコンパイラも使用できる.Shader Model 1.1 に依存した既存のプロジェクトを, December 2006 SDK 以降の環境でコンパイルするときには,ソースコードや fxc.exe 使用箇所の修正が必要になることに注意.
    • d3dx9_32.dll は Windows 9x 系をサポートしない.
  • DirectX SDK April 2007 では, さらにエフェクトコンパイラバグフィックスが行われた.言うならば Apr 2007 バージョン.
    • d3dx9_33.dll および fxc.exe は,デフォルトで Apr 2007 バージョンのコンパイラを使用する.



Dec 2006 バージョンや Apr 2007 バージョンですが,D3D10 が IEEE 754 を要求することもあってか,浮動小数点数の計算モデルについて以前より厳密になっているという印象を受けます*1
例えば『Unevaluated sums in Cg』で紹介されているような float による倍精度演算を最近実装してみたのですが,XNA GSE 1.0 のコンテントパイプラインで使用される HLSL コンパイラと,DirectX SDK February 2007 に付属する fxc.exe でいくつかコンパイルオプションを弄ったものの計算結果を比べると,値がずいぶん異なって結構びっくりするという経験をしました.
XNA GSE の 4 月のアップデートでは,XNA GSE からエフェクトコンパイラの設定を変更したり,Apr 2007 バージョンを使用するかどうかを選べたりすると個人的にはありがたいですね.


DirectX SDK は 2 ヶ月ごとの更新を追いかけていくのが結構大変ですが,ありがたいことに最近は日本語のリリースノートのバックナンバーが読めるようになっています*2.川西さんに感謝.

*1:参考: id:NyaRuRu:20050424

*2:以前は SDK が更新されるたびにリリースノートの翻訳も更新されてしまい,後で読み直したくなってもそのときには古い翻訳が Web から消えているという罠がありました.