Catalystドライバが悪いのかも知れないが。
uniform sampler*のデータが取得できない。
有効なUniform変数の個数は意図通りなのに、sampler用と思われる部分でLocationIdが -1 という値が返ってくる。
NVIDIA製グラフィック搭載環境の場合、この問題は発生せずuniform sampler*を使用しても、
正しくLocationIdの値を返してくれる。
また、変数名をソートしてその順序でLocationIdが割り当てられるようだ*1。
OpenGLの場合、シェーダー変数へのアクセスはLocationIdを介して行うので、
名前指定して値のセットということはDirectXのEffectと違い行わないのでこの最適化はしなくてもと思ったり。
それでもシェーダーコンパイル時にやってしまうという点は評価できるけど。
毎回名前からLocationIdとってきて値のセットというようなプログラムコードを書く場合にはこの部分は有効に効いてきそうだ。
逆に言えば、この最適化を期待したコードを作ってしまうと、他の環境やドライバでは速度に問題が発生するかも。
*1 : ドライバ 259.09にて確認.
■追記
AMD製グラフィックカード搭載のWindowsXP環境で試してみた。
すると、sampler*に関してもただしくLocationIdが取得でき、定数名はソート済みになっていた。
問題となっている環境は Windows7 64bit, Catalyst 10.7 の状況。ここに何か問題があるのかもしれない。
■追記2
Windows7 64bit環境の方でもコードを書き直ししていたら、
正常にsamplerの場合でも値がとれるようになった。
もしかしたら大本のソースがバグっていたのかもしれない。
■まとめ
単純に自分のミスだったのかもしれないなぁ…。
glGetActiveUniformに問題はなし、ということで。
また、AMD製グラフィックボード時でも、
シェーダー定数群においては辞書順にソートされて結果が列挙されました。
結果がソート済みになることは仕様に入っていなかったと思うので、
この部分について必要ならば自前ソートをかけておく、というのが
よいかなと思います。
コメント