Qt 5中的OpenGL与OpenGL / Qt OpenGL:差异和局限?

时间:2013-03-27 23:58:24

标签: qt opengl qt5

由于有两种方法可以将OpenGL与Qt 5QOpenGL / QtOpenGL包装器和常规OpenGL API)一起使用,我想知道每种方法的局限性。有人可以告诉我是否应该注意QOpenGL包装器是否有限制?

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

1 个答案:

答案 0 :(得分:16)

  

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

嗯,Qt 5.0的OpenGL包装器建立在OpenGL ES(嵌入式系统)2.0规范之上,该规范本质上是桌面OpenGL 3.0规范的淡化版本。 Qt之所以选择此规范是为了便于移植,因为它几乎被所有现代PC都支持,因此受到移动平台的广泛支持。如果您选择使用Qt包装器,您必须解决OpenGL ES 2.0规范的缺点,该规范在很大程度上属于以下类别:

  1. 没有固定功能的管道功能。 (没有转换堆栈,glBeginglEndglLightf等。)
  2. 不支持高级OpenGL 3+功能或仅支持扩展。 (纹理缓冲对象,计算着色器,原子加载存储纹理,曲面细分着色器,统一缓冲对象等。)
  3. 缺少某些纹理格式(整数纹理,图像纹理等)。
  4. GLSL语法中的细微差别&语义。 (缺少布局限定符,通过highplowp声明等的数据精度要求。)
  5. 缺乏一些便利方法。 (glBlitFramebufferglMultiDrawArraysglDrawRangeElements等等。)
  6. 有关OpenGL ES 2.0规范的完整描述,请查看here

    然而,缺乏这些功能并不意味着Qt包装器无法满足您的需求。虽然OpenGL ES 2.0缺少许多有用的功能,但您仍然可以完成整个桌面OpenGL规范允许的99%。如果您决定通过自定义包装器使用桌面OpenGL规范,Qt仍然可以管理创建和创建。通过使用QGLFormat类来窗口化桌面OpenGL上下文。

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

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

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