繁体   English   中英

麻烦理解 OpenVR 驱动 API

[英]Trouble understanding OpenVR driver API

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

我知道实现IServerTrackedDeviceProvider的 object 是我的驱动程序设备的处理程序, ITrackedDeviceServerDriver是设备本身的接口,我怀疑我的“HMD”设备必须实现IVRDisplayComponent

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

你几乎是对的。

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

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

GetComponent()接收带有组件名称和版本的 c 字符串,例如存储在vr::IVRDisplayComponent_Version中的"IVRDisplayComponent_002" ,如果设备具有匹配名称版本对的组件,则需要返回指向它的指针,如果没有找到匹配返回NULL

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

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

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

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

几点注意事项:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM