読者です 読者をやめる 読者になる 読者になる

An Effect File Filled With Default Values

DirectX

DirectX Graphicsの3Dデバイスは大量のレンダーステートという状態変数を持っていますが,あまりにも数が多いため,ときとしてデフォルト値を勘違いして思わぬ混乱に陥ってしまうことがあります*1.また最近は少なくなりましたが,たまにドライバがデフォルト値を間違えていることがあって,特定のドライバでのみ動作が異なるという現象に悩まされることもあります*2.そういう時のための個人的メモとしてデフォルト値を全て記述したエフェクトファイルを作成しているのですが,今回DirectX SDK Update (Summer 2004)への対応を含むいくつかの更新を行いました.
その過程で気付いたのですが,エフェクトファイルのリファレンスは実際には使用可能ないくつかのレンダーステートが抜けています.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/effectfilereference/effectfileformat/states.asp?frame=true
ざっと調べてみたところ,以下のステートの記述が実際に可能であることを確認しました.

  • PatchEdgeStyle
  • DebugMonitorToken
  • PositionDegree
  • NormalDegree
  • ScissorTestEnable
  • AntialiasedLineEnable
  • MinTessellationLevel
  • MaxTessellationLevel
  • AdaptiveTess_X
  • AdaptiveTess_Y
  • AdaptiveTess_Z
  • AdaptiveTess_W
  • EnableadAptiveTessellation
  • TwoSidedStencilMode
  • CCW_StencilFail
  • CCW_StencilZFail
  • CCW_StencilPass
  • CCW_StencilFunc
  • ColorWriteEnable1
  • ColorWriteEnable2
  • ColorWriteEnable3
  • BlendFactor
  • SRGBWriteEnable
  • SeparateAlphaBlendEnable
  • SrcBlendAlpha
  • DestBlendAlpha
  • BlendOpAlpha
  • ElementIndex (sampler state)
  • DMapOffset (sampler state)

これらを加えてほぼ全てのレンダーステートを書き出した実物が以下です.
http://www.dwahan.net/nyaruru/programming/#default_state
コメントや空行込みでだいたい400行ぐらいのファイルですが,DirectX Graphicsの状態変数は「視覚的におおよそこれぐらい」という感覚が得られることを特に気に入っています*3.なお,ここからの発展ですが,順にこんな感じに考えています.

  1. Effect StatesのXML化.データの受け渡し用にXML Schema,ブラウザによる閲覧用にXSLを作成.
  2. デバッグ用のステートダンプライブラリの作成.
  3. エフェクトファイルブラウザの作成.

まあ時間の都合でどれ1つとして完成はしないでしょうが,XML Schemaぐらい公開されていてもいいよなぁという思いがずっとあるのも本当です.XML Schemaでなくても同等の表現能力を持った定義言語でEffect Statesの文法が公開されていれば,そこからXML Schemaを作ってInfoPathとの連携を行うことができるなど,考えるだけで面白そうなんですけどねぇ.

*1:レンダーステートのデフォルト値を列挙した公式な文書としては,ヘルプのSaving Vertex States With a StateBlockSaving Pixel State With a StateBlockがよくまとまっています.

*2:ちなみにDirectX SDK Update (Summer 2004)での変更点として,D3D_DEBUG_INFOマクロ付きでコンパイルするとデバイス作成時にレンダーステートのデフォルト値の異常をデバッグメッセージに表示してくれるようになりました

*3:レンダーステートそのものの意味を知りたい場合はヘルプをどうぞ.分かりやすさでは今給黎さんの解説がおすすめです.