【问题标题】:Using SDL, OpenGL and Qt together一起使用 SDL、OpenGL 和 Qt
【发布时间】:2014-12-07 16:27:31
【问题描述】:

一段时间以来,我一直在使用 SDL 编写我的 3D 引擎,并且最近一直在实现一个编辑器,该编辑器可以针对我正在构建的引擎类型导出优化的格式。现在编辑器相当简单,对象可以四处移动,它们的纹理和模型可以改变。截至目前,我正在使用 SDL 和 OpenGL 来渲染所有内容,但我想将 Qt 用于编辑器的 GUI 部分,这样它在每个平台上看起来都是原生的。到目前为止,它运行良好,我在 SDL 应用程序中运行 QApplication,所以它基本上只打开 2 个窗口,一个使用 SDL 和 OpenGL,另一个使用 Qt。做了一些研究,我发现您可以手动更新 QApplication,这完全消除了任何线程问题,并且一切正常。以防万一你很难想象这一点,这里有一张图片:

我的目标是将这些窗口合并为一个,因为在较小的屏幕(如我的笔记本电脑)上,很难跟踪我最终拥有的所有不同窗口。我知道有一种方法可以使用 OpenGL 渲染到 Qt,但这可以与 SDL 集成吗?如果启用了编辑器,我是否需要放弃使用 SDL 窗口并使用 QT 窗口?澄清一下,当引擎不处于编辑器模式时,它不会使用 Qt,而只会使用 SDL,所以最好我不需要这样做。

【问题讨论】:

  • '我在 SDL 应用程序中运行 QApplication',您的意思是在单个可执行文件上同时启动 SDL 和 Qt,还是在 SDL 窗口中加载 Qt opengl 上下文?不管怎样,这很有趣,介意分享运行 Qt 和 SDL 的任何资源吗?
  • @Alex720 他们都在同一个可执行文件中运行,基本上它是:Init SDL,Init QT,而(运行)updateQT updateEngine renderSDL。我想知道如何将 SDL 上下文嵌入到 Qt 窗口中
  • @BlueSpud - 由于您使用的是 Qt 窗口,因此不妨按照 datenwolf 的建议将 SDL 作为依赖项删除,SDL 在 Qt 中已有的东西,您将删除冗余。此外,此视频可能会帮助您使用 Qt 嵌入第三方 opengl 渲染:youtube.com/watch?v=GYa5DLV6ADQ

标签: c++ qt opengl sdl


【解决方案1】:

删除 SDL 部分。您拥有 Qt,它也可以完成 SDL 所做的所有事情。只需继承一个 QGLWidget 并使用它。

【讨论】:

  • 我不想放弃SDL,因为当引擎不处于编辑器模式时,它甚至不会与qt交互,这就是我需要保留SDL的原因。
  • @BlueSpud:那么你实际上是在处理两个完全不同的程序。因此,我建议您将引擎构建到一个库中,并将该库链接到两个不同的可执行文件中:独立运行时和编辑器。运行时使用 SDL,编辑器使用 Qt。
  • 老实说,如果归根结底,不如将它们放在单独的窗口中。
  • @BlueSpud:嗯,当然可以将两个程序放在一个可执行文件中。对于编辑器模式,只需使用 QGLWidget 而不是 SDL。并且对于运行时模式而不是启动 Qt 框架跳转到 SDL 代码路径。
  • 这需要进行相当多的重组,就像我说的,我宁愿将它们保留为单独的窗口,也不愿改变它。
【解决方案2】:

您可以让您的游戏和编辑器分开进程,并且仍然使它们成为同一个应用程序的一部分。

只需在 Qt 的一部分中生成您希望游戏运行的窗口,然后至少在 Windows 中,您可以将窗口句柄传递给您的游戏,并确保您的游戏何时设置,而不是创建在 SDL 中自己窗口并将 opengl 上下文绑定到它,您实际上可以绑定到现有句柄。

我认为这种技术存在一些需要注意的问题,例如输入焦点(我使用 directX 进行了测试,但它可能与 SDL 类似)。问题是前台模式对“根”窗口进行了一些愚蠢的检查,对我来说这不是拥有opengl上下文的窗口,所以它无法初始化。但是后台模式有效。我想现在我想那是一个操纵杆,但无论如何,这就是你可以将所有东西合并在一起的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多