14

glBindImageTexture と glBindTexture の違いは何ですか? また、シェーダーでの次の宣言の違いは何ですか:

layout (binding = 0, rgba32f) uniform image2D img_input;

uniform sampler2D img_input;
4

1 に答える 1

19
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.

イメージ アクセスでは、すべてのサンプリング パラメータが無視されます。画像アクセス関数は、常に整数のテクセル座標を使用します。

サンプラーはテクスチャからのみデータを読み取ることができます。イメージ変数は、データの読み取りおよび/または書き込み、およびそれらに対するアトミック操作を実行できます。もちろん、シェーダーからデータを書き込むには特別な注意が必要です。特に誰かがそのデータを読み取る場合は注意が必要です。

于 2016-05-10T13:53:56.627 に答える