我正在使用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,它按预期执行。
答案 0 :(得分:4)
然而,某个地方被覆盖了。当我在paintGL()函数中打印投影矩阵时,它将其显示为标识。
你真的很惊讶为什么? Qt5可能会使用OpenGL来绘制它的东西。这意味着Qt必须根据需要设置OpenGL上下文的状态。
您观察到的是预期的结果,所以不要感到惊讶。
我正在使用Qt 5.4并在我的resizeGL函数覆盖中设置投影矩阵和视口,如下所示:
你不应该这样做。与每个基于状态的系统一样,必要时根据需要将状态设置为正确状态 - 或跟踪所有状态变化,这更加困难。
做正确的事情并将您在resizeGL
中所做的一切移动到它所属的位置:paintGL
。 resizeGL
的唯一目的是更新FBO渲染缓冲区等资源并反映新的大小。但是不要用它来设置与绘图相关的OpenGL状态。