1. 简介
用于虚拟现实 (VR) 和增强现实 (AR) 应用的硬件现在已广泛面向消费者提供,为沉浸式计算平台带来了新的机遇和挑战。能够直接与沉浸式硬件交互对于确保 Web 能够成为该环境中的一等公民至关重要。WebXR 增强现实模块扩展了开发者在 AR 硬件上运行代码时可用的功能。
1.1. 术语
增强现实描述了一类 XR 体验,其中虚拟内容与现实环境对齐并组合后展示给用户。拥有加法光 显示技术(也称为“透视型”)的设备,使用透明光学显示器呈现虚拟内容。在这些设备上,用户通常无论在会话创建期间开发者如何请求,都能始终看到现实环境。
注意:此类设备通常不会使用软件进行合成,而是依靠透明显示器实现自然合成。
拥有透视型 显示技术的设备则使用不透明显示器,将虚拟内容与现实环境的摄像头画面结合。在这些设备上,只有当开发者在会话创建时明确请求,现实环境才会对用户可见。
注意:此类设备通常使用摄像头采集现实世界图像,并在软件中将 AR 场景与这些图像进行合成后展示给用户。
具有不透明型 显示技术的设备会完全遮挡现实环境,且不提供查看现实环境的方式。
注意:此类设备通常是 VR 设备,为 AR 内容提供兼容性路径而支持 "immersive-ar"
会话。
2. WebXR 设备 API 集成
2.1. XRSessionMode
如 WebXR 设备 API 所定义,依据 XRSession
的 XRSessionMode
对会话进行分类。
本模块支持 "immersive-ar"
XRSessionMode
枚举值。
会话模式 "immersive-ar" 表示会话输出将独占 沉浸式 XR 设备
显示器,并且内容将与 现实环境进行混合。
兼容硬件上,用户代理可支持 "immersive-vr"
会话、
"immersive-ar"
会话或二者兼有。增加对"immersive-ar"会话模式的支持,不改变必须支持"inline"会话的要求。
注意:这意味着 "immersive-ar"
会话支持与 "immersive-vr"
会话相同的功能和参考空间,因为两者都为沉浸式会话。
"immersive-ar"
会话。
navigator. xr. isSessionSupported( 'immersive-ar' ). then(( supported) => { if ( ! supported) { return ; } // 'immersive-ar' sessions are supported. // Page should advertise AR support to the user. }
"immersive-ar"
XRSession。
let xrSession; navigator. xr. requestSession( "immersive-ar" ). then(( session) => { xrSession= session; });
2.2. XREnvironmentBlendMode
绘制 XR 内容时,了解渲染像素如何被XR 合成器与现实环境进行混合很有用。enum {XREnvironmentBlendMode "opaque" ,"alpha-blend" ,"additive" };partial interface XRSession { // Attributesreadonly attribute XREnvironmentBlendMode environmentBlendMode ; };
environmentBlendMode 属性必须报告与当前混合技术相匹配的XREnvironmentBlendMode值。
-
若 XR 合成器使用alpha 混合环境,则必须报告
alpha-blend混合模式。
2.3. XRInteractionMode
有时应用需绘制用户可交互的 UI。WebXR 支持多种形态,包括手机 AR 和头戴式 AR。不同形态下,UI 应所在空间也不同,便于用户流畅交互。例如,手机 AR UI 通常直接绘制在屏幕上而不进行投影,而头戴式 AR 通常将 UI 绘制在离头部一定距离处,便于用户用控制器操作。
enum {XRInteractionMode ,"screen-space" , };"world-space" partial interface XRSession { // Attributesreadonly attribute XRInteractionMode interactionMode ; };
interactionMode 属性描述了当前会话下由用户代理推荐的最佳交互 UI 所在空间。
-
当
interactionMode为"screen-space",表示 UI 应直接绘制在屏幕,无需投影。此时通常以select事件, 其inputSource具备targetRayMode值"screen"触发。 -
当
interactionMode为"world-space",表示 UI 应绘制在空间中距离用户一定距离处,便于用控制器操作。此时以select事件, 其inputSource具备targetRayMode值"tracked-pointer"或"gaze"触发。
注意:如支持,可在部分情况使用 WebXR DOM Overlays 模块。
2.4. XR 合成器行为
向XR 设备呈现内容时,XR 合成器必须应用合适混合技术,将虚拟像素与现实环境结合。所用技术取决于XR 设备的显示技术和模式。
-
进行不透明环境混合时,XR 合成器获得的渲染缓冲区将在全黑不透明缓冲区上进行 source-over 混合,最终输出再呈现给XR 设备。该技术必须用于 不透明 和 透视 显示器,模式为
"immersive-vr"或"inline"。模式为"immersive-ar"时不得应用,无论设备显示类型。 -
进行alpha 混合环境时,XR 合成器获得的渲染缓冲区将在代表现实环境的像素缓冲区上进行 source-over 混合。这些像素需在每帧按照每视点的
transform对齐。最终输出展示于XR 设备。该技术必须用于 透视 显示器,模式为"immersive-ar"。模式为"immersive-vr"或"inline"时不得应用,无论设备类型。 -
进行加法环境混合时,XR 合成器获得的缓冲区将在展示前使用 lighter 混合。该技术必须用于 加法光 显示器,无论模式为何。
注意:如设备采用 alpha
混合环境,使用无 alpha 通道的 baseLayer
将完全遮挡 现实环境。应当假定这为开发者有意为之,用户代理可在此优化下暂停 现实环境混合。
XR 合成器可进一步调整颜色或像素以优化体验。合成时机不得依赖 混合技术或 现实环境来源,只能将渲染内容叠加于现实背景,不能依靠像素深度实现遮挡。
注意:未来模块可能支持基于现实环境的像素遮挡。
XR 合成器不得自动让页面访问任何附加信息,如相机参数、媒体流、现实世界几何等。
注意:开发者可通过 Media Capture and Streams 规范请求
XR 设备相机访问;但无法查询相机位置与 XRRigidTransform
之间的关系,也无法获得相机参数以匹配 现实环境视图。因此相关计算机视觉算法受限。未来模块或规范可能补充此类功能。
2.5. 第一人称观察视图
许多 AR 设备配备了摄像头,但摄像头通常与眼睛未对齐。进行会话录像或直播时,若直接将摄像头画面与其中一个渲染眼部画面合成,会存在内部偏移。设备可以采用重投影等方法修正流媒体,但有些设备会暴露次要视图,
即第一人称观察视图,该视图的眼睛为"none"。
站点内容必须显式允许通过启用 "secondary-views" 功能描述符 来接受第一人称观察视图。
为支持第一人称观察视图的会话启用 "secondary-views" 功能,不应导致每一帧都无条件暴露该第一人称观察视图,而是仅在录制时才会将该视图暴露在 views
数组内。
当 XRSession
具备 environmentBlendMode
属性暴露的混合技术时,第一人称观察视图始终采用alpha 混合环境。
站点内容可能希望获知哪一个视图是第一人称观察视图,以便根据不同混合技术采取渲染 UI 元素的措施。
对应第一人称观察视图的XRView
对象,其 isFirstPersonObserver
属性返回 true。
partial interface XRView {readonly attribute boolean ; };isFirstPersonObserver
-
在
requestSession()中将 `"secondary-views"` 作为可选功能添加 -
确保
views被遍历而不是仅访问前两个元素
let session= await navigator. xr. requestSession( "immersive-ar" , { optionalFeatures: [ "secondary-views" ]}); let space= await session. requestReferenceSpace( "local" ); // 进行其它初始化 let gl= /* 获取图形上下文 */ ; session. requestAnimationFrame( function ( frame) { let views= frame. getViewerPose( space); // 重要:此处应使用 `view of views`, // 不要直接索引前两个/三个元素 for ( viewof views) { render( session, gl, view); } }); function render( session, gl, view) { // 渲染内容到该视图 // 可根据 view.isFirstPersonObserver 判断是否区分组合信息 }
3. 隐私与安全性考量
AR 模块的实现不得将摄像头图像暴露给内容,而应通过 XR 合成器 自行处理与现实世界的合成。对此模块的后续扩展可以暴露真实世界信息(如原始摄像头帧或光照估算),但必须依赖需要用户同意的额外功能描述符。
与其扩展的 WebXR 设备 API 相比,AR 模块仅通过 environmentBlendMode
和 interactionMode
属性提供关于设备运行环境的更多信息;允许网站以 "immersive-ar"
模式启动 XR 会话,将现实世界与 XR 场景混合。
即使本模块不允许网站访问摄像头图像,但终端用户未必知晓,用户代理应予以说明。
变更内容
自2019年10月10日首次公开工作草案以来的变更
-
增加隐私与安全性考量 (GitHub #49, GitHub #63)
-
术语说明补充 (GitHub #63)
-
增加第一人称观察视图 (GitHub #57)
-
XRInteractionSpace 更名为 XRInteractionMode (GitHub #52)
-
增加 XRInteractionSpace (GitHub #50)
4. 致谢
下列人员为 WebXR 设备 API 规范的设计做出了贡献:
-
Sebastian Sylvan (曾供职于 Microsoft)
特别感谢 Vladimir Vukicevic (Unity),率先发起了这一冒险!