【发布时间】: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 层次结构应该说让它们合成。我能做些什么来完成我想要的?
【问题讨论】: