基于鼠标单击读取帧缓冲区对象中的像素

时间:2013-05-30 14:03:57

标签: opengl 3d glut

我正在使用帧缓冲对象来进行屏幕外渲染。这就是我正在初始化FBO的方式:

glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glGenRenderbuffers(1, &color_rb);
glBindRenderbuffer(GL_RENDERBUFFER, color_rb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, windowWidth, windowHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_rb);

glGenRenderbuffers(1, &depth_rb);
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, windowWidth, windowHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

在我的过剩鼠标功能中,我正在尝试阅读使用在主窗口中单击的位置,以映射并读取我的FBO中的相应像素位置。但是,我似乎从主窗口获取像素数据而不是我的屏幕外渲染FBO。这是我的过剩鼠标功能:

GLubyte像素;

    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glReadPixels(x, windowHeight - y - 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);

    cout << "Pixel clicked: " << (int) pixel << endl;

有谁知道如何在主窗口中使用点击位置来读取我的FBO中相应的像素位置?

2 个答案:

答案 0 :(得分:2)

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

尝试常规'ole GL_FRAMEBUFFER而不是GL_DRAW_FRAMEBUFFER

答案 1 :(得分:2)

glReadPixels reads from the framebuffer currently bound to GL_READ_FRAMEBUFFER。因此,如果您想从中读取,则应在阅读之前将其绑定到该目标。

或者,您可以绑定到GL_FRAMEBUFFERGL_DRAW_FRAMEBUFFER绑定GL_READ_FRAMEBUFFER和{{1}}。