【问题标题】:OpenGL texture function always return 0 on integer dataOpenGL 纹理函数总是在整数数据上返回 0
【发布时间】:2022-01-07 18:17:40
【问题描述】:

我正在处理延迟着色管道,我将一些信息存储到纹理中,这是附加到我的 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总是返回0

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:
    uniform sampler2D gPixelIDsTex;
    

    您的纹理不是浮点纹理。这是一个无符号整数纹理。因此,您的采样器声明需要表达这一点。就像您写信给uvec3 一样,您也必须阅读usampler2D

    【讨论】:

    • 感谢一百万!我正在学习OpenGL,并且在这个问题上花了将近一整天的时间,所以我尝试注册这个网站,再次感谢你。 (我的母语不是英语,表达有问题请见谅)
    猜你喜欢
    • 2017-12-03
    • 2016-07-21
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多