读取Steam控制器叠加并将其渲染到SteamVR中的VR场景

时间:2017-10-29 00:59:27

标签: opengl window screen-capture steamworks-api openvr

背景

使用Steam控制器时,您可以将触摸板配置为开始触摸屏幕时显示在屏幕上的复杂菜单。这些菜单对于具有许多控件的游戏非常方便。它们看起来像这样:

radial menu touch menu

然而,当在SteamVR中玩游戏时,这些叠加中没有一个出现在VR中。它们仅出现在与其一起呈现的桌面窗口上。

这是一个已知的错误或缺失的功能。 我的目标是为它编写一个修复程序。但事实证明这很棘手。

我的问题

我知道如何在OpenVR / SteamVR中渲染叠加层。 Valve的文档对我来说已经足够了。但是我没有想出一个很好的方法来捕捉在游戏窗口顶部绘制的叠加层。

我脑子里有两个想法。但我不知道如何正确实施它们。

捕捉叠加层

我对Steam Controller Overlay的技术细节一无所知。但是我认为它与Steam Overlay具有相同或非常相似的实现并不是一个错误的假设。

根据Steamworks API文档,Steam监听应用程序触发的Present / SwapBuffers调用并相应地刷新覆盖。 (见https://partner.steamgames.com/doc/api/ISteamUtils#BOverlayNeedsPresent) 另外我的猜测是Steam获取窗口的hWnd,用它的DC创建一个OpenGL上下文,并在每次收到它正在监听的SwapBuffers调用时呈现给它。

但那是故事的结局。我不知道如何真正阅读Steam在其上呈现的内容。我曾想过将自己挂钩到绘图消息队列中,Steam正在使用并捕获在绘制叠加层之前和之后窗口上呈现的内容。我还想过欺骗Steam认为一个带有绿色背景的不同窗口是它应该呈现的那个然后只是捕获它的内容。但这些只是对野外的猜测。我不知道如何实现它。

使用色度键控

选定按钮具有非常特定的平坦和不透明的蓝色调。我可以制作窗口的截图,然后只拍摄具有这种特定颜色的像素。缺点很明显。所有其他区域都是半透明的,因此不适合色度键控。抗锯齿文本也是如此。幸运的是,您可以更改图标及其颜色,如下图所示。所以那会有点工作,但这会非常难看。

有没有人对我的问题有更好的想法或解决方案?

enter image description here

0 个答案:

没有答案