Opengl几何着色器整数纹理提取失败

das*_*ndy 5 opengl integer texture-mapping geometry-shader opengl-3

我正在尝试从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);
Run Code Online (Sandbox Code Playgroud)

想法是将特定的一个像素设置为具有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
   }
}
Run Code Online (Sandbox Code Playgroud)

使用应该相等的注释掉的固定值会导致发出一些东西(IE,一个点).如果我使用实际的texel提取它不返回任何东西.我所知道的所有可能产生影响的值现在都是硬编码的,所以我不知道为什么这不起作用.这不是完整的代码(OO设置,需要仔细查看),但这些是与适用数据相关的OpenGL调用.

das*_*ndy 4

通过大量使用 glGetErrors 找到了解决方案。该错误出现在该代码示例中的每个 glTexImage 中 - 显然,对于整数纹理,您不能使用 GL_RGBA,而应使用 GL_RGBA_INTEGER。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data);
Run Code Online (Sandbox Code Playgroud)

现在这有效了。纹理获取也还可以。