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

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);

这个想法是将特定的一个像素设置为w值为400。然后我在几何着色器中使用它:

#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
   }
}

使用被注释掉的固定值,这些值应该相等,结果会发出某些东西(即一个点)。如果使用实际的texel fetch,它将不返回任何内容。我已经硬编码了我所知道可能会产生影响的所有值,因此我不知道为什么这不起作用。这不是完整的代码(OO设置,需要查看很多),但这些是相关的OpenGL调用及其适用的数据。


你应该回答你的问题或者将其删除,因为它只会占据未回答问题列表中的位置 :) - kravemir
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);

现在这个功能已经可用了。纹理获取也正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接