1

プログラム内のテクスチャ ユニットの数をハード コーディングする多くのサンプルを見てきました。例えば:

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, object1BaseImage);
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, object1NormalMap);
glActiveTexture(GL_TEXTURE0 + 4);
glBindTexture(GL_TEXTURE_2D, shadowMap);

問題は、シーンをレンダリングするときに同じテクスチャ ユニットを使用することによって、同時に使用される 2 つのテクスチャが互いに競合する可能性があることです。私の質問は、クラスまたは関数を実装して、OpenGL でテクスチャ ユニットを自動的に割り当てる方法です。使用できるサンプラー オブジェクトの数を定義するさまざまな定数があるためです。

GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS,
GL_MAX_TEXTURE_IMAGE_UNITS and
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

定数に混乱しています。次のような定数があるべきではありませんGL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITSか? 割り当てるときにテクスチャユニットの最大数を取得する必要があると思います。したがって、2 つの質問があります。

  1. 上記の 6 つの定数を理解する方法、なぜ という名前の定数がないのかGL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITS
  2. クラスまたは関数を記述する方法は、定数を使用してテクスチャ ユニットを自動的に割り当てます。

何か案は?コードスニペットをいただければ幸いです。

4

1 に答える 1

2

クラスまたは関数を記述する方法は、定数を使用してテクスチャ ユニットを自動的に割り当てます。

これは簡単です。しないでください。

テクスチャ イメージ ユニットの「割り当て」は、通常、使用するプログラムによって定められた規則によって行われます。ユニット 0 がディフューズ テクスチャの移動先であると判断します。特定のメッシュとシェーダーにディフューズ テクスチャがない場合は、ユニット 0 に何かを配置しません。ユニット 12 は、シャドウ マップが移動する場所になる可能性があります。

これが、shading_language_420packでテクスチャ ユニットをシェーダー内で直接設定できる理由です。それがなくても、通常はシェーダーをコンパイルした後にサンプラーのテクスチャ ユニットを設定し、移動しないでください。

必要がないときにプログラムの状態を変更しても意味がありません。

3.3 以降のハードウェアでは、48 以上のテクスチャ ユニットを利用できます。あなたが不足する可能性はありません。

使用できるサンプラー オブジェクトの数を定義するさまざまな定数があるためです。

いいえ、使用できる「サンプラー オブジェクト」の数を定義する定数が1 つGL_MAX_COMBINED_TEXTURE_IMAGE_UNITSあります。これは、OpenGL が提供するテクスチャ イメージ ユニットの総数に対するハード リミットです。とglActiveTextureの間の数を取ります。GL_TEXTURE0GL_TEXTURE0+GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS

個々のものは、 1 つのシェーダー ステージでアクティブにできる GLSL サンプラー タイプの最大数です。フラグメント シェーダーにどちらを使用するかというと、GL_MAX_TEXTURE_IMAGE_UNITS. これは従来の理由によるもので、最初はフラグメント シェーダーのみがテクスチャにアクセスできたからです。

于 2012-10-14T16:25:08.907 に答える