glReadPixels GL_DEPTH_COMPONENT не работает в mousePressEvent - PullRequest
0 голосов
/ 26 июня 2018

Я использую 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,

, что может быть следующим: GL_INVALID_OPERATION is generated if format is GL_DEPTH_COMPONENT and there is no depth buffer. ссылка из документ

Но я до сих пор не знаю, что делать

1 Ответ

0 голосов
/ 28 июня 2018

Операции OpenGL должны выполняться только при активном контексте OpenGL.Это верно в методе paintGL (), потому что это, вероятно, установлено фреймворком для вас.Вы не можете предполагать, что OpenGL активен в других методах, как в других методах, отвечающих на события, и в обратных вызовах, таких как mousePressEvent (), потому что эти методы также могут запускаться другим потоком, где контекст OpenGL не активен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...