1

我的最终目标是制作一个 VRidge 轻量级克隆来理解 OpenVR API,但我很难理解如何让我的代码显示一些东西。作为一个起点,而不是我的手机,我想创建一个窗口作为 HMD(SFML,SDL,你可以命名它......)并让 SteamVR 在其中渲染 VR 视图。

我知道实现的对象IServerTrackedDeviceProvider是我的驱动程序设备的处理程序,ITrackedDeviceServerDriver是设备本身的接口,我怀疑我的“HMD”设备将不得不实现IVRDisplayComponent.

除了设置一些属性并使用回调来激活和停用我的设备之外,我不知道从哪里获得要在屏幕上显示的实际帧。我错过了什么?

4

1 回答 1

0

你几乎是对的。

一个继承类vr::IServerTrackedDeviceProvider(我稍后将其称为设备父级)负责注册和维护设备的生命周期(创建设备、注册设备等)

在设备父设备注册后继承vr::ITrackedDeviceServerDriver的类被视为被跟踪设备,设备类型由设备父设备在注册时设置,如果 HMD 设备GetComponent()方法需要返回显示组件,如果请求,对于其他设备它可以只是返回NULL

GetComponent()接收带有组件名称和版本的ac字符串,例如"IVRDisplayComponent_002"存储在vr::IVRDisplayComponent_VersionNULL

同样关于组件,在 Valve 以非常懒惰和糟糕的方式提供其完成的驱动程序示例中,请勿将组件继承到您的设备类

将您的组件分割成您在设备中初始化的单独对象并GetComponent()相应地返回它们

现在,让 SteamVR 正确识别和使用您的设备唯一剩下的事情就是注册它们,但是有一个问题,您需要在注册时指定设备类型,方法是传递vr::ETrackedDeviceClass枚举中的一个值(这些应该是当您查看枚举时,非常不言自明)

当然,这并不是 openvr 驱动程序的全部内容,为了让所有这些都正常工作,并且为了让 SteamVR 甚至承认你的驱动程序的存在,你需要实现一个HmdDriverFactory()函数,它类似于GetComponent()除了你将输入 c 字符串与提供程序名称版本对进行比较和在设备父级的情况下vr::IServerTrackedDeviceProvider_Version,如果您获得匹配,则返回指向您的设备父级或您实现的任何其他提供程序的实例的指针

几点注意事项:

  • HMD至少需要一个显示组件
  • HMD设备对你如何提交姿势非常敏感(不要问为什么,就是这样)
  • 为缺乏文档做好准备,你会得到的最好的文档是代码注释openvr_driver.hValveSoftware/openvr问题跟踪器和其他使用 openvr 驱动程序的人(即使只有少数......)

这不是对 openvr 驱动程序如何工作的最佳解释,因此欢迎您在评论中询问更多详细信息

于 2021-09-08T14:01:49.377 回答