2012年7月26日木曜日

MME もとい HLSL と CgFX の違い

久しぶりの記事です。MMDAI2 の Cg (CgFX)を使った MME 互換実装を行う過程でシェーダの書き換えを行った関係で HLSL と CgFX の微妙な違いが少し見えてきたのでそのためのメモ。この記事は都度更新されるかもしれません。

[11/23 更新]

前提情報

  • Cg は 3.1 を使用
  • プロファイルは glslv/glslf を使用。arbvp/arbfp は使わない

1. shared キーワードはつかえない

キーワードとしては存在するが、利用できない。

2. [unroll] キーワードはつかえない

for 構文を展開するためのキーワード。HLSL 特有で CgFX では利用不可。マクロで分岐するしかなさそう。

3. tex2Dlod が glslf プロファイルでつかえない

cgc で glslf プロファイルでコンパイルすると texture2DLod として出力するものの、利用は出来ない。そもそも OpenGL では GLSL 1.2 以前では頂点シェーダでしか使えない。公式のドキュメント では fp40 から。

4. (cond ? A : (cond2 ? B : C)) がつかえない

HLSL では通るようだが CgFX ではコンパイルエラーになる。(cond ? A : B) の形式でしかサポートされず、複雑な条件分岐が出来ない。バグ?

5. StateBlock 構文が利用できない

毎回冗長になりがちな state 設定を省略化してくれる stateblock 構文は HLSL 特有のようで、Cg では利用出来ない。

6.  BlendFunc を使う

SrcBlend/DstBlend だと何故か定数でエラーが出てしまう。代わりに BlendFunc を使う。

MME 互換付き MMDAI2 の Bleeding Edge としてのリリースは今週末になるかと思います。ただ、シェーダは書き換えが必須で↑にあるように微妙に違うので自分が開発作業と同時にシェーダの移植作業をしています。

CgFX をデバッグするには?

MacOSX では Xcode の拡張として提供されている Graphics Tools for Xcode に含まれる OpenGL Profiler を使う。

Linux では gDEBugger を使うのだが、少なくとも MMDAI2 の専用レンダリングテストプログラムでは Qt レイヤーでクラッシュしてしまうのでまだ試すことが出来ていない。