Qt 5中的OpenGL与QOpenGL/QtOpenGL:差异和限制



由于有两种方法使用OpenGL与Qt 5 (QOpenGL/QtOpenGL包装器和常规OpenGL API),我想知道是什么限制每一个。有人能告诉我是否有QOpenGL包装器的限制,我应该意识到?

我问这个的原因是因为我不想开始使用QOpenGL包装器,发现我不能使用OpenGL API的全部功能。有没有人在这两方面都有经验,并能提供一些关于能力、性能和易用性方面的提示?

我不想开始使用QOpenGL包装器,发现我不能使用OpenGL API的全部功能

嗯,Qt 5.0的OpenGL包装器是建立在OpenGL ES(嵌入式系统)2.0规范之上的,这个规范本质上是桌面OpenGL 3.0规范的淡化版本。Qt选择这个规范是为了促进可移植性,因为它被移动平台广泛支持,而且几乎所有现代pc都支持它。如果您选择使用Qt包装器,您必须围绕OpenGL ES 2.0规范的缺点进行工作,这些缺点在很大程度上属于以下类别:

  1. 没有固定功能的管道功能。(无变换叠加,glBeginglEndglLightf等)
  2. 不支持高级opengl3 +功能或仅支持扩展。(纹理缓冲对象,计算着色器,原子加载存储纹理,镶嵌着色器,统一缓冲对象等)
  3. 缺少某些纹理格式(整数纹理,图像纹理等)
  4. GLSL语法的微小差异&语义。(缺乏布局限定符,通过highp, lowp声明的数据精度要求等)
  5. 缺少一些方便的方法。(glBlitFramebuffer, glMultiDrawArrays, glDrawRangeElements等)

有关OpenGL ES 2.0规范的完整描述,请查看此处。

然而,缺少这些特性并不意味着Qt包装器不能完成您所需要的。尽管OpenGL ES 2.0缺少很多有用的功能,你仍然可以完成完整桌面OpenGL规范允许的99%的功能。如果你决定通过自定义包装器使用桌面OpenGL规范,Qt仍然可以管理创建&通过使用QGLFormat类实现桌面OpenGL上下文的窗口。

请记住,如果您决定使用桌面OpenGL包装器,并在Qt应用程序中使用这些包装器,Qt提供的一些类可能会干扰您自定义包装器的操作。例如,QPainter在QGLWidget上的操作可能会利用OpenGL ES规范的功能,并且可能会干扰包装器对象的操作。

就我个人而言,我更喜欢使用自定义的OpenGL包装器,因为我更喜欢桌面OpenGL规范,因为它的特性集定义得更好,而且它们提供了更多的选项来解决问题。另一方面,Qt 5提供了一些非常棒的架构,可以使用OpenGL ES创建快速、强大的动态用户界面。(通过QtQuick 2和QML)

哪个API最适合你的需求,本质上取决于你是针对嵌入式平台还是移动平台(在这种情况下,你被迫使用OpenGL ES),以及你是否愿意牺牲额外的开发时间来编写和维护自定义OpenGL 3+包装器。

最新更新