glReadPixels GL_DEPTH_COMPONENT在mousePressEvent

时间:2018-06-26 02:19:29

标签: qt opengl

我正在使用QT QOpenGLWidget ,我想将鼠标点击位置取消投影回3D,所以我使用了 glReadPixels 。 (我还阅读了Pangolin的源代码,这是一个很好的旋转,平移,缩放示例,它也使用glReadPixels)

这是我的简单代码的一部分:

void myGLWidget::initializeGL()
{
    glClearColor(0.2, 0.2, 0.2, 1.0);                    //background color
    glClearDepthf(1.0);                                  //set depth test
    glEnable(GL_DEPTH_TEST);                             //enable depth test
}

void myGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear color and depth buffer

    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(cameraView_.data());         // cameraView_  is a QMatrix4x4
    drawingTeapot();

    // reading pixels in paintGL works well!!! returns lots of 1s
    GLfloat zs[10 * 10];
    glReadPixels(0, 0, 10, 10, GL_DEPTH_COMPONENT, GL_FLOAT, &zs);
}

void myGLWidget::mousePressEvent(QMouseEvent *event)
{
    // glReadBuffer(GL_FRONT);      // also tried this, nothing works
    GLfloat zs[10 * 10];
    glReadPixels(0, 0, 10, 10, GL_DEPTH_COMPONENT, GL_FLOAT, &zs);
    GLenum e = glGetError();        // this gives 1282 err code!!!
}

我使用的是macOS Sierra,Pangolin在我的笔记本电脑上可以正常工作,但是我的qt项目确实可以正常工作吗?!!

通过说不起作用,我的意思是输出变量 zs 仍然是随机值,例如0和123123e-315,并且在glReadPixels之前和之后都不会改变。

为什么glReadPixels仅在PaintGL函数中起作用?

我还尝试了python版本它给了我一个错误提示

File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218)
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glReadPixels,

可能是这样的: documentGL_INVALID_OPERATION is generated if format is GL_DEPTH_COMPONENT and there is no depth buffer.参考

但是我仍然不知道该怎么办

1 个答案:

答案 0 :(得分:0)

仅当OpenGL上下文处于活动状态时才应执行OpenGL操作。在paintGL()方法中确实如此,因为这可能是由框架为您设置的。您不能假定OpenGL在其他方法中处于活动状态,例如在其他事件响应方法和mousePressEvent()回调中,因为这些方法也可以由不在OpenGL上下文中处于活动状态的另一个线程运行。