16

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

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

4

1 回答 1

18

我不想开始使用 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. 缺少一些方便的方法。( glBlitFramebuffer, glMultiDrawArrays, glDrawRangeElements, 等等..)

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

但是,这种功能的缺乏并不意味着 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+ 包装器.

于 2013-03-28T03:56:43.583 回答