5

glBindTexture()不要な呼び出しを避けるために、現在バインドされているテクスチャを追跡するバッチ処理システムを作成しています。テクスチャが 2 回使用された場合、それを必要とする 2 番目のサンプラーの別の TIU にバインドされるように、特定のバッチで既に使用されているテクスチャを追跡する必要があるかどうかはわかりません。

OpenGL アプリケーションで、同じシェーダー ステージ内の複数のサンプラーに同じテクスチャ イメージ ユニットを使用することは許容されますか? 異なるシェーダー ステージのサンプラーはどうですか? 例えば:

フラグメント シェーダー:

...
uniform sampler2D samp1;
uniform sampler2D samp2;

void main() { ... }

メインプログラム:

...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...

これが機能しない理由はわかりませんが、シェーダー プログラムに次のような頂点シェーダーも含まれている場合はどうでしょうか。

頂点シェーダー:

...
uniform sampler2D samp1;

void main() { ... }

この場合、OpenGL は の両方のインスタンスをsamp1同じ場所を参照するものとして扱うことになっています。そのため、頂点シェーダーとフラグメント シェーダーで同じテクスチャ ユニットが使用されています。2 つの異なるシェーダー ステージで同じテクスチャを使用することは二重に不利になると読みましたGL_MAX_COMBINED_TEXTURE_IMAGE_UNITSが、これは矛盾しているように思われます。

私のハードウェア (HD 6870) での簡単なテストでは、次のすべてのシナリオが期待どおりに機能しました。

  • 同じシェーダー ステージで 2 つのサンプラー ユニフォームに 1 つの TIU を使用
  • 2 つのシェーダー ステージで使用される 1 つのサンプラー ユニフォームに 1 つの TIU が使用されます
  • 1 つの TIU が 2 つのサンプラー ユニフォームに使用され、それぞれが異なるステージで発生します。

ただし、これがすべてのハードウェア/ドライバーで予想される動作なのか、それともパフォーマンスへの影響があるのか​​はわかりません。

4

1 に答える 1