我正在尝试使用OpenGL 4.0和Qt 5.3开发应用程序,我想实现颜色选择以在QGLWidget中选择不同的模型。 所以基本上,当我检测到鼠标点击时,我:
glClearColor
然后glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glFlush
和glFinish
,确保在致电glReadPixels
之前完成了渲染glReadPixels(mouse.x, window_height - mouse.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data)
数据是长度为4的GLubyte
数组我的程序运行良好"但是当我想要选择一个对象时,我必须比模型真正的位置更加向上和向右点击。我试图交换缓冲区以检查模型是否在正确的位置呈现,是的,它们是......
我还尝试在glPixelStorei(GL_PACK_ALIGNMENT, x)
之前使用x = 1,2,4,8来调用glReadPixels
,但它似乎并没有影响它。
答案 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;
}
不幸的是,我找不到支持这一事实的文档,但现在返回的颜色与预期一致(不再有偏移)。