首页 文章

Direct3D场景之上的QtQuick 2.0场景

提问于
浏览
6

我一直试图想出一个解决方案,将QtQuick 2.0场景与Direct3D场景一起使用很长一段时间,但不是很成功 . 我的目标是让Direct3D引擎以合理的速度(60 FPS?)与QML UI一起运行 . 这两件事都可以自己运行150-200 FPS . 但是当被迫在一个窗口内合作时,一切都只是香蕉 . 我调查了几种方法,但似乎没有一种方法足够:

Solution A: Rendering Direct3D scene into a texture, visualizing with QImage & QQuickPaintedItem

  • 这个解决方案效果很好,根据网络上的其他人看来它似乎是首选的解决方案 . 然而,它很慢 . 全高清无法超过18-20 FPS . 从每个帧的GPU(D3D)到CPU(QImage)再到GPU(QML渲染器)的纹理传输链中明显存在瓶颈 . 尤其是QML端的CPU-> GPU处理速度太慢了!

Solution B: Rendering QtQuick scene into a FBO, then using Direct3D texture

  • 这基本上是以前的解决方案 . 当UI不需要更新时,速度会更好一些 . 一旦开始制作动画,一切都会再次下降到18-20 FPS . QOpenGLFramebufferObject :: toImage()显然需要时间 . 在两侧实施纹理/ FBO双缓冲以减少失速并没有多大帮助 .

Solution C: QQuickView with enabled transparency on top of QWidget with Direct3D scene

用这种方法

  • 也不幸运 . 只有当QQuickView在自己的窗口中时,透明度似乎才有效 . 一旦我把它放在同一个窗口的D3D QWidget之上,它立即停止工作并变得完全不透明 . 有人试图在那里做类似的事情:http://qt-project.org/forums/viewthread/5484,但我根本没有运气 . 也许保持两个完全分开的窗口(主D3D窗口无框架透明QML窗口)一直在彼此之上就可以了,但这听起来很傻 .

Solution X: Modify ANGLE library and try to extract & share D3D device context with my Direct3D renderer

  • 尚未尝试过,尽可能避免任何库修改 . 这甚至是一个明智的选择吗?

我这里显而易见的问题是:我做错了吗?什么是首选解决方案? A,B,C,X或者可能是完全不同的东西?有人能指出我正确的方向吗?

TL;DR: 在Direct3D场景之上渲染QML场景的最快方法是什么?

1 回答

相关问题