5

GeForce 330m で実行されているジオメトリ シェーダーから整数テクスチャをサンプリングしようとしています。テクスチャにロードする以外の値を返すようです。テクスチャの作成と読み込みに (基本的に) このコードを使用します。

glGenTextures( 1, &textureId );
glBindTexture( GL_TEXTURE_2D, textureId );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture( GL_TEXTURE_2D, 0);
glBindTexture( GL_TEXTURE_2D, textureId );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>);
glBindTexture( GL_TEXTURE_2D, 0);
glBindTexture( GL_TEXTURE_2D, textureId );
    int data[] = { 3, 0, 36, 400 };
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data);
glBindTexture( GL_TEXTURE_2D, 0);

アイデアは、特定の 1 つのピクセルが 400 の w 値を持つように設定されているということです。次に、これをジオメトリ シェーダーで使用します。

#version 330
#extension GL_EXT_gpu_shader4 : require
uniform isampler2D models;

void main()
{
   ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0);
//   ivec4 modelstats4 = ivec4(3, 0, 36, 400);
   if (modelstats4.w > height) {
      // emit something
   }
}

コメントアウトされた、等しいはずの固定値を使用すると、何かが放出されます (IE、1 ポイント)。実際のテクセル フェッチを使用すると、何も返されません。私が知っている影響を与える可能性のある値はすべてハードコーディングされているため、これが機能しない理由がわかりません。これは完全なコードではありません (OO のセットアップ、かなりの量を調べる必要があります) が、これらは該当するデータを含む関連する OpenGL 呼び出しです。

4

1 に答える 1

4

glGetErrorsを自由に振りかけることで解決策を見つけました。エラーは、このコード例のすべての glTexImage にありました。明らかに、整数テクスチャの場合、GL_RGBA ではなく GL_RGBA_INTEGER を使用してはなりません。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data);

これで動作します。テクスチャのフェッチもOKです。

于 2012-06-09T10:48:44.997 に答える