13

GLSLでマルチテクスチャリングを行う場合、各テクスチャが異なるサイズであるサンプラーのインデックス可能な配列を使用する方法はありますか?この構文は無効です:

uniform sampler2D texArray[5];

今のところ、唯一のオプションはサンプラーを個別に作成することのようです。

uniform sampler2D tex1;
uniform sampler2D tex2;
uniform sampler2D tex3;
uniform sampler2D tex4;
uniform sampler2D tex5;

しかし、それから私はそれらを繰り返すことができません、それはお尻の本当の痛みです。解決策はありますか?

4

2 に答える 2

25

この構文は無効です:

誰が言ったのですか?サンプラーの配列は最も確実に有効です(バージョンによって異なります)。それらをどのように使用するかは別の問題です。

GLSL 1.20以下では、サンプラーアレイは許可されていません。

GLSL 1.30〜3.30では、サンプラー配列を使用できますが、インデックスに厳しい制限があります。インデックスは整数定数式である必要があります。したがって、サンプラー配列を宣言することはできますが、ループすることはできません。

GLSL 4.00以降では、インデックスを「動的に均一な積分式」にすることができます。この用語は基本的に、(同じ描画呼び出し内の)シェーダーのすべてのインスタンス化が同じ値を取得する必要があることを意味します。

したがって、GLSL 4.00+で一定の範囲をループし、ループカウンターを使用してサンプラー配列にインデックスを付けることができます。一様変数からインデックスを取得することもできます。できないことは、インデックスをシェーダーステージへの入力に依存させるか(レンダリングコマンドによって発生するすべてのインスタンスで値が同じでない場合)、またはテクスチャアクセスから派生した値から取得することです(その値がレンダリングコマンドによって引き起こされたすべてのインスタンスで同じ)、または何か。

サンプラーの配列に配置されたテクスチャーの唯一の要件は、それらがサンプラータイプと一致することです。したがって、配列GL_TEXTURE_2Dのすべての要素でを使用する必要があります。sampler2Dそれ以外にも、テクスチャにはサイズなど、さまざまな違いがあります。配列はコーディングを容易にするために存在します。そこにあるもののセマンティクスは変更されません。

また、サンプラー配列内の個々の要素は、それぞれ独自のテクスチャ画像ユニットにバインドする必要があることを忘れないでください。

于 2012-08-20T03:00:12.380 に答える
2

とにかく、各テクスチャが異なるサイズであるサンプラーのインデックス可能な配列を持つことはありますか?

まだ。たぶん、これは将来のOpenGLバージョンに追加されるかもしれませんが、私はそれを疑っています。

しかし、それから私はそれらを繰り返すことができません、それはお尻の本当の痛みです。解決策はありますか?

回避策として、配列テクスチャを使用し、各レイヤーのサブ領域のみを使用できます。vec4配列を使用して、各レイヤーの各画像の境界を保存します。

于 2012-08-20T00:16:50.780 に答える