2016-05-14 9 views
0

複数の異なるopengles2.0シェーダがあり、それぞれ異なるユニフォームを使用しています。 glGetUniformLocationを使用して、各ユニフォームのデータを書き込む位置を取得します。しかし、これは、シェーダプログラムを切り替えると、たとえば、あるシーンに、場合によっては別のシェーダに定義されている制服に応じて、カメラのマトリックスを書き込むことがあることを意味します。つまり、アップロードする値が変更されたかどうかを確認することで、冗長シェーダ一様アップロードを簡単に減らすことはできません。別のシェーダによって書き込まれた値を上書きする必要があります。すべてのプログラムで同じ値を返すglGetUniformLocation

各シェーダプログラムに同じユニフォームを含めることができますが、使用するかどうかにかかわらず、glGetUniformLocationはプログラムごとに同じ位置を返しますか?例えば、シェイダーコンパイラが参照されていない制服を取り除き、残りの部分を束ねることで、シェーダごとに異なる場所にユニフォームを持つことができます。これは、IOSとAndroid向けです。

おかげ

ショーン

答えて

1

ユニフォームごとのプログラム状態なので、あなたが冗長均一な変化を避けたいならば、あなたは制服を追跡する必要があるため、それらの位置が異なるプログラムで異なるかどうかは関係ありません。 DirectX9の場合と同じように、グローバルベースではなくプログラムごとに実行する必要があります。

はい、OpenGLは、使用していないユニフォームを削除したり、コンパイル単位ごとに同じユニフォームを持っていても再配置することがあります。

+0

あるプログラムがglGetUnifiormLocationから何かの場所「10」を返し、そこに浮動小数点値「99」を書き込んだ場合、別の場所に「10」という場所を返した別のプログラムに切り替えて書き込みますその場所に "88"、2番目のプログラムを使用している間、 "99"は私が元に戻っても元のプログラムに設定されますか?すなわち、それらは固有の場所であるか、または共有されているか? – user3162134

+0

はい、元のプログラムに戻っても99はそのまま残ります。 – Columbo

関連する問題