背景
使用 Steam 控制器时,您可以将触摸板配置为在您开始触摸时显示在屏幕上的复杂菜单。这些菜单对于具有许多控件的游戏非常方便。它们看起来像这样:
然而,在 SteamVR 中玩游戏时,这些叠加层都不会出现在 VR 中。它们仅出现在与其一起呈现的桌面窗口上。
这是已知的错误或缺失功能。我的目标是为它写一个修复程序。但事实证明这非常棘手。
我的问题
我知道如何在 OpenVR/SteamVR 中渲染叠加层。Valve 的文档对我来说已经足够了。但是我没有想出一个好的方法来捕捉绘制在游戏窗口顶部的叠加层。
我心里有两个想法。但我不知道如何正确实施它们。
捕获覆盖
我对 Steam 控制器叠加层的技术细节一无所知。但是,我认为它与 Steam Overlay 具有相同或非常相似的实现并不是一个糟糕的假设。
根据 Steamworks API 文档,Steam 会监听应用程序触发的 Present/SwapBuffers 调用并相应地刷新覆盖。(请参阅https://partner.steamgames.com/doc/api/ISteamUtils#BOverlayNeedsPresent)另外,我的猜测是 Steam 获取窗口的 hWnd,使用其 DC 创建一个 OpenGL 上下文并在每次收到 SwapBuffers 时呈现给它呼叫它正在听。
但这就是故事的结局。我不知道如何真正阅读 Steam 在上面渲染的内容。我曾想过将自己连接到 Steam 正在使用的绘图消息队列中,并在叠加层绘制之前和之后捕获在窗口上呈现的内容。我还想过欺骗 Steam,让其认为另一个具有绿色背景的窗口是它应该渲染到的窗口,然后只是捕获其内容。但这些只是外界的猜测。我不知道我将如何实现它。
使用色度键控
选定按钮具有非常特殊的平坦和不透明的蓝色调。我可以制作窗口的屏幕截图,然后只获取具有这种特定颜色的像素。劣势相当明显。所有其他区域都是半透明的,因此不适合色度键控。抗锯齿文本也是如此。幸运的是,您可以更改图标及其颜色,如下图所示。所以这会有点工作,但它会非常难看。
有人对我的问题有更好的想法或解决方案吗?