By Jake Edge
XDC
在加拿大蒙特利尔近期举行的X.Org Developers Conference会议上,有一个话题介绍了自由软件中的XR解决方案。XR就是指VR(虚拟现实)和AR(增强现实)。Joey Ferwerda和Christoph Haag来自Collabora,他们共同介绍了XR的概况,以及能支持两种应用的Monado项目。
Ferwerda先定义了一下HMD,这是指head-mounted display,头戴式显示。简单来说就是在脸上贴上一个屏幕以及一些传感器。HMD是实现XR必不可少的设备。它通常包含一个跟踪系统用来确认HMD的位置和朝向。有很多种设备用来实现这个跟踪系统,包括IMU(inertial measurement unit),光敏器件,激光,摄像头等。
AR用来给现实世界增加一些额外信息。用户看到他们周围的真实世界的时候,可以看到各个物体上显示出状态信息或者标签。AR近来有些过热了。简单来说用户带上眼镜就能看到一些额外信息,不过目前大家一提到AR就想到Pokemon Go这个游戏。
VR会用到两个显示屏,每只眼睛一个,这样仿佛用户就看到身边是一个3D世界,也能与之进行交互。所以用户看到的不是真实世界,而是一个完全独立创建出来的世界。通常描述VR的感受有两个词:presence存在感和immersion沉浸感。这就意味着用户感觉好像真得存在于VR创建出来的环境中。
XR包含了VR和AR。Ferwerda也不是很确认X怎么来的。甚至大家对XR的念法都不一样,既有cross reality,也有mixed reality。Haag还听到第三种,extended reality。
Monado and OpenXR
他们在开发的项目名为Monado,是Linux下的OpenXR runtime方案,属于自由软件(free-software)。OpenXR是Khronos Group定义的标准,Khronos也是定义OpenGL, Vulkan等其他图形相关标准的组织。
Haag在介绍OpenXR之前提道,每个XR engine引擎都应该支持一个不同的XR runtime。XR runtime通常是设备相关的。这样就会导致出现无数种device -> engine的组合。利用OpenXR的话,device runtime就提供了一个应用程序接口,允许使用任意的XR engine来和任意符合标准的device runtime配合在一起。OpenXR标准效果上来说,就是在device runtime和硬件之间增加了一个device layer。
XR处理栈中,包含了3层。首先有个程序基于某个软件平台(负责渲染以及处理输入设备)来做VR或者AR的工作。这个平台会跟硬件(包括传感器以及输入设备,以及显示设备)交互。
Haag简要介绍了一下应用程序API,基本上有点类似3D graphics里的Vulkan API,详情参见他的ppt,或者查找OpenXR网站。这个标准还在制定中,所以还缺不少功能,例如尚未支持AR。
应用程序可以先创建一个XR实例,它的句柄后面会一直用到。根据所用到的设备类型不同,例如智能手机,HMD,或者单眼还是双眼显示设备,这些信息都可以被设定到这个实例上。针对某个特定的渲染类型还会创建Session,这里有多种渲染类型,例如OpenGL, OpenGL ES, Vulkan,几种不同版本的DirectED。目前还不能同时支持多个session,所以无法让两个应用程序的输出显示叠加在一起,后续会能够支持。VR桌面就需要这个功能。
渲染是经过三个函数调用来完成的:先等前一帧完成渲染,开始渲染下一帧,然后完成end操作。下一帧的位置信息会由OpenXR来预测,这样渲染场景的时候会针对下一帧显示时的预期方向以及位置。控制手柄的输入信息是由action相关的API来处理的。也很类似Valve在SteamVR平台上定义的OpenVR API。
Ferwerda接着演讲,他认为过去一两年在Linux里面对XR图形支持方面有了不少进展。kernel和显示驱动里面都有一些功能加进来。还有近来支持的Extended mode,在这个模式下,VR显示就作为第二显示器一样,windows都可以显示内容。虽然能工作,不过还是依赖很多手动配置才行,并且这也会引入更多的响应延迟。
VR图形的Direct mode近来也加进来了。主要靠Keith Packard的工作来支持了KMS驱动进行渲染,而不依赖X或者Wayland。在生成帧率低于设备支持的帧率时,很容易出现恶心头晕现象,为了能减轻这个问题,利用了reprojection来复制一帧,或者对现有的帧根据预计的移动方向来做一点点改变。
VR硬件目前多数是基于Vulkan的,所以目前主要用Vulkan来做渲染。如果应用程序是基于OpenGL的,那么就可以利用Vulkan-OpenGL interoperability mode。不过只有部分硬件能支持这个功能。显示纠正(Display correction)是另一个问题,镜头通常都不是完美的,会有扭曲和色差,需要纠正。
Hardware support
Monado仅支持作者们能找到的硬件设备。包括Open Source Virtual Reality (OSVR) Hacker Developer Kit (HDK),目前没有得卖了,不过仍然可以支持。Monado也做了很多反向工程的工作来支持更多设备。除此之外,在OpenHMD项目中还有一个C library,能够部分支持非常多的硬件。
此项目也支持了Razer Hydra游戏手柄的一些基本功能。PlayStation VR和PlayStation Move手柄的支持和刚刚合入。这是首次能完整支持一个人们能轻易买到(不多于300欧元)的设备。
还有其他一些值得注意的自由软件或开源软件项目。首先是libsurvive,可以支持HTC Vive HMD使用的lighthouse tracking(灯塔式跟踪定位机制)。还有一个maplab,能支持SLAM定位方式(simultaneous mapping and tracking)。在使用SLAM tracking的时候,头戴设备能够把当前所在的房间对应起来,这是XR中今后非常重要的一点。
尽快XR还是很年轻的技术,现在相应的开源社区已经存在不少时间了。人们拿到硬件设备之后看到没有对应的驱动,会觉得非常烦恼,然后开始反向工程进行分析。他从2013年开始就加入相应的开源社区,参加了FOSDEM等集会,跟很多志同道合者一起来让硬件能支持各种不同操作系统。还有一位OpenBSD开发者也花了很多时间来支持VR,目前进展比Linux这边还要领先。
反向工程在硬件支持方面是很重要的工作,不过大家都希望今后情况能得以改变。有很多人在做open platform(开源硬件平台),不过都还没有非常成功的。不同设备中用到了很多相同模块,因此开发过程中会容易一点,不过还是会经常需要分析Wireshark数据来试图从IMU里面找到重力传感器和陀螺仪等信息。还有需要搞清楚如何拿到camera的数据,以及怎么使用各种显示模式,这些对他们来说都是很有趣的事。
接下来是演示了,上面的图片中可以看到,这是经典的glxgears在VR环境下运行的样子。显示内容是由Vulkan渲染生成的,按照VR头戴式设备的燕子来展示出来,其中图像都针对VR设备进行了旋转和校准。
Ferwerda认为开发Monado的过程中非常又去,目前这个项目可以同时发布specification(规格书)以及OpenXR的实现代码。目前只有Monado和微软能够发布一个可用的版本,这个感觉很酷。他们希望能继续在Monado里面增加更多OpenXR和XR硬件,希望在座诸位有兴趣的话能参与进来。
[I would like to thank the X.Org Foundation and LWN's travel sponsor, the Linux Foundation, for travel assistance to Montréal for XDC.]
全文完
LWN文章遵循CC BY-SA 4.0许可协议。
长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~