Canvas3D和QQuickFramebufferObject

时间:2016-12-28 17:13:51

标签: qt opengl qml qtquick2

Some time ago我问Canvas3D和QQFBO是否有相同的目的。我被告知他们这样做,我选择了两者中的Canvas3D,因为我更喜欢用JS编写代码。但是现在我遇到了一些非常严重的阻塞问题(在this question of mine结尾处描述)导致我考虑转移到QQFBO。我担心QQFBO也可能有限制,对我来说有问题,所以我的问题是:两者之间究竟有什么区别?

我知道两者基本上是一样的。我知道一些不同之处:

  • 对于Canvas3D,您使用JS编写代码,使用C ++编写代码的QQFBO
  • 与QQFBO不同,每个Canvas3D实例都有自己的OpenGL上下文,这需要一些时间进行初始化,这会阻止在几个Canvas3D之间共享GL资源。
  • Canvas3D将我的所有GL命令放入队列并稍后执行。我认为这是为了支持多线程,这可能会提高性能。此外,它还保存了我的命令,以便以后进行“无变化”重绘,这可能会提高性能。但是副作用是我不应该在onPaintGL()中使用同步GL命令。
  • Canvas3D非常错误 - gl.colorMask and gl.depthMask break everythingrequesting GL ES 3.0 breaks everythinggl.MULTISAMPLE is missing。我希望QQFB可以减少错误,因为它更接近底层的OpenGL API,因为它是一个较旧的API。
  • 使用QQFBO我想我可以访问Qt非常有用的C ++ GL类,例如QOpenGLShaderProgram,而使用Canvas3D,我必须编写纯GL代码,将GL包装在我自己的类中(就像我已经完成的那样)或使用像THREE.js这样的东西有缺点。
  • 使用QQFBO,必须覆盖他的QQFBO :: Renderer子类的synchronize方法,并在此方法中的线程之间复制数据。 Canvas3D不需要这样的样板。

我也知道一些重要的相似之处:

  • 我认为两者都会分配一个FBO并让你画画,而不是让你直接画到窗口
  • 在Canvas3D中,您可以使用createTextureFromSource() GL扩展名的QTCANVAS3D_texture_provider函数将任何QML项目作为自动更新的纹理获取。在QQFBO中你可以做同样的事情,但有另一个功能 - textureProvider()

0 个答案:

没有答案