我正在尝试研究某些图像操作对如何感知VR场景的影响。为此,我想运行一个现成的SteamVR应用程序,捕获从合成器出来的帧,在它们上运行着色器或计算内核,并在HMD上正常显示它们。我知道这样做会带来延迟。我有一些方法可以将其最小化,在这种情况下,我可以忍受额外的延迟,因此暂时不必担心。

我可以看到三种策略可以使我实现这一目标,但是我对显示子系统了解不多,无法知道哪个将起作用以及如何启动。


制作“假”显示驱动程序。我的显示驱动程序将代替HMD的驱动程序,并且就像代理一样。当SteamVR合成器尝试交换缓冲区时,我的驱动程序将在戳入真正的HMD驱动程序之前对后缓冲区进行处理。似乎这方面的主要困难是(a)使Windows接受我的假驱动程序,(b)使SteamVR接受我的假驱动程序,以及(c)让我的驱动程序使用真正的HMD驱动程序。
使用普通的视频捕获软件(例如OBS)处于显示捕获模式,以在帧到达显示驱动程序之前对其进行捕获,然后使用覆盖技术(如Steam覆盖)将经过处理的帧完全覆盖在帧上。这听起来很简单,但是我知道制作系统的两半都需要做大量的工作。
加入SteamVR合成器本身。它支持第三方HMD集成,我希望能够欺骗它,将我的着色器用作色差校正着色器,但事实证明,它不能让HMD集成直接运行着色器,它只是设置内置着色器的参数。如果我可以找到使合成器运行着色器的方法,这似乎应该是最简单的方法。 (如果可以的话,我不反对入侵合成器。)

我知道网站上的某些人也是该领域的活跃研究人员,所以我希望有人对什么可行和什么无效有实践经验。因为这是实验,而不是生产软件,所以我对几天之内可以在一个特定PC上工作的答案更感兴趣,而不是可靠但需要几个月才能解决的问题。

#1 楼

到目前为止,我已经能够使用RenderDoc附加到vrcompositor.exe并拦截进行合成的D3D调用。根据Baldur Karlsson(RenderDoc的作者)的说法,黑客RenderDoc使用它的钩子在我感兴趣的链的每个Present调用上运行任意代码并不难。

我已经还没有机会尝试一下,所以这不是最终答案!我将用任何进一步的进展来更新此帖子。