【问题标题】:Transparent Qt-widget and Ogre透明的 Qt-widget 和 Ogre
【发布时间】:2012-11-12 07:50:02
【问题描述】:

我们一直在研究使用透明小部件作为 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

【问题讨论】:

    标签: qt opengl direct3d ogre


    【解决方案1】:

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

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

    【讨论】:

    • 不能使用标准的 Ogre OpenGL 渲染系统。仅适用于 X11 或 Win32GLES2。
    • 我没有听说过任何特定于平台的问题。您能否在 Github 上报告问题并提供更多信息?
    【解决方案2】:

    *这是该视频的代码 (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*

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多