【问题标题】:Mixing OpenGL and software rendered GUI混合 OpenGL 和软件渲染的 GUI
【发布时间】:2015-11-12 15:33:39
【问题描述】:

我需要编写主要内容将由 OpenGL 渲染的应用程序(类似于游戏引擎),但没有类似于 Qt 小部件所做的基于 OpenGL 的良好 GUI 库(但它们是软件渲染的)。

当我浏览 Qt 的源代码时,所有的绘画都是通过 QPainter 完成的,甚至在 OpenGL 中也有 QPainter 实现,但是在 Qt 5 中放弃了对多个图形后端的支持,所以你不能在 OpenGL 中渲染 Qt Widgets不再(我不知道为什么)。

问题是您不能同时使用软件和硬件渲染来绘制窗口表面。您可以让窗口与 OpenGL 上下文相关联或使用软件渲染。这意味着如果我想拥有具有基于 OpenGL 内容的复杂 GUI 的应用程序,我需要使用 OpenGL 绘制所有内容(这很难,因为正如我所说,没有好的 GUI 库),或者我可以使用软件渲染(例如 Qt),然后将该图像加载为 OpenGL 纹理(可能会造成很大的性能损失)。

有谁知道使用软件渲染的 GUI 作为纹理加载到 OpenGL 的任何好的应用程序?我需要确保它可以在没有大的性能损失的情况下工作,但找不到很好的例子,即使对于游戏引擎之类的应用程序也能很好地工作。

【问题讨论】:

  • 你能不能换个方式?将 OpenGL 场景渲染为纹理贴图,然后将该纹理作为 2D 元素放置在 GUI 中。我认为这种方法更类似于网络浏览器所做的,将画布合成到 HTML 页面上。
  • emackey:是的,应该是可以的,但这可能意味着将内容从 GPU 内存加载到 RAM,然后将其显示为图像,因此最终将其从 RAM 移回 GPU。
  • 添加OpenGL标签以获得更多回复:)
  • 你可以试试 niftyGUI
  • Qt 可以和 OpenGL 一起使用。除此之外,您可以强制每个 qt 小部件具有 HWND(从而在其中创建 OpenGL conrext),还有QGlWidget 和QOpenGlWidget

标签: user-interface opengl


【解决方案1】:

如果你采取“渲染 ui 到纹理然后在我的游戏上绘制纹理四边形”路线,并且担心性能,请尽量避免每帧传输整个纹理。

如果你考虑一下:

ui 不需要 60fps:30fps 就足够了,所以两次更新一次。

大多数时候,用户界面不会在帧之间发生变化,如果发生变化,只有一小部分会发生变化。

ui 框架通常会跟踪 ui 的哪个部分是“脏的”并且需要重新绘制。如果您能掌握这一点,您可以只将需要更新的部分 (glTexSubImage2D) 流式传输到纹理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多