Win32 复制、镜像、复制或绘制 window 内容两次,具有完美的帧同步。用于立体左眼右眼渲染

Win32 Duplicate, mirror, copy or draw window contents twice, with perfect frame synchronization. For stereo left-eye right-eye rendering

我写了一个Win32 C++程序。

我想在每一帧复制左边window的视觉内容,让它出现在屏幕的另一个位置。 (屏幕左侧一个矩形,屏幕右侧一个相同的矩形。)

这是为了立体渲染,用户左眼看到左边的矩形,右眼看到右边的矩形。

两个矩形必须是"frame synced",这意味着它们必须始终显示相同的帧。或者换句话说,如果右眼比左眼落后 "one draw call",那么观看者就会生病。

注意:我有两个 windows 的源代码,因为它们是我创建的。 (目前 windows 都位于同一个 exe 文件中。)

我试过的:

可能的解决方案:

如有任何帮助,我们将不胜感激!

我不知道你是否还需要答案,但我认为没有比使用 DWM 缩略图更好的了 API [1]。你基本上是在你的 window 上关联一个区域 <-> 一个外国 window 的区域,然后每次 windows 被组合并呈现在屏幕上时,指定的矩形外国的 window 将绘制在您的 window 的指定矩形上。 DWM 将在必要时进行缩放,您还可以指定透明度级别。这是最有效的方法,因为合成器完成了所有繁重的工作,所以它处于最低级别,您无需编写内核模式代码(自定义驱动程序等)即可。你不能在上面画画,也不会在你的 window 上“看到”外国的 window 数据,如果你用 BitBlt 举例来说,因为图像实际上并没有画在你的 window 上],但当您的 window 的最终图像由 window 经理合成并呈现给用户时,会覆盖在顶部。但对于大多数用途而言,它的效果非常好。

[1] https://docs.microsoft.com/en-us/windows/win32/dwm/thumbnail-ovw