glReadPixels似乎在Qt的错误坐标处读取

时间:2014-11-05 10:26:25

标签: qt opengl glreadpixels

我正在尝试使用OpenGL 4.0和Qt 5.3开发应用程序,我想实现颜色选择以在QGLWidget中选择不同的模型。 所以基本上,当我检测到鼠标点击时,我:

  1. 获取鼠标位置
  2. 渲染场景
    1. 设置白色背景(glClearColor然后glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    2. 我绑定了着色器程序
    3. 我绘制模型(每个模型都有不同的颜色和自己的变换矩阵)
    4. 发布我的着色器程序
  3. 致电glFlushglFinish,确保在致电glReadPixels之前完成了渲染
  4. 致电glReadPixels(mouse.x, window_height - mouse.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data) 数据是长度为4的GLubyte数组
  5. 我的程序运行良好"但是当我想要选择一个对象时,我必须比模型真正的位置更加向上和向右点击。我试图交换缓冲区以检查模型是否在正确的位置呈现,是的,它们是...... 我还尝试在glPixelStorei(GL_PACK_ALIGNMENT, x)之前使用x = 1,2,4,8来调用glReadPixels,但它似乎并没有影响它。

2 个答案:

答案 0 :(得分:0)

感谢您对Michael IV和jozxyqk的评论。 最后,我最终绘制了一个QOpenGLFramebufferObject,并使用QImage读取像素颜色。像这样:

QImage image = fbo->toImage(); //fbo is the QOpenGLFramebufferObject
QRgb rgb = image.pixel(mouse.x(), mouse.y());

有关详细信息,请参阅:http://dangelog.wordpress.com/2013/02/10/using-fbos-instead-of-pbuffers-in-qt-5-2/

快乐的编码!

答案 1 :(得分:0)

有点晚了……晚了 6 年,但我在使用 QOpenGLWidget 时遇到了同样的问题。我发现 glReadPixels 覆盖了整个窗口(或者可能只是“中央小部件”),而不是 OpenGL 小部件。如果创建新的 FBO 不是一个选项,您可以使用窗口偏移量来获得正确的结果:

void MyOpenGLWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if (!parentWidget()) //This widget needs to belong to a window or another widget
        return;

    QPointF wpos = event->windowPos();

    GLfloat color[4];
    //Note: If a menu or status bar is present the height of the bar(s) needs
    //      to be included in the y calc because the parentWidget is the "centralwidget",
    //      not the window.
    glReadPixels(wpos.x(), parentWidget()->height() - wpos.y(), 1, 1, GL_RGBA, GL_FLOAT, color); 

    QString msg = QString("%1 %2 %3 %4").arg(color[0]).arg(color[1]).arg(color[2]).arg(color[3]);
    qDebug() << "Clicked on pixel " << event->x() << ", " << event->y() << ", color " << msg;
}

不幸的是,我找不到支持这一事实的文档,但现在返回的颜色与预期一致(不再有偏移)。