Top > ComputerGraphics > HLSL > Common > SwitchInHLSL
Last-modified: Sat, 28 Jun 2014 18:44:51 JST
Counter:1985 Today:1 Yesterday:0 Online:8
このエントリーをはてなブックマークに追加

シェーダモデル3.x 以前の HLSL で switch 文を使うときの注意

実質的に switch は使えない?

HLSL は C 言語のような構文です。したがって、switch 構文が使えるのですが、シェーダモデル(バージョン)によっては大して使い物になりません。

switch 構文は、ある値を参照し、その値に応じた処理を実装するための構文です。一般には if/else を連続して繋げるよりは、switch 構文を使います。ところが HLSL では、switch が参照する値は、処理の実行前にあらかじめ定められていなければなりません。

例えば、変数 i が、0-6の何れかの値を取るとき、switch(i) とすると次のようなエラーが発生します。

error X3548: in ps_3_0 uints can only be used with known-positive values, use int if possible

ここでは PixelShader のバージョン 3.0 を例にしていますが、バーテックスシェーダでも、バージョン 2.0 でも同様の問題が発生します。

この問題を解決するためには、if/else を用いて実装するほかありません。どのタイミングで値が確定していればよいのかは定かではありません。確認していませんが、恐らく、シェーダの実行時に CPU 側から値を渡すなどの使い方であれば問題は発生しません。したがって、実装形態によってはswitch が有効である場合もあるかもしれませんが、シェーダ内で処理を切り替えるような場合には、諦めて if/else を使いましょう。

なおこの問題はシェーダモデル4.xでは発生しません。 本当に必要で環境を考慮しないならシェーダモデル(バージョン)を挙げてしまうのも手です。