如何在Qt 5.4中使用本地OpenGL?

6
我希望使用Qt 5.4创建一个窗口,并在其中使用普通的OpenGL函数渲染一些内容。最近几天,我阅读了很多关于Qt类和如何初始化OpenGL等方面的内容。我认为,我需要处理的主要类是QOpenGLWindow或QOpenGLWidget,但还有QSurface和其他一些类。现在我非常不确定接下来该做什么,应该使用哪个类来稍后使用普通的OpenGL函数。有人能给我更清楚地解释一下,在其中可以使用纯OpenGL设置Qt GUI的步骤吗?
我还有其他一些问题:
  • Qt在哪个时刻创建了一个纯OpenGL上下文?我是否必须使用QOpenGLContext?
  • QSurface和QOpenGLWindow之间的区别是什么?在QOpenGLWindow示例中,两个类都被使用。
  • 除了Qt stuff,是否可以使用glew?这里有一些关于在qt中设置glew的问题,但我认为我没有真正明白为什么需要glew。
编辑:我与同事讨论了这个问题,我们唯一的结论就是使用离屏呈现。是否有其他解决方法?

你看过OpenGL窗口示例了吗?(虽然它没有使用QOpenGLWindow类)?QSurfaceQWindowQOpenGLWindow的纯虚基类。显然,QOpenGLWindow的工作方式类似于QOpenGLWidget,而QOpenGLWidget有更完整的文档说明。 - Leiaz
Qt中还附带了一个QOpenGLWindow示例。 - peppe
1个回答

2
在哪些情况下Qt会创建一个普通的OpenGL上下文?我是否必须使用QOpenGLContext?
可以在文档中找到(例如,创建QOpenGLWidget或QOpenGLWindow将自动创建上下文),或者您可以通过创建QOpenGLContext对象在任何时候手动创建上下文。
QSurface和QOpenGLWindow之间有什么区别?在QOpenGLWindow示例中,这两个类都被使用。
QSurface是表示“可绘制表面”(onscreen或offscreen)的基类。QWindow是其屏幕实现(表示顶级窗口),因此它继承自QSurface。您可以使用OpenGL或使用基于CPU的光栅化器在QWindow上绘制。
最后,QOpenGLWindow是QWindow子类,它通过QOpenGLContext自动创建和管理OpenGL上下文,并提供一些额外的功能和方便,具有可选的部分更新策略(通过FBO使用)等。
除了这些Qt内容,还有可能使用glew吗?这里有一些关于在qt中设置glew的问题,但我认为我没有真正理解为什么需要glew。
Qt不会妨碍您。它不会以任何方式改变您对OpenGL的使用。只需使用Qt以完全跨平台的方式创建窗口和上下文,然后您就可以自由地使用GLEW(来解决OpenGL函数指针,扩展等)或任何第三方OpenGL抽象。

除了QT之外,它阻碍了我的进程,因为我无法将手动创建的OpenGLContext设置为任何QWidgets的当前上下文,只有QSurfaces可以这样做。如果我想在QWIdget中使用当前的OpenGLContext,我必须决定仅使用QT管理的上下文,在initializeGL(),paintGL()和resizeGL()函数中保证其为当前上下文。 - ComradeJoecool
一个QWidget不是OpenGL表面,因此“在其上使上下文当前”没有意义。你需要一个真正的表面来做你想做的事情——例如使用一个普通的QWindow,并通过QWidget::createWindowContainer将其包装在小部件中。这不是“妨碍你”,而是按照游戏规则进行游戏(顺便说一句,这些规则由OpenGL而不是Qt所规定)。 - peppe
好的,我应该提到它不是QWidget,而是QOpenGlWidget,我可以在上面使用OpenGL,但只有在QT的方式下才能这样做,也就是“按我的方式”。 - ComradeJoecool
因为QOpenGLWidget不是窗口表面。正如我所说,如果你想要“完全本地”的方式,你可以使用:QWindow + QOpenGLContext + QWidget::createWindowSurface。QOpenGLWidget是一种不同的解决方案,有一些优缺点。 - peppe
顺便提一下,QGestures 在 QWindows 上不受支持,并且使用 QWidget::createWindowContainer() 将 QWindow 嵌入 QWidget 中会有自己的一套限制和已知问题。 - ComradeJoecool
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接