QOpenGLWidget覆盖投影矩阵

时间:2015-05-14 10:51:04

标签: qt opengl qt5

我正在使用Qt 5.4并在我的resizeGL函数覆盖中设置投影矩阵和视口,如下所示:

glViewport(_off_x, _off_y, _width, _height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _width, 0, _height, -1, 1);

我可以验证这一点,当我按如下方式打印出投影矩阵时,它会显示正确的值:

GLdouble projection[16];
glGetDoublev(GL_PROJECTION_MATRIX, projection );
// printing this shows the correct projection matrix.

然而,某个地方被覆盖了。当我在paintGL()函数中打印投影矩阵时,它将其显示为标识。

有趣的是,我切换到旧的QGLWidget,它按预期执行。

1 个答案:

答案 0 :(得分:4)

  

然而,某个地方被覆盖了。当我在paintGL()函数中打印投影矩阵时,它将其显示为标识。

你真的很惊讶为什么? Qt5可能会使用OpenGL来绘制它的东西。这意味着Qt必须根据需要设置OpenGL上下文的状态。

您观察到的是预期的结果,所以不要感到惊讶。

  

我正在使用Qt 5.4并在我的resizeGL函数覆盖中设置投影矩阵和视口,如下所示:

你不应该这样做。与每个基于状态的系统一样,必要时根据需要将状态设置为正确状态 - 或跟踪所有状态变化,这更加困难。

做正确的事情并将您在resizeGL中所做的一切移动到它所属的位置:paintGLresizeGL的唯一目的是更新FBO渲染缓冲区等资源并反映新的大小。但是不要用它来设置与绘图相关的OpenGL状态。