8

シェーダーでテクスチャ バッファーから vec4 値を読み取る作業コードがあります。

クライアント側では、変位ベクトルのバッファーを作成します。

vec4 vector1 : vec4(x1, y1, z1, w1);
vec4 vector2 : vec4(x2, y2, z2, w2);
vec4 vector3 : vec4(x3, y3, z3, w3);
..

次に、vector1、vector2、vector3... を含む頂点バッファーを作成します。

次に、テクスチャを作成し、上記のバッファを次のようにバインドします。

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID);

x1、y1、z1、w1 などはそれぞれ float であるため、GL_RGBA32F を選択しました。

シェーダーでは、次を使用して個々のベクトルをフェッチできます。

vec4 vector1 = texelFetch(samplerObj, 0);
vec4 vector2 = texelFetch(samplerObj, 1);
.
.

しかし、ここで、私の変位ベクトルが vec4 ではなく、単一の整数であるとします。すなわち

int vector1 = x1; //(int is 32 bit unsigned)
int vector2 = x2; //(int is 32 bit unsigned)

対応する internalFormat がどうなるか教えてください。それは...ですか

glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID);

また、シェーダーで texelFetch を使用して値をフェッチするにはどうすればよいですか? それは...ですか

int vector1 = texelFetch(samplerObj, 0);

また

int vector1 = texelFetch(samplerObj, 0).r ?

texelFetch は 4 つのコンポーネントを持つテクセルを返す必要があるため、混乱しています。結果の赤のコンポーネントを使用する必要がありますか?

4

1 に答える 1

9

unsigned ints: の正しいサイズの内部形式については既に言及しましたR32UI。許容される形式は、OpenGL 4.4 コア プロファイル仕様のセクション 8.9にある表 8.15に列挙されています。上記の内部フォーマットでバッファ テクスチャを使用する場合、バッファ ストアの内容は正規化されないことに注意してください。つまり、ルックアップを実行すると、範囲 [0, 1] ではなく、範囲 [0, 2^(n-1)] の値が取得されます。texelFetch

の代わりにsamplerBufferも必要usamplerBufferです。

の内部形式でを実行texelFetchすると、前述の表で指定されているように、返されるコンポーネントに次の値が含まれる uvec4 が返されます。samplerBufferR32UIuvec4(R, 0, 0, 1)

int vector1 = texelFetch(samplerObj, 0);

uvec4からへの暗黙的な変換がないため、これはコンパイル時エラーにつながりますint

int vector1 = texelFetch(samplerObj, 0).r;

このスウィズル マスクは、 によって返された uvec4 の R コンポーネントを返し、からへtexelFetchの暗黙的な変換を行います。意味的には、スカラー値にvectorという名前を付けることも意味がありません。;)uintint

あなたが実際に欲しいのは次のようなものです

uint displacement = texelFetch(samplerObj, 0).r;

はどこsamplerObjですかusamplerBuffer

編集: 明確にするために、texelFetch常に gvec4 を返します。ここで、gは単に空 (固定小数点および浮動小数点形式)、iまたはuになります。ベクトルがどのように塗りつぶされるかは、バッファ テクスチャの内部形式によって異なります。R32F を選択すると、正規化されていない vec4(R, 0, 0, 1) が得られます。RGBA16 では、正規化された vec4(R, G, B, A) が得られます。

これ以上の混乱を避けるために: 単一成分形式を使用する場合、4 成分ベクトルにメモリを割り当てません! それらはすべて、ルックアップ時に gvec4 にのみ展開されます!

于 2013-09-06T09:06:54.627 に答える