Я использую 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.
ссылка из документ
Но я до сих пор не знаю, что делать