我正在尝试从我的几何着色器中对整数纹理进行采样,该着色器正在运行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调用及其适用的数据。