我们一直在研究使用透明小部件作为 Ogre 的覆盖。虽然 Qwidgets 默认是透明的,但将它们覆盖在 Ogre 小部件上是不同的,并且会出现黑屏。在食人魔论坛(http://www.ogre3d.org/forums/viewtopic.php?f=2&t=42733)我发现以下内容:
“好的,为了弄清楚我的想法,我将总结一下我发现的将 Ogre 和 Qt 结合起来的各种方法:
使用 Qt 创建一个窗口(不一定是 QGLWidget)并使用“externalWindowHandle”标志将其窗口句柄传递给 Ogre。Ogre 然后创建一个上下文并对其负全部责任。这基本上是我为我制作的第一个演示所做的。它的优点是它应该支持 OpenGL 和 Direct3D,并且应该可以在所有平台上工作。最大的缺点是 Qt 小部件只能被覆盖(而不是集成),因此您无法获得良好的透明度。
一种类似于 (1) 的方法,但不同之处在于帧缓冲区是从 Ogre 显式读回并用作小部件背景。这将再次适用于所有渲染系统和平台,现在 Qt 可以从透明度执行适当的合成。但是,读取每一帧并将其复制到 Qt 的需要可能会很慢。但这可能是一个很好的“后备”方法。我还没有尝试实现它。
这是我们在这个线程中真正考虑的“正确”方法。它涉及 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