我们一直在研究使用透明小部件作为食人魔的叠加层。尽管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
答案 0 :(得分:2)
您现在可以在https://github.com/advancingu/QmlOgre更新的QmlOgre示例中找到第三个提议方法的第二个变体的实现。原始示例中有一些问题已在此处修复。
希望在你提出问题几个月后这仍然有用。
答案 1 :(得分: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 *