整数数据上的 OpenGL 纹理函数总是 return 0

OpenGL texture function always return 0 on integer data

我正在处理延迟着色管道,我将一些信息存储到纹理中,这是附加到我的 gbuffer 的纹理

// objectID, drawID, primitiveID
glGenTextures(1, &_gPixelIDsTex);
glBindTexture(GL_TEXTURE_2D, _gPixelIDsTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, _width, _height, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

这就是我将 ID 写入其中的方式:

// some other gbuffer textures...
layout (location = 4) out uvec3 gPixelIDs;

gPixelIDs = uvec3(objectID, drawID, gl_PrimitiveID + 1);

几何通过后,我可以使用以下代码从中读取:

struct PixelIDs {
    GLuint ObjectID, DrawID, PrimitiveID;
}pixel;

glBindFramebuffer(GL_READ_FRAMEBUFFER, _gBufferFBO);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glReadPixels(x, y, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &pixel);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

到目前为止,还不错。输出是我需要的。

但是当我尝试使用此着色器在屏幕上显示对象 ID(仅用于调试目的)

uniform sampler2D gPixelIDsTex;

uint objID = uint(texture(gPixelIDsTex, fragData.TexCoords).r);
FragColor = vec4(objID, objID, objID, 1);

结果为 0(我使用 Snipaste 读取像素颜色),这意味着我不能在我的后续过程中使用数据。

其他浮点数据格式的gbuffer纹理(例如vec4)都可以,所以我不知道为什么texture总是return 0就可以了

uniform sampler2D gPixelIDsTex;

您的纹理不是浮点纹理。它是一个无符号整数纹理。所以你的采样器声明需要表达这一点。正如您写入 uvec3,您也必须从 usampler2D.

读取