【问题标题】:render a qt overlay window over opengl child window在 opengl 子窗口上渲染一个 qt 覆盖窗口
【发布时间】:2020-11-11 18:51:48
【问题描述】:

我正在寻找一些关于渲染子窗口的信息,特别是关于 OpenGL 如何与 GDI 互操作。我遇到的问题是,我基本上有两个窗口,首先,主窗口是在 qt 中创建的,在 qt 内部,托管了一个利用 OpenGL 渲染器的子窗口。

现在我想做的是在我的 OpenGL 窗口顶部托管一个覆盖,所以我用它来覆盖 OpenGL 窗口。我遇到的问题是,当我使用 OpenGL 进行渲染时,OpenGL 生成的图形似乎掩盖了图形区域,包括并有效地撤消了由 qt 合成的图形。

在下图中的蓝色区域是 qt 叠加层,在那张图片中我使用 GDI(BeginPaint/EndPaint),因此窗口似乎可以正常交互。也就是说,窗口顺序似乎是正确的,客户区域是正确的。当我开始使用 Opengl 进行渲染时,蓝色区域会被 OpenGL 渲染的任何内容所取代。

我所做的基本上是为了创建叠加层,我创建了第二个无框、最上面的QMainWindow,并且一旦平台 HWND 被初始化,我就重新设置它。基本上我将新的窗口父级更改为我的 OpenGL 窗口的同一个父级。

我认为这样做的目的是,每个窗口都单独绘制,桌面合成管理器将进行最终合成,基本上避免了微软在其 WPF 框架中记录的臭名昭著的airspace 问题。


我想知道是什么导致了这些问题?在这一点上,我不明白为什么一旦我用 OpenGL 渲染,qt 叠加的像素就会被遮挡,即使 Windows 层次结构应该说让它们合成。我能做些什么来完成我想要的?

【问题讨论】:

    标签: c++ windows qt opengl dwm


    【解决方案1】:

    在共享可绘制对象上混合 OpenGL 和 GDI 绘图(还包括不带 CS_OWNDC 窗口类样式标志的兄弟窗口/子窗口)从不得到支持。这与 Qt 无关,而只是 OpenGL 和 GDI 如何交互。

    但更重要的问题是:你为什么不首先使用 Qt 中内置的 OpenGL 支持? 自从 Qt-5(如果可用)使用 OpenGL 绘制一切(所有 UI 元素)。 Qt-5 使得混合 Qt 的东西和 OpenGL 绘图变得微不足道。

    【讨论】:

    • 我的 OpenGL 窗口设置了 CS_OWNDC ,我假设 Qt 的窗口正如你所说的 qt 使用 OpenGL 作为后端,也设置了 CS_OWNDC。关于为什么我不使用来自 qt- 的 opengl 上下文是因为简单地说,渲染器甚至不在同一个进程中。
    • @LawrenceKok,啊,那更有意义。好吧,IPC OpenGL 可以做,但是设置正确有点烦人。您的渲染器进程是否可以在 FBO 上渲染到纹理?如果是这样,您可以使用 Vulkan 创建纹理,将纹理导出到 GUI 进程,然后在任一侧将纹理导入 OpenGL 以渲染并合成到 GUI。
    • 从技术上讲,是的,我可以在屏幕外渲染,但是是的,它可能对架构进行大修,理想情况下我宁愿不这样做,除非真的别无选择。我在这个故事中不太了解的是,当我在(浮动/可移动)窗口中运行 opengl 上下文时,它可能会被另一个窗口部分遮挡。我的意思是我的opengl渲染器可以被浏览器遮挡,比如firefox,而DWM能够处理得很好。这真的让我想知道为什么这种情况如此特殊,因为最终,qt/opengl 渲染器是完全沙盒化的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多