1

我们一直在研究使用透明小部件作为 Ogre 的覆盖。虽然 Qwidgets 默认是透明的,但将它们覆盖在 Ogre 小部件上是不同的,并且会出现黑屏。在食人魔论坛(http://www.ogre3d.org/forums/viewtopic.php?f=2&t=42733)我发现以下内容:

“好的,为了弄清楚我的想法,我将总结一下我发现的将 Ogre 和 Qt 结合起来的各种方法:

  1. 使用 Qt 创建一个窗口(不一定是 QGLWidget)并使用“externalWindowHandle”标志将其窗口句柄传递给 Ogre。Ogre 然后创建一个上下文并对其负全部责任。这基本上是我为我制作的第一个演示所做的。它的优点是它应该支持 OpenGL 和 Direct3D,并且应该可以在所有平台上工作。最大的缺点是 Qt 小部件只能被覆盖(而不是集成),因此您无法获得良好的透明度。

  2. 一种类似于 (1) 的方法,但不同之处在于帧缓冲区是从 Ogre 显式读回并用作小部件背景。这将再次适用于所有渲染系统和平台,现在 Qt 可以从透明度执行适当的合成。但是,读取每一帧并将其复制到 Qt 的需要可能会很慢。但这可能是一个很好的“后备”方法。我还没有尝试实现它。

  3. 这是我们在这个线程中真正考虑的“正确”方法。它涉及 Ogre 和 Qt 都拥有 OpenGL 上下文,并且都渲染到同一个小部件中。此小部件设置为 QGraphicsView/QGraphicsScene 的背景,其他小部件可以叠加适当的透明效果。它仅适用于 OpenGL,并且(理论上)是跨平台的。有两种变体:

    • 允许 Ogre 创建它自己的 OpenGL 上下文(传递标志 'externalGLControl'),然后在 createRenderWindow() 完成后重新获取上下文。在 windows 下有 wglGetCurrentDC() 和 wglGetCurrentContext() ——其他平台应该有类似的东西。

    • 让 Qt 代表 Ogre 创建一个上下文,并使用“externalGLContext”标志将其传递给 Ogre。在这种情况下,Ogre 基本上什么都不做,除了渲染到它提供的上下文中——所有的控制都在 Qt 中。因为我在 Qt 和 Ogre 中都遇到了崩溃,所以我还没有完全让这个工作。”

方法 1 是我们在项目中采用的方法,如上所述,我们在透明度方面遇到了同样的问题。方法 3 是可能的,但我们会限制自己使用 openGL。该代码可在论坛链接的第 3 页找到。

我们还找到了一个演示视频,但我找不到它是如何实现的,但它看起来真的很酷:http: //youtu.be/b_3xfFuwGOQ

4

2 回答 2

2

您现在可以在https://github.com/advancingu/QmlOgre的更新 QmlOgre 示例中找到您的第三个建议方法的第二个变体的实现。原始示例有一些问题已在此处修复。

希望在您提出问题几个月后这仍然有帮助。

于 2013-04-05T22:54:10.460 回答
0

*这是该视频的代码 (http://youtu.be/b_3xfFuwGOQ)。(需要Qt5) http://qt.gitorious.org/qt-labs/qmlogre

还有Cutexture(需要Qt4) https://github.com/advancingu/Cutexture http://i56.tinypic.com/b6xb83.jpg

这是一个 Qt4 Ogre Widget 示例。(需要 Qt4) http://zester.googlecode.com/files/QtCreatorOgre2.zip *

于 2012-12-19T09:41:27.397 回答