QOpenGLWidget覆盖投影矩阵
QOpenGLWidget overriding projection matrix
我正在使用 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,它的表现符合预期。
However, somewhere this is getting overridden. When I print the projection matrix in the paintGL() function, it shows it as identity.
你很惊讶为什么? Qt5 可能使用 OpenGL 来绘制它的东西。这意味着 Qt 必须根据需要设置 OpenGL 上下文的状态。
你所观察到的就是意料之中的,所以不要感到惊讶。
I am using Qt 5.4 and setting up the projection matrix and viewport as follows in my resizeGL function override:
你不应该那样做。与每个基于状态的系统一样,必须在需要时将状态正确设置为所需的状态——或者跟踪所有状态更改,这要困难得多。
做正确的事,将您在 resizeGL
中所做的一切转移到它所属的位置:paintGL
。 resizeGL
的唯一目的是更新 FBO 渲染缓冲区等资源并反映新大小。但是不要用它来设置绘图相关的 OpenGL 状态。
我正在使用 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,它的表现符合预期。
However, somewhere this is getting overridden. When I print the projection matrix in the paintGL() function, it shows it as identity.
你很惊讶为什么? Qt5 可能使用 OpenGL 来绘制它的东西。这意味着 Qt 必须根据需要设置 OpenGL 上下文的状态。
你所观察到的就是意料之中的,所以不要感到惊讶。
I am using Qt 5.4 and setting up the projection matrix and viewport as follows in my resizeGL function override:
你不应该那样做。与每个基于状态的系统一样,必须在需要时将状态正确设置为所需的状态——或者跟踪所有状态更改,这要困难得多。
做正确的事,将您在 resizeGL
中所做的一切转移到它所属的位置:paintGL
。 resizeGL
的唯一目的是更新 FBO 渲染缓冲区等资源并反映新大小。但是不要用它来设置绘图相关的 OpenGL 状态。