glBindImageTexture と glBindTexture の違いは何ですか? また、シェーダーでの次の宣言の違いは何ですか:
layout (binding = 0, rgba32f) uniform image2D img_input;
と
uniform sampler2D img_input;
glBindImageTexture と glBindTexture の違いは何ですか? また、シェーダーでの次の宣言の違いは何ですか:
layout (binding = 0, rgba32f) uniform image2D img_input;
と
uniform sampler2D img_input;
layout(binding = 0) uniform sampler2D img_input;
これは、テクスチャ オブジェクトからデータを取得するsamplerを宣言します。0 のバインディング (GLSL 4.20 のシェーダーで設定できます) は、( 経由で) テクスチャ イメージ ユニット 0 にバインドされた 2D テクスチャglActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);
が、このサンプラーに使用されるテクスチャであることを示します。
サンプラーは、すべてのミップマップ レベルと配列レイヤーを含むテクスチャ全体を使用します。ほとんどのテクスチャ サンプリング関数は、正規化されたテクスチャ座標を使用します ([0, 1] はテクスチャのサイズにマップされます)。ほとんどのテクスチャ サンプリング関数は、フィルタリング プロパティやその他のサンプリング パラメータも考慮します。
layout (binding = 0, rgba32f) uniform image2D img_input;
これは、テクスチャからの単一の画像を表す画像を宣言します。テクスチャは、ミップマップ レベル、配列レイヤーなど、複数の画像を持つことができます。 を使用する場合、テクスチャから単一の画像をバインドしています。glBindImageTexture
画像とサンプラーは完全に分離されています。それらには独自のバインド インデックスのセットがあります。GL_TEXTURE0
テクスチャを にバインドし、別のテクスチャからの画像を画像バインディング 0にバインドすることは完全に有効です。関連するサンプラーにテクスチャ関数を使用すると、 にバインドされているものからGL_TEXTURE0
読み取られますが、関連する画像変数の画像関数は、 にバインドされている画像から読み取られます。画像バインディング 0.
イメージ アクセスでは、すべてのサンプリング パラメータが無視されます。画像アクセス関数は、常に整数のテクセル座標を使用します。
サンプラーはテクスチャからのみデータを読み取ることができます。イメージ変数は、データの読み取りおよび/または書き込み、およびそれらに対するアトミック操作を実行できます。もちろん、シェーダーからデータを書き込むには特別な注意が必要です。特に誰かがそのデータを読み取る場合は注意が必要です。