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

Posted

技术标签:

【中文标题】基于鼠标单击读取帧缓冲区对象中的像素【英文标题】:Read pixel in frame buffer object based on mouse click 【发布时间】:2013-05-30 14:03:57 【问题描述】:

我正在使用帧缓冲区对象进行屏幕外渲染。这就是我初始化 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 中的相应像素位置?

【问题讨论】:

【参考方案1】:

glReadPixelsreads from the framebuffer currently bound to GL_READ_FRAMEBUFFER。所以如果你想从中读取,你应该在读取之前将它绑定到那个目标。

或者,您可以绑定到GL_FRAMEBUFFER,它同时绑定到GL_DRAW_FRAMEBUFFERGL_READ_FRAMEBUFFERs。

【讨论】:

【参考方案2】:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

尝试使用普通的 'ole GL_FRAMEBUFFER 而不是 GL_DRAW_FRAMEBUFFER

【讨论】:

我希望我能接受两个答案,因为这是您的答案和 Nicol 的答案的结合,帮助我解决了这个问题。我决定只是抛硬币。尼科尔赢了。谢谢你的回答。 没问题,就这样吧。祝你好运!

以上是关于基于鼠标单击读取帧缓冲区对象中的像素的主要内容,如果未能解决你的问题,请参考以下文章

读取 WebGLTexture 中的像素(将 WebGL 渲染到纹理)

如何从 Linux 帧缓冲区获取 RGB 像素值?

OpenGL/OpenGLES 中的帧缓冲纹理行为

WebGL - 当我从帧缓冲区读取像素数据时,图标失去透明度

如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?

从帧缓冲区对象读取时,OpenGL 纹理坐标是相反的