glGetActiveUniformの挙動


AMD製グラフィックボード搭載環境時に glGetActiveUniform関数が正常動作しない模様。
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製グラフィックボード時でも、
シェーダー定数群においては辞書順にソートされて結果が列挙されました。

結果がソート済みになることは仕様に入っていなかったと思うので、
この部分について必要ならば自前ソートをかけておく、というのが
よいかなと思います。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする