Qt QOpenGLWidget覆盖投影矩阵

Qt QOpenGLWidget覆盖投影矩阵,qt,opengl,qt5,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(G

我正在使用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,它的性能与预期一样

然而,在某个地方,这一点正在被忽略。当我在paintGL()函数中打印投影矩阵时,它将其显示为标识

你很惊讶为什么?Qt5可以使用OpenGL绘制其内容。这意味着Qt必须根据需要设置OpenGL上下文的状态

你所观察到的是你所期待的,所以不要感到惊讶

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

glViewport(_off_x, _off_y, _width, _height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _width, 0, _height, -1, 1);
你不应该那样做。与每一个基于状态的系统一样,在需要时将状态设置为正确状态是非常必要的,或者跟踪所有状态变化,这要困难得多

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

然而,在某个地方,这一点正在被忽略。当我在paintGL()函数中打印投影矩阵时,它将其显示为标识

你很惊讶为什么?Qt5可以使用OpenGL绘制其内容。这意味着Qt必须根据需要设置OpenGL上下文的状态

你所观察到的是你所期待的,所以不要感到惊讶

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

glViewport(_off_x, _off_y, _width, _height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _width, 0, _height, -1, 1);
你不应该那样做。与每一个基于状态的系统一样,在需要时将状态设置为正确状态是非常必要的,或者跟踪所有状态变化,这要困难得多


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

@Luca:视口和投影矩阵是OpenGL状态变量。这是非常好的,实际上反复更改其值是非常常见的–例如,每次您看到一个小地图、一些导航HUD或一些概览窗口时,这是通过中途更改视口和投影来完成的。OpenGL规范中没有告诉框架应该尊重它们。另外,整个
resizeGL
restrape
函数混乱是由GLUT启动的,而且从应用程序框架似乎已经重复了它。@Luca:只需将全部内容移到paintGL即可。相信我,在
resizeGL
中使用它对性能没有任何好处。关于现代OpenGL,整个讨论都是毫无意义的!在现代OpenGL中,不再存在转换矩阵状态;您应该在着色器统一变量中自己设置它们。如果使用FBO,你会多次切换视口。@Luca:随着这些变化而“成长”的问题是,你通过实验学习它们,偶尔自己编写教程,所以有一些偏见。我很喜欢尼古拉斯(又名杰森·L·麦凯森)写的教程——不幸的是,出于某种原因,他在广播中沉默了很长一段令人担忧的时间;他的域名注册量实际上下降了!因此,最近我在自己的服务器上安装了一个镜像,但是很多人抱怨本教程是为已经了解OpenGL的人编写的。@Luca:除了我们在侧边栏上收集的教程很受尊重之外。@Luca:oops,应该是固定的now@Luca:视口和投影矩阵是OpenGL状态变量。这是非常好的,实际上反复更改其值是非常常见的–例如,每次您看到一个小地图、一些导航HUD或一些概览窗口时,这是通过中途更改视口和投影来完成的。OpenGL规范中没有告诉框架应该尊重它们。另外,整个
resizeGL
restrape
函数混乱是由GLUT启动的,而且从应用程序框架似乎已经重复了它。@Luca:只需将全部内容移到paintGL即可。相信我,在
resizeGL
中使用它对性能没有任何好处。关于现代OpenGL,整个讨论都是毫无意义的!在现代OpenGL中,不再存在转换矩阵状态;您应该在着色器统一变量中自己设置它们。如果使用FBO,你会多次切换视口。@Luca:随着这些变化而“成长”的问题是,你通过实验学习它们,偶尔自己编写教程,所以有一些偏见。我很喜欢尼古拉斯(又名杰森·L·麦凯森)写的教程——不幸的是,出于某种原因,他在广播中沉默了很长一段令人担忧的时间;他的域名注册量实际上下降了!所以最近我在自己的服务器上安装了一个镜像,但是很多人抱怨这本教程是为已经了解OpenGL的人编写的。@Luca:除了我们在侧边栏上收集的教程很受尊重之外。@Luca:oops,现在应该修好了