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 文件中。)
我试过的:
- BitBlt(),通过将桌面 HDC 的矩形部分绘制到右侧 window。我在 WM_PAINT 右侧 window 的消息中调用 BitBlt(): 这有效,BUT 右侧 window 是 1左后 -2 帧。
可能的解决方案:
在左-window的WM_PAINT信息中,画出两个windows相同的内容。这有可能吗?
使用一个巨人 window 绘制两个矩形。这意味着所有绘图都发生在同一个 WM_PAINT 调用中。但是,我不知道如何将 window 的一部分复制到另一部分。我希望我可以告诉 Win32 'draw again',但是这次从右边开始 1000 像素...
用 DirectX 做 "something"。 (不知道是什么。)
如有任何帮助,我们将不胜感激!
我不知道你是否还需要答案,但我认为没有比使用 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
我写了一个Win32 C++程序。
我想在每一帧复制左边window的视觉内容,让它出现在屏幕的另一个位置。 (屏幕左侧一个矩形,屏幕右侧一个相同的矩形。)
这是为了立体渲染,用户左眼看到左边的矩形,右眼看到右边的矩形。
两个矩形必须是"frame synced",这意味着它们必须始终显示相同的帧。或者换句话说,如果右眼比左眼落后 "one draw call",那么观看者就会生病。
注意:我有两个 windows 的源代码,因为它们是我创建的。 (目前 windows 都位于同一个 exe 文件中。)
我试过的:
- BitBlt(),通过将桌面 HDC 的矩形部分绘制到右侧 window。我在 WM_PAINT 右侧 window 的消息中调用 BitBlt(): 这有效,BUT 右侧 window 是 1左后 -2 帧。
可能的解决方案:
在左-window的WM_PAINT信息中,画出两个windows相同的内容。这有可能吗?
使用一个巨人 window 绘制两个矩形。这意味着所有绘图都发生在同一个 WM_PAINT 调用中。但是,我不知道如何将 window 的一部分复制到另一部分。我希望我可以告诉 Win32 'draw again',但是这次从右边开始 1000 像素...
用 DirectX 做 "something"。 (不知道是什么。)
如有任何帮助,我们将不胜感激!
我不知道你是否还需要答案,但我认为没有比使用 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