【问题标题】:QOpenGLWidget overriding projection matrixQOpenGLWidget 覆盖投影矩阵
【发布时间】:2015-07-25 23:01:09
【问题描述】:

我正在使用 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 并按预期执行。

【问题讨论】:

    标签: qt opengl qt5


    【解决方案1】:

    但是,这在某处被覆盖。当我在paintGL() 函数中打印投影矩阵时,它显示为标识。

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

    您所观察到的是意料之中的,所以不要感到惊讶。

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

    你不应该那样做。与每个基于状态的系统一样,必须在需要时将状态设置为正确的状态,或者跟踪所有状态更改,这要困难得多。

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

    【讨论】:

    • @Luca:视口和投影矩阵是 OpenGL 状态变量。重复更改它们的值非常好,实际上也很常见——例如,每次你看到一个小地图、一些导航 HUD 或一些概览窗口时,这都是通过在中途更改视口和投影来完成的。 OpenGL 规范中没有任何地方告诉框架应该尊重它们。此外,整个 resizeGLreshape 函数混乱是由 GLUT 启动的,自从应用程序框架似乎模仿它以来。
    • @Luca:只需将所有内容移至paintGL。相信我,在resizeGL 中使用它会带来 的性能优势。 关于现代 OpenGL,整个讨论无论如何都是一个有争议的问题! 在现代 OpenGL 中不再有变换矩阵状态;你应该在着色器统一变量中自己设置它们。还有视口,好吧,如果使用 FBO,你会多次切换它。
    • @Luca:随着这些变化“成长”的问题在于,您通过实验学习它们,并且偶尔自己编写教程,因此存在一些偏见。我非常喜欢 NicolBolas(又名 Jason L. McKesson)编写的教程——不幸的是,由于某种原因,他的无线电沉默了很长一段时间,令人担忧;他的域名注册居然挂了!所以最近我在我自己的服务器上设置了一个镜像opengl.datenwolf.net/gltut/html/index.html——但是很多人抱怨这个教程,它是为已经了解 OpenGL 的人编写的。
    • @Luca:除此之外,我们在reddit.com/r/opengl 侧边栏收集的教程都非常受尊重。
    • @Luca:哎呀,现在应该修复了
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2015-04-11
    • 2015-11-01
    • 2013-08-03
    • 1970-01-01
    • 2019-03-05
    • 2015-02-06
    • 2011-08-31
    相关资源
    最近更新 更多