WebXR 层 API 第 1 级

W3C 工作草案,

关于此文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-webxrlayers-1-20260122/
最新发布版本:
https://www.w3.org/TR/webxrlayers-1/
编辑草案:
https://immersive-web.github.io/layers/
先前版本:
历史:
https://www.w3.org/standards/history/webxrlayers-1/
反馈:
GitHub
规范内嵌议题
编辑:
(Meta)
参与:
提交议题 (开放议题)
邮件列表归档
W3C 的 #immersive-web IRC

摘要

本规范描述了对 WebXR 会话中使用的各种层类型的支持。

本文档状态

本节描述的是本文档在发布时的状态。当前 W3C 出版物列表以及本 技术报告的最新修订版,可在 W3C 标准和草案索引中找到。

沉浸式 Web 工作组维护着一份 该组尚未处理的所有错误 报告列表。此草案突出了部分待处理议题,这些议题 仍需在工作组中讨论。对于这些议题的结果,包括其是否有效, 尚未作出决定。 强烈鼓励为未解决议题提交带有拟议规范文本的拉取请求。

本文档由沉浸式 Web 工作组作为工作草案发布,并使用 推荐标准 轨道。本文档预期成为 W3C 推荐标准。

作为工作草案发布并不意味着获得 W3C 及其成员的认可。本文档是草案文档,可能 随时被其他文档更新、替换或废弃。除作为进行中的工作外,不应引用本文档。

本文档由一个依据 W3C 专利政策运作的组制作。 W3C 维护着一份与该组交付物相关的任何 专利 披露的公开列表;该页面还包括 披露专利的说明。实际知晓某项专利,且该个人 认为该专利包含 必要 权利要求的个人,必须根据 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档约束。

1. 简介

本规范为 WebXR 规范添加对 `composition` 层的支持。层的优点如下:

1.1. 术语

1.2. 应用流程

如果作者想使用 GL 层,则必须执行以下步骤:

  1. 对于除 XRProjectionLayer 之外的任何层类型,通过 requiredFeaturesoptionalFeaturesrequestSession() 中请求支持。

  2. 创建一个 XRWebGLBindingXRMediaBinding

  3. 使用这些对象创建层。

  4. 将层添加到 XRRenderStateInit 并调用 updateRenderState()

  5. 在用于 webgl 层的 requestAnimationFrame() 期间,绘制每个 WebGL 层的内容。

2. 初始化

如果应用想在会话期间创建 XRProjectionLayer 类型之外的层, 则必须使用适当的特性 描述符来请求该会话。本模块引入字符串 "layers", 作为 WebXR Layers 特性的新的有效特性描述符

XRProjectionLayer 类型的层必须始终受支持,无论是否请求了该特性 描述符

以下代码将 layers 作为可选特性请求。
navigator.xr.requestSession('immersive-vr', {
    optionalFeatures: ['layers']
  }

层仅支持用于以 "immersive-vr""immersive-ar" 的 XRSessionMode 创建的 XRSession。 "inline" 会话不得支持层。

"layers" 特性 描述符有一个特性要求:当存在活动的沉浸式会话时,不能启用它。

注: 这意味着,使用 "layers" 执行 request(permissionDesc) API 不会 为当前活动会话启用层支持。

3. 层类型

3.1. 单目和立体层

立体层必须为每个视图提供一个 XRSubImage 以供渲染。

单目层必须提供一个单独的 XRSubImage, 该图像会显示给每个视图。

XR Compositor 必须确保层以正确的立体方式呈现给观察者。

3.2. XRLayerLayout

XRLayerLayout 枚举定义层的布局。
enum XRLayerLayout {
  "default",
  "mono",
  "stereo",
  "stereo-left-right",
  "stereo-top-bottom"
};

注: 如果使用 "default""stereo" XRLayerLayout 创建 XRCompositionLayer, 强烈建议 使用 "texture-array" 纹理类型来分配它。

注: "stereo-left-right""stereo-top-bottom" 布局旨在最大限度减少已经是立体的内容(例如立体视频或图像)的绘制 调用。不需要此类资源类型的体验 应使用 "default""stereo" 布局。

3.3. XRLayerQuality

XRLayerQuality 枚举定义层的显示质量。
enum XRLayerQuality {
  "default",
  "text-optimized",
  "graphics-optimized"
};

注: text-optimizedgraphics-optimized 标志可能会导致 XR Compositor 进行额外处理,这可能会影响性能。

3.4. XRCompositionLayer

XRCompositionLayer 定义一组在某些层类型之间共享的公共属性和行为。
[Exposed=Window] interface XRCompositionLayer : XRLayer {
  readonly attribute XRLayerLayout layout;

  attribute boolean blendTextureSourceAlpha;
  attribute boolean forceMonoPresentation;
  attribute float opacity;
  readonly attribute unsigned long mipLevels;
  attribute XRLayerQuality quality;

  readonly attribute boolean needsRedraw;

  undefined destroy();
};

layout 属性返回层的布局。

blendTextureSourceAlpha 属性 启用层的纹理 alpha 通道。

forceMonoPresentation 属性 强制右眼使用与左眼相同的层配置。这必须向 XR Compositor 发送信号,以 移除此 XRCompositionLayerstereo 效果。 在 mono 层上将其设置为 true 没有任何效果。

注: 此属性对 XRSession 返回的其他信息没有其他副作用。 只有 XR Compositor 的操作会受到此设置影响,体验应该 继续绘制到双眼。

opacity 属性设置应用于 层像素的不透明度。XR Compositor 必须 将每个像素(在预乘空间中)乘以此值。 opacity 默认为 1.0。将 opacity 设置为小于 0 的值会将其设置为 0,设置为大于 1.0 的值会将其设置为 1.0

needsRedraw 属性发出信号,表示 XRCompositionLayer 应该在下一个 XR 动画帧中 重新渲染。当层的底层资源 丢失,或当 XR Compositor 无法再重投影该层时,可以设置它。未能在下一个 XR 动画帧 中重绘内容可能会导致闪烁或其他副作用。

mipLevels 属性返回 mip 链的深度。这必须等于 或小于 mipLevels 中请求的值。

注: 某些平台不支持 mip 级别。作者 应查询 mipLevels 以确定是否可以 目标到某个 mip 级别,而不应依赖其传入 mipLevels 的值。

quality 属性设置并返回 XRCompositionLayer 的质量。 default 是初始值。

XRCompositionLayer layer层的底层资源丢失时, 用户代理必须运行以下步骤:
  1. layerneedsRedraw 设置为 true

  2. 如果 layer 不是 XRProjectionLayer, 则排队一个任务,以便在 layer 上使用 XRLayerEvent 触发 一个事件,该事件名为 redraw

destroy() 将删除底层附件。如果没有附件,则此函数不执行任何操作。

要使用 XRSession session 和一个可选的 WebGLRenderingContextWebGL2RenderingContext context 实例初始化合成层,用户代理必须运行以下步骤:

  1. this session 设置为 session

  2. 如果定义了 context,则将 this context 设置为 context

  3. this blendTextureSourceAlpha 设置为 true

  4. this opacity 设置为 1.0

调用 destroy() 时,用户代理必须运行以下步骤:

  1. this colorTextures 数组设置为空数组。

  2. this depthStencilTextures 数组设置为空数组。

  3. 销毁底层 GL 附件。

每个 XRCompositionLayer 都有一个 context 对象,它是 null,或者 WebGLRenderingContextWebGL2RenderingContext 的实例,还有一个 media 对象,它是 null 或 HTMLVideoElement 的实例。

每个 XRCompositionLayer 都有关联的 session,即 创建它时使用的 XRSession

当使用 XRSpace spaceXRCompositionLayer layer 设置 层上的空间时,用户代理必须运行以下步骤来验证 space 是否 有效:

  1. 如果 spacenull,则抛出 TypeError 并中止这些步骤。

  2. 如果 spacesession 不等于 layersession,则抛出 TypeError 并中止这些步骤。

XRCompositionLayer 有一个内部布尔值 isStatic,表示作者只能 在 needsRedrawtrue 时绘制 到此层。

注: 如果 isStatictrue,则作者只能在创建后绘制到该层一次,或在 redraw 事件之后绘制一次。这允许 UA 只分配一个 GPU 缓冲区。

当在 XRCompositionLayer 或其任何派生类上设置可写属性时, 读取该属性必须返回该值。 在 requestAnimationFrame() 回调结束时,该值必须发送到 底层 XR CompositorXR Compositor 必须 在下一次呈现传递给 requestAnimationFrame() 回调的 XRFrame 时应用该值。

注: 这意味着这些值必须在 XR Compositor 使用新的 XRFrame 重绘场景时应用, 即使与 XRCompositionLayer 关联的 colorTexture 或与媒体层关联的 videoframe 没有变化。如果 XR Compositor 使用先前 XRFrame 的 状态重绘场景,则不得使用新的 值。

3.5. XRProjectionLayer

XRProjectionLayer 是填满观察者整个视图的层。 投影层应以接近设备原生帧率的频率刷新。

投影层的表示

[Exposed=Window] interface XRProjectionLayer : XRCompositionLayer {
  readonly attribute unsigned long textureWidth;
  readonly attribute unsigned long textureHeight;
  readonly attribute unsigned long textureArrayLength;

  readonly attribute boolean ignoreDepthValues;
  attribute float? fixedFoveation;
  attribute XRRigidTransform? deltaPose;
};

textureWidth 属性返回 此层 colorTextures 纹理的 像素宽度。

textureHeight 属性返回 此层 colorTextures 纹理的 像素高度。

textureArrayLength 属性返回 此层 colorTextures 纹理的 层数,如果 XRProjectionLayer 是使用 textureType"texture-array" 初始化的。 否则它将返回 1

fixedFoveation 属性控制 XR Compositor 使用的注视点渲染量。如果用户代理或设备不支持此属性,它们 在获取时应返回 null,设置时应为 no-op。 将 fixedFoveation 设置为小于 0 的值会将其设置为 0,设置为 大于 1 的值会将其设置为 10 设置最小 注视点渲染量,而 1 设置最大值。XR Compositor 如何解释这些值由用户代理决定。 如果 fixedFoveation 级别已更改,它将在下一个 XRFrame 生效。

ignoreDepthValues 属性如果为 true,表示 XR Compositor 在渲染时不得使用深度缓冲附件中的值。当该 属性为 false 时,表示深度缓冲附件的内容将由 XR Compositor 使用,并且预期代表渲染到该层中的场景。

deltaPose 属性控制 XR Compositor 使用的注视点渲染量。如果用户代理或设备不支持此 属性,或者未请求 "space-warp" 特性 描述符,它们 在获取时应返回 null,设置时应为 no-op。此属性 描述自上一帧以来影响视图的 增量应用所施加变换(如果有)。当 人工移动发生时,体验会在帧之间将整个世界从一个应用姿态转换到另一个姿态, 并且 deltaPose 必须填充场景世界位置的差异。 当前一个和当前 XRFrame 之间没有变换时,deltaPose 应为恒等值。

3.6. XRQuadLayer

XRQuadLayer 渲染一个在虚拟环境中占据平面矩形空间的层。 只有层的正面必须可见;背面不得由 XR Compositor 绘制。

XRQuadLayer 没有厚度。它是一个在 3D 空间中定位和定向的二维对象。四边形的 位置 指的是四边形的中心。

四边形层的表示

[Exposed=Window] interface XRQuadLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float width;
  attribute float height;

  // Events
  attribute EventHandler onredraw;
};

transform 属性设置并返回相对于 space 属性的偏移和 方向。transformspace 属性 建立层在用户物理环境中的空间关系。 设置 space 时,首先运行设置层上的空间的步骤。

widthheight 属性 设置并返回层的宽度和高度,单位为米。

当使用 XRQuadLayerInit init初始化 XRQuadLayer layer 时,用户代理必须运行以下步骤:
  1. layerwidth 初始化为 initwidth

  2. layerheight 初始化为 initheight

  3. layerspaceinitspace

  4. 按如下方式初始化 layertransform

    如果设置了 inittransform
    layertransform 为在 layer相关 Realm新建XRRigidTransform, 并使用 inittransformpositionorientation 初始化。
    否则
    layertransform 为在 layer相关 Realm新建XRRigidTransform, 并使用 DOMPointInit position { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } 初始化。
  5. layerisStatic 初始化为 initisStatic

onredraw 属性是 redraw 事件类型的事件处理器 IDL 属性。

3.7. XRCylinderLayer

XRCylinderLayer 渲染一个在虚拟环境中占据弯曲矩形空间的层。 只有层的正面必须可见;背面不得由 XR Compositor 绘制。

圆柱层的表示

XRCylinderLayer 没有厚度。它是一个在 3D 空间中定位和定向的二维对象。 圆柱的 位置指的是四边形的中心。

[Exposed=Window] interface XRCylinderLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float radius;
  attribute float centralAngle;
  attribute float aspectRatio;

  // Events
  attribute EventHandler onredraw;
};

transform 属性设置并返回相对于 space 属性的偏移 和方向。transformspace 属性 建立层在用户物理环境中的空间关系。 设置 space 时,首先运行设置层上的空间的步骤。

radius 属性控制圆柱的 半径,单位为米。

centralAngle 属性控制圆柱可见部分的角度, 单位为弧度。 它围绕 0 角对称增长。

aspectRatio 属性控制 可见圆柱部分的比例。它是圆柱可见部分的宽度除以其 高度的比值。宽度通过将 radius 乘以 centralAngle 计算得出。

圆柱层参数的描述

当使用 XRCylinderLayerInit init初始化 XRCylinderLayer layer 时,用户代理必须运行以下步骤:
  1. layerradius 初始化为 initradius

  2. layercentralAngle 初始化为 initcentralAngle

  3. layeraspectRatio 初始化为 initaspectRatio

  4. layerspaceinitspace

  5. 按如下方式初始化 layertransform

    如果设置了 inittransform
    layertransform 为在 layer相关 Realm新建XRRigidTransform, 并使用 inittransformpositionorientation 初始化。
    否则
    layertransform 为在 layer相关 Realm新建XRRigidTransform, 并使用 DOMPointInit position { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } 初始化。
  6. layerisStatic 初始化为 initisStatic

onredraw 属性是 redraw 事件类型的事件处理器 IDL 属性。

3.8. XREquirectLayer

XREquirectLayer 渲染一个层,其中 XR Compositor 必须将等矩形编码数据映射到 球体内部。

等矩形层的表示

本节需要 澄清

[Exposed=Window] interface XREquirectLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float radius;
  attribute float centralHorizontalAngle;
  attribute float upperVerticalAngle;
  attribute float lowerVerticalAngle;

  // Events
  attribute EventHandler onredraw;
};

transform 属性设置并返回相对于 space 的偏移和方向。 transform 属性和 space 建立层在用户物理环境中的空间关系。

radius 属性是球体的非负半径,单位为米。 zeroinfinity 值被视为无限球体。

radius 设置为小于 0 的值会将其设置为 0

centralHorizontalAngleupperVerticalAnglelowerVerticalAngle 属性设置并 返回纹理如何映射到球体。

centralHorizontalAngle 设置为小于 0 的值会将其设置为 0,而设置为 大于 2π 的值会将其设置为 2π。

upperVerticalAnglelowerVerticalAngle 设置为小于 -π/2 的值会将其 设置为 -π/2,而设置为大于 π/2 的值会将其设置为 π/2。

等矩形层参数的描述

XRSpace 分配给 space 属性时,首先运行以下步骤。

当使用 XRSpace spaceXREquirectLayer layer 设置等矩形层上的空间时,用户代理必须运行以下步骤来验证 space 是否 有效:

  1. 如果 initspace 不是 XRReferenceSpace 类型的实例, 则抛出 TypeError 并中止这些步骤。

  2. 如果 initspace 具有 "viewer"type, 则抛出 TypeError 并中止这些步骤。

  3. 使用 spacelayer 运行设置层上的空间

当使用 XREquirectLayerInit init初始化 XREquirectLayer layer 时,用户代理必须运行以下步骤:
  1. layerradius 初始化为 initradius

  2. layercentralHorizontalAngle 初始化为 initcentralHorizontalAngle

  3. layerupperVerticalAngle 初始化为 initupperVerticalAngle

  4. layerlowerVerticalAngle 初始化为 initlowerVerticalAngle

  5. layerspaceinitspace

  6. 按如下方式初始化 layertransform

    如果设置了 inittransform
    layertransform 为在 layer相关 Realm新建XRRigidTransform, 并使用 inittransformpositionorientation 初始化。
    否则
    layertransform 为在 layer相关 Realm新建XRRigidTransform
  7. layerisStatic 初始化为 initisStatic

onredraw 属性是 redraw 事件类型的事件处理器 IDL 属性。

3.9. XRCubeLayer

XRCubeLayer 渲染一个层,其中 XR Compositor 直接从立方体贴图进行渲染。

立方体层的表示

本节需要 澄清

[Exposed=Window] interface XRCubeLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute DOMPointReadOnly orientation;

  // Events
  attribute EventHandler onredraw;
};

orientation 属性设置并返回相对于 space 属性的方向。orientationspace 属性 建立层在用户物理环境中的空间关系。 放置 XRCubeLayer 时,仅考虑 space 的方向。立方体层将始终以 视点位于中心的方式渲染。

XRSpace 分配给 space 属性时,首先运行以下步骤。

当使用 XRSpace spaceXRCubeLayer layer 设置立方体层上的空间时,用户代理必须运行以下步骤来验证 space 是否 有效:

  1. 如果 initspace 不是 XRReferenceSpace 类型的实例, 则抛出 TypeError 并中止这些步骤。

  2. 如果 initspace 具有 "viewer"type, 则抛出 TypeError 并中止这些步骤。

  3. 使用 spacelayer 运行设置层上的空间

onredraw 属性是 redraw 事件类型的事件处理器 IDL 属性。

4. 空间

XRProjectionLayerXRWebGLLayer 没有关联的 XRSpace, 因为它们渲染到完整帧。

XRCubeLayerXREquirectLayer 必须仅支持非 "viewer" 类型的 XRReferenceSpaces

XRQuadLayerXRCylinderLayer 必须支持所有 XRSpace 类型。

通常,开发者不应使用 "viewer" 空间来稳定层,因为这几乎总会破坏位置或 旋转重投影,并导致渲染内容相对于世界的稳定性下降。 例外是一些小型 UI 元素, 例如凝视光标或瞄准标线。

以下是与层类型一起使用的空间的一些最佳实践:

5. 渲染

5.1. XRSubImage

XRSubImage 对象表示要使用 GPU 纹理的哪个视口。
[Exposed=Window] interface XRSubImage {
  [SameObject] readonly attribute XRViewport viewport;
};

注: 此类旨在适应未来的 扩展

viewport 属性返回在渲染子图像时要使用的 XRViewport

5.2. XRWebGLSubImage

XRWebGLSubImage 对象在层的渲染期间使用。
[Exposed=Window] interface XRWebGLSubImage : XRSubImage {
  [SameObject] readonly attribute WebGLTexture colorTexture;
  [SameObject] readonly attribute WebGLTexture? depthStencilTexture;
  [SameObject] readonly attribute WebGLTexture? motionVectorTexture;

  readonly attribute unsigned long? imageIndex;
  readonly attribute unsigned long colorTextureWidth;
  readonly attribute unsigned long colorTextureHeight;
  readonly attribute unsigned long? depthStencilTextureWidth;
  readonly attribute unsigned long? depthStencilTextureHeight;
  readonly attribute unsigned long? motionVectorTextureWidth;
  readonly attribute unsigned long? motionVectorTextureHeight;
};

colorTexture 属性返回 XRCompositionLayer 的颜色不透明纹理

depthStencilTexture 属性返回 XRCompositionLayer 的深度/模板不透明 纹理。 如果该层创建时没有深度/模板,则此属性返回 null。

motionVectorTexture 属性返回 XRProjectionLayer 的运动不透明纹理。 如果 XRSession 是在没有 space-warp 特性 描述符的情况下创建的,或者该层不是 XRProjectionLayer, 则此属性必须返回 null。

imageIndex 属性返回 纹理数组中的偏移量。仅对使用 texture-array 请求的层有效。

colorTextureWidthdepthStencilTextureHeight 属性 返回 GL 深度附件的像素宽度和高度

depthStencilTextureWidthcolorTextureHeight 属性 返回 GL 颜色附件的像素宽度和高度。如果该层创建时没有 深度/模板,则此属性返回 null。

motionVectorTextureWidthmotionVectorTextureHeight 属性 返回 GL 运动向量附件的像素宽度和高度。 如果 XRSession 是在没有 space-warp 特性 描述符的情况下创建的,或者该层不是 XRProjectionLayer, 则这些属性必须返回 null。

5.3. XRTextureType

XRTextureType 枚举定义分配何种类型的纹理。
enum XRTextureType {
  "texture",
  "texture-array"
};

6. GPU 层和视图创建

6.1. 概述

创建层时,它由 GPU 资源(通常是纹理)作为后备,该资源由 Web 平台的图形 API 之一提供。为了 指定哪个 API 提供层的 GPU 资源,必须为相关 API 创建一个 XRWebGLBinding。 每个图形 API 可能都有独特的要求,必须先满足这些要求,才能使用上下文来 创建层。例如, 在将 WebGLRenderingContext 传递给 XRWebGLBinding 实例的构造函数之前,必须设置其 xrCompatible 标志。

XRSession 与图形 API 之间的任何交互(例如分配或检索纹理)都将通过此 XRWebGLBinding 实例进行,并且该交互的具体机制 通常是 API 特定的。这使得 WebXR API 的其余部分能够与 图形 API 无关,并更容易适应未来渲染技术的进步。

获得 XRWebGLBinding 实例后,可使用它创建多种 XRCompositionLayer。 由该实例创建的任何层随后都能够 每帧查询关联的 GPU 资源,通常预期为原生 API 的纹理 接口。

各种层类型是通过 XRWebGLBinding 实例上的 create____Layer 系列方法创建的。有关所需图形资源的信息, 例如是否分配深度缓冲区或 alpha 通道,会在层创建时传入, 并且在层的生命周期内不可变。 该方法将返回关联的 XRCompositionLayer 类型。

如果 XRSession 是使用 "layers" 特性 描述符创建的,则它必须支持所有层类型。 如果某个层类型不受支持,则其创建方法必须抛出异常。XRProjectionLayer 必须受到所有 XRSession 支持, 无论它是否使用了 "layers" 特性 描述符创建。

6.2. 不透明纹理

使用 WebXR GPU 层时,XRWebGLBinding 对象会为颜色和深度/模板附件返回不透明纹理的实例。

不透明纹理的功能 与标准 WebGLTexture 相同,但有以下变化:

在每个 XR 动画帧中,当 clearOnAccesstrue 时, 附加到不透明 纹理的缓冲区必须在处理第一次调用 getViewSubImage()getSubImage() 期间清除为下表中的值。 如果 clearOnAccessfalse,则附加到不透明纹理的缓冲区必须在首次访问时清除。 后续帧中的后续访问可以不清除缓冲区。

缓冲区 清除值
颜色 (0, 0, 0, 0)
深度 1.0
模板 0

如果不透明纹理 是使用 2 个或更多 mipLevels 创建的,则作者应该填充所有 mip 级别。用户代理不得假定它应该创建这些 mip 级别。

注: 不透明纹理是在使用 分配颜色 纹理分配深度纹理算法构造层时分配的。这种 预分配的副作用是,使用相同参数调用 getSubImage()getViewSubImage() 将始终返回相同的纹理对象。

注: 不允许更改不透明纹理的尺寸或格式。GL 命令 只能更改纹素值和纹理参数。将以下任何 命令用于 WebGLTexture 都会导致生成 INVALID_OPERATION 错误, 即使它不影响尺寸或格式:TexImage*、CompressedTexImage*、 CopyTexImage* 和 TexStorage*。 OpenGL ES 3.0 规范中的 "Immutable-Format Texture Images" 一节更详细地定义了这些限制。

层的资源(例如内存)分配必须通过与 WebGL 相同的机制完成。

如果 XRLayer 是使用 RGBARGB colorFormat 分配的, 则其 colorTextures 必须 作为 RGBARGB 暴露给 WebGLRenderingContext 上下文。 但是,XR Compositor 必须将 colorTextures 的像素视为处于 SRGB8_ALPHA8SRGB8 colorFormat 中一样。

注: 这意味着当 XR Compositor 处理 colorTextures 时,不得从线性 RGBARGB 进行任何 gamma 转换。否则,最终渲染中的像素会显得 过亮,这将与常规 2D WebGLRenderingContext 上下文中的渲染不匹配。

6.3. XRProjectionLayerInit

XRProjectionLayerInit 字典表示一组可配置值,这些值描述如何初始化 XRProjectionLayer
dictionary XRProjectionLayerInit {
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum depthFormat = 0x1902; // DEPTH_COMPONENT
  double scaleFactor = 1.0;
  boolean clearOnAccess = true;
};

textureType 属性定义 层将具有的纹理类型。

colorFormat 属性定义 颜色纹理数据的数据类型。

这是 XR Compositor 必须支持的投影层颜色格式列表

对于 WebGL2 上下文,还支持以下附加格式:

depthFormat 属性定义 深度纹理数据的数据类型。 如果 depthFormat0,则该层不会提供深度/模板纹理。

这是 XR Compositor 必须支持的投影层深度格式列表

对于启用了 'WEBGL_depth_texture' 扩展WebGLRenderingContext 上下文或 WebGL2 上下文:

如果该扩展未启用,则会忽略对深度纹理的请求。

注: 这可能会令作者困惑,因为他们 可能期望获得深度纹理。如果可能,请提供一条警告,说明未 创建该纹理的原因。

对于 WebGL2RenderingContext 上下文,支持以下附加格式:

scaleFactor 属性定义 session推荐 WebGL 帧缓冲区分辨率必须乘以的值,以确定层附件的分辨率。

clearOnAccess 属性 定义与此层关联的纹理应在初始帧中清除,还是在每一帧中清除。

注: XRProjectionLayerInit 字典不支持像 XRLayerInit 那样配置 mipLevels。 如果用户代理想支持投影层上的 mipmapping,则它可以自由分配带有 mips 的纹理。 在这种情况下,用户代理(而不是作者)负责生成所有 mip 级别。

6.4. XRLayerInit

XRLayerInit 字典表示一组通用可配置值,用于 XRQuadLayerXRCylinderLayerXREquirectLayerXRCubeLayer
dictionary XRLayerInit {
  required XRSpace space;
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum? depthFormat;
  unsigned long mipLevels = 1;
  required unsigned long viewPixelWidth;
  required unsigned long viewPixelHeight;
  XRLayerLayout layout = "mono";
  boolean isStatic = false;
  boolean clearOnAccess = true;
};

space 属性定义与 用户物理环境的空间关系。

textureType 属性定义层的 纹理类型。XR Compositor 必须支持:

对于 WebGL2RenderingContext, 还支持这些附加类型:

colorFormat 属性定义 颜色纹理数据的数据类型。

这是 XR Compositor 必须支持的非投影 层颜色格式列表

对于 WebGL2 上下文,还支持以下附加格式:

对于启用了 'WEBGL_compressed_texture_etc' 扩展的上下文,支持以下附加格式:

对于启用了 'WEBGL_compressed_texture_astc' 扩展的上下文,支持该扩展的所有格式。

depthFormat 属性定义 深度纹理数据的数据类型。 如果未提供 depthFormat, 则该层不会提供深度/模板纹理。

这是 XR Compositor 必须支持的非投影 层深度格式列表

对于启用了 'WEBGL_depth_texture' 扩展WebGLRenderingContext 上下文或 WebGL2 上下文:

对于 WebGL2RenderingContext 上下文,支持以下附加格式:

mipLevels 属性定义颜色和纹理数据中期望的 mip 级别数量。 如果用户代理无法创建请求的数量,则可以创建更少的数量。作者必须查询 mipLevels 以确定 实际的 mip 级别数量。

viewPixelWidthviewPixelHeight 属性定义 XRCompositionLayer 的矩形尺寸。

layout 属性定义层的布局。

clearOnAccess 属性定义与此层 关联的纹理应在初始帧中清除,还是在每一帧中清除。

6.5. XRQuadLayerInit

XRQuadLayerInit 字典表示一组可配置值,这些值描述如何初始化 XRQuadLayer

dictionary XRQuadLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float width = 1.0;
  float height = 1.0;
};

6.6. XRCylinderLayerInit

XRCylinderLayerInit 字典表示一组可配置值,这些值描述如何初始化 XRCylinderLayer

dictionary XRCylinderLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float radius = 2.0;
  float centralAngle = 0.78539;
  float aspectRatio = 2.0;
};

centralAngle 的默认值为 π / 4。

6.7. XREquirectLayerInit

XREquirectLayerInit 字典表示一组可配置值,这些值描述如何初始化 XREquirectLayer

dictionary XREquirectLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float radius = 0;
  float centralHorizontalAngle = 6.28318;
  float upperVerticalAngle = 1.570795;
  float lowerVerticalAngle = -1.570795;
};

centralHorizontalAngle 的默认值为 2π。 upperVerticalAngle 的默认值为 π/2。 lowerVerticalAngle 的默认值为 -π/2。

6.8. XRCubeLayerInit

XRCubeLayerInit 字典表示一组可配置值,这些值描述如何初始化 XRCubeLayer

dictionary XRCubeLayerInit : XRLayerInit {
  DOMPointReadOnly? orientation;
};

6.9. XRWebGLBinding

XRWebGLBinding 对象用于创建具有 GPU 后端的层。
[Exposed=Window] interface XRWebGLBinding {
  constructor(XRSession session, XRWebGLRenderingContext context);

  readonly attribute double nativeProjectionScaleFactor;
  readonly attribute boolean usesDepthValues;

  XRProjectionLayer createProjectionLayer(optional XRProjectionLayerInit init = {});
  XRQuadLayer createQuadLayer(optional XRQuadLayerInit init = {});
  XRCylinderLayer createCylinderLayer(optional XRCylinderLayerInit init = {});
  XREquirectLayer createEquirectLayer(optional XREquirectLayerInit init = {});
  XRCubeLayer createCubeLayer(optional XRCubeLayerInit init = {});

  XRWebGLSubImage getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none");
  XRWebGLSubImage getViewSubImage(XRProjectionLayer layer, XRView view);

  undefined foveateBoundTexture(GLenum target, float fixed_foveation);
};

init 字典 不应是可选的。这是 bikeshed 议题 1566。

每个 XRWebGLBinding 都有一个类型为 XRWebGLRenderingContextcontext 对象,该对象是 WebGLRenderingContextWebGL2RenderingContext 的实例。

每个 XRWebGLBinding 都有关联的 session,即 创建它时使用的 XRSession

每个 XRWebGLBinding 都有一个内部 WeakSet foveatedTextures,其中保存 在调用 foveateBoundTexture 时绑定到指定目标的纹理的弱引用。

注: 可以创建多个 XRWebGLBinding。 使用某个 XRWebGLBinding 实例创建的任何层, 只要二者是使用相同的 session 和相同的 context 创建的, 就可以与另一个 XRWebGLBinding 实例一起使用。层或 XRWebGLSubImage 实例的生命周期并不绑定到创建它们的 XRWebGLBinding 的生命周期。

每个通过 XRWebGLBinding 创建的 XRCompositionLayer 都有一个内部 colorTextures 数组,它是一个由用于颜色纹理的 WebGLTextures 组成的 array; 一个内部 depthStencilTextures,它是一个由用于 深度/模板纹理的不透明纹理组成的 array;以及 一个内部 motionVectorTextures,它是一个由用于运动 纹理的不透明纹理组成的 array

每个通过 XRWebGLBinding 创建的 XRProjectionLayer 都有一个内部 colorTextures for secondary views 数组,它是一个由用于颜色纹理的不透明纹理组成的 array;以及一个内部 depthStencilTextures for secondary views 数组,它是一个由用于渲染辅助视图的深度/模板纹理的不透明纹理组成的 array

XRWebGLBinding(session, context) 构造函数在被调用时必须执行以下步骤:

  1. binding 为在 session相关 Realm新建XRWebGLBinding

  2. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  3. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  4. 如果 session 不是沉浸式会话,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 contextXR compatible 布尔值为 false,则抛出 InvalidStateError 并中止这些步骤。

  6. bindingcontext 初始化为 context

  7. bindingsession 初始化为 session

  8. binding 添加到 sessionbindings

  9. 返回 binding

nativeProjectionScaleFactor 函数返回一个值,session推荐 WebGL 帧缓冲区分辨率 必须乘以该值,才能得到 session原生 WebGL 帧缓冲区分辨率

如果尺寸导致布局变化, 则需要特殊处理 UA 行为(即,如果请求的宽度超过 "stereo-left-right" 的限制)

usesDepthValues 属性如果为 false,表示如果存在深度缓冲附件, XR Compositor 不得使用其中的值。当该属性 为 true 时,表示深度缓冲附件的内容将由 XR Compositor 使用,并且预期代表渲染到该层中的场景。

要使用 XRTextureType textureTypeXRWebGLRenderingContext contextXRLayerLayout layout 确定 layout 属性,用户代理必须运行以下步骤:

  1. 如果 context 不是 WebGL2RenderingContext, 且 textureType"texture-array", 则抛出 TypeError 并中止这些步骤。

  2. 如果 textureType"texture-array", 且会话视图列表中的所有视图并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出 NotSupportedError 并中止这些步骤。

  3. 如果 layout"mono", 返回 layout 并中止这些步骤。

  4. 如果 layout"default", 则运行以下步骤:

    1. 如果视图列表的大小为 1,则返回 "mono" 并中止这些步骤。

    2. 如果 textureType"texture-array", 返回 layout 并中止这些步骤。

  5. 如果 layout"default""stereo", 且 textureType"texture", 则运行以下步骤:

    1. 如果用户代理偏好 "stereo-left-right" 布局,则返回 "stereo-left-right" 并中止这些步骤。

    2. 如果用户代理偏好 "stereo-top-bottom" 布局,则返回 "stereo-top-bottom" 并中止这些步骤。

  6. 返回 layout

要使用 XRSession sessionXRWebGLRenderingContext contextXRLayerLayout layout 确定最大 scalefactor,用户代理必须运行以下步骤:

  1. largest width 为来自 session视图列表中(不包括辅助视图推荐 WebGL 颜色纹理 分辨率的最大宽度。

  2. largest height 为来自 session视图列表中(不包括辅助视图推荐 WebGL 颜色纹理 分辨率的最大高度。

  3. 如果 layout"stereo-left-right" 布局,则将 largest width 乘以 2

  4. 如果 layout"stereo-top-bottom" 布局,则将 largest height 乘以 2

  5. largest view dimensionlargest widthlargest height 中较大的那个。

  6. largest texture dimension 为由 context 创建的 WebGLTexture 的最大尺寸。

  7. 返回 largest texture dimension 除以 largest view dimension

要使用 XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat 和 float scaleFactor 为投影层分配颜色纹理, 用户代理必须运行以下步骤:

  1. array 为在 context相关 Realm新建的数组。

  2. contextlayercontext

  3. sessionlayersession

  4. numViewssession视图列表中排除辅助视图后的数量。

  5. viewsession视图列表中第一个不是辅助视图的条目。

  6. widthview推荐 WebGL 颜色纹理 分辨率的宽度乘以 scaleFactor

  7. heightview推荐 WebGL 颜色纹理 分辨率的高度乘以 scaleFactor

  8. 如果 textureFormat 不在投影层颜色格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  9. 如果 layerlayout"mono""default"

    如果 textureType"texture-array"
    如果会话视图列表中的视图(不包括辅助视图)并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出 NotSupportedError 并中止这些步骤。
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array,该实例创建为一个使用 contexttextureFormatwidthheight、具有 numViews 层的 TEXTURE_2D_ARRAY 纹理。
    如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。
    返回 array 并中止这些步骤。
    否则
    session视图列表中的每个 view
    1. 如果 view辅助视图,则继续。

    2. widthview推荐 WebGL 颜色纹理分辨率的宽度乘以 scaleFactor

    3. heightview推荐 WebGL 颜色纹理分辨率的高度乘以 scaleFactor

    4. texture 为在 context相关 Realm新建不透明纹理实例,该实例创建为一个 使用 contexttextureFormatwidthheightTEXTURE_2D 纹理。

    5. 如果出于任何原因无法创建 texture,则抛出 OperationError 并中止这些步骤。

    6. texture 追加到 array

    返回 array 并中止这些步骤。
  10. 如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出 NotSupportedError 并中止这些步骤。

  11. 如果 layerlayoutstereo-left-right, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contexttextureFormatnumViews 乘以 widthheighttextureType 纹理。

  12. 如果 layerlayoutstereo-top-bottom, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contexttextureFormatwidthnumViews 乘以 heighttextureType 纹理。

  13. 如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。

  14. 返回 array

要使用 XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat 和 float scaleFactor 为投影层分配深度纹理, 用户代理必须运行以下步骤:

  1. array 为在 context相关 Realm新建的数组。

  2. contextlayercontext

  3. sessionlayersession

  4. 如果 textureFormat0,则返回 array 并中止这些步骤。

  5. 如果 contextWebGLRenderingContext, 且 WEBGL_depth_texture 扩展未在 context 中启用,则返回 array 并中止这些步骤。

  6. 如果 textureFormat 不在投影层深度格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  7. numViewssession视图列表中排除辅助视图后的数量。

  8. viewsession视图列表中第一个不是辅助视图的条目。

  9. widthview推荐 WebGL 深度纹理 分辨率的宽度乘以 scaleFactor

  10. heightview推荐 WebGL 深度纹理 分辨率的高度乘以 scaleFactor

  11. 如果 layerlayout"mono""default"

    如果 textureType"texture-array"
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array,该实例创建为一个使用 contexttextureFormatstencilwidthheight、具有 numViews 层的 TEXTURE_2D_ARRAY 纹理。
    如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。
    返回 array 并中止这些步骤。
    否则
    session视图列表中的每个 view
    1. 如果 view辅助视图,则继续。

    2. widthview推荐 WebGL 深度纹理分辨率的宽度乘以 scaleFactor

    3. heightview推荐 WebGL 深度纹理分辨率的高度乘以 scaleFactor

    4. texture 为在 context相关 Realm新建不透明纹理实例,该实例创建为一个 使用 contexttextureFormatstencilwidthheightTEXTURE_2D 纹理。

    5. 如果出于任何原因无法创建 texture,则抛出 OperationError 并中止这些步骤。

    6. texture 追加到 array

    返回 array 并中止这些步骤。
  12. 如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出 NotSupportedError 并中止这些步骤。

  13. 如果 layerlayoutstereo-left-right, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contexttextureFormatstencilnumViews 乘以 widthheighttextureType 纹理。

  14. 如果 layerlayoutstereo-top-bottom, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contexttextureFormatstencilwidthnumViews 乘以 heighttextureType 纹理。

  15. 如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。

  16. 返回 array

要使用 XRProjectionLayer layer为投影层分配运动向量纹理, 用户代理必须运行以下步骤:

  1. array 为在 context相关 Realm新建的数组。

  2. contextlayercontext

  3. sessionlayersession

  4. 如果 session 不是使用 "space-warp" 特性描述符创建的,则返回 array 并中止 这些步骤。

  5. 如果 contextWebGLRenderingContext, 且 WEBGL_depth_texture 扩展未在 context 中启用,则返回 array 并中止这些步骤。

  6. numViewssession视图列表中排除辅助视图后的数量。

  7. viewsession视图列表中第一个不是辅助视图的条目。

  8. widthview推荐运动向量纹理 分辨率的宽度乘以 scaleFactor

  9. heightview推荐运动向量纹理 分辨率的高度乘以 scaleFactor

  10. 如果 layerlayout"mono""default"

    如果 textureType"texture-array"
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array,该实例创建为一个使用 contextRGBA16Fwidthheight、具有 numViews 层的 TEXTURE_2D_ARRAY 纹理。
    如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。
    返回 array 并中止这些步骤。
    否则
    session视图列表中的每个 view
    1. 如果 view辅助视图,则继续。

    2. widthview推荐 运动向量纹理分辨率的宽度乘以 scaleFactor

    3. heightview推荐 运动向量纹理分辨率的高度乘以 scaleFactor

    4. texture 为在 context相关 Realm新建不透明纹理实例,该实例创建为一个 使用 contextRGBA16FwidthheightTEXTURE_2D 纹理。

    5. 如果出于任何原因无法创建 texture,则抛出 OperationError 并中止这些步骤。

    6. texture 追加到 array

    返回 array 并中止这些步骤。
  11. 如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐运动向量纹理 分辨率,则抛出 NotSupportedError 并中止这些步骤。

  12. 如果 layerlayoutstereo-left-right, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextRGBA16FnumViews 乘以 widthheighttextureType 纹理。

  13. 如果 layerlayoutstereo-top-bottom, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextRGBA16FwidthnumViews 乘以 heighttextureType 纹理。

  14. 如果出于任何原因无法创建该不透明 纹理,则抛出 OperationError 并中止这些步骤。

  15. 返回 array

要使用 XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat 和 float scaleFactor为辅助视图分配颜色纹理, 用户代理必须运行以下步骤:

  1. contextlayercontext

  2. sessionlayersession

  3. array 为在 context相关 Realm新建的数组。

  4. 如果 textureFormat 不在投影层颜色格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  5. session视图列表中的每个 view

    1. 如果 view 不是辅助视图,则继续。

    2. widthview推荐 WebGL 颜色 纹理分辨率的宽度乘以 scaleFactor

    3. heightview推荐 WebGL 颜色 纹理分辨率的高度乘以 scaleFactor

    4. 按如下方式初始化 texture

      如果 textureType"texture-array"
      texture 为在 context相关 Realm新建不透明纹理实例, 该实例创建为一个使用 contexttextureFormatwidthheightTEXTURE_2D_ARRAY 纹理。
      否则
      texture 为在 context相关 Realm新建不透明纹理实例, 该实例创建为一个使用 contexttextureFormatwidthheightTEXTURE_2D 纹理。
    5. 如果出于任何原因无法创建 texture,则抛出 OperationError 并中止这些步骤。

    6. texture 追加到 array

  6. 返回 array 并中止这些步骤。

要使用 XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat 和 float scaleFactor为辅助视图分配深度纹理, 用户代理必须运行以下步骤:

  1. contextlayercontext

  2. sessionlayersession

  3. 如果 textureFormat0,则返回 array 并中止这些步骤。

  4. 如果 contextWebGLRenderingContext, 且 WEBGL_depth_texture 扩展未在 context 中启用,则返回 array 并中止这些步骤。

  5. 如果 textureFormat 不在投影层深度格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  6. array 为在 context相关 Realm新建的数组。

  7. session视图列表中的每个 view

    1. 如果 view 不是辅助视图,则继续。

    2. widthview推荐 WebGL 深度 纹理分辨率的宽度乘以 scaleFactor

    3. heightview推荐 WebGL 深度 纹理分辨率的高度乘以 scaleFactor

    4. 按如下方式初始化 texture

      如果 textureType"texture-array"
      texture 为在 context相关 Realm新建不透明纹理实例, 该实例创建为一个使用 contexttextureFormatstencilwidthheightTEXTURE_2D_ARRAY 纹理。
      否则
      texture 为在 context相关 Realm新建不透明纹理实例, 该实例创建为一个使用 contexttextureFormatstencilwidthheightTEXTURE_2D 纹理。
    5. texture 追加到 array

  8. 返回 array 并中止这些步骤。

需要为 辅助视图重新计算 scaleFactor。

要使用 XRCompositionLayer layerXRTextureType textureTypeXRLayerInit init分配颜色 纹理,用户代理必须运行以下步骤:

  1. array 为在 context相关 Realm新建的数组。

  2. contextlayercontext

  3. 如果 initcolorFormat 不在非投影层颜色格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  4. 如果 initmipLevels 小于 1,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 initmipLevels 大于 1,且 viewPixelWidthviewPixelHeight 不是 2 的幂,则抛出 InvalidStateError 并中止这些步骤

  6. 如果 layerlayout"mono"

    如果 textureType"texture-array"
    使用 1 个在 this context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 1 个内部纹理的 TEXTURE_2D_ARRAY 纹理。
    否则
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值的 TEXTURE_2D 纹理。
  7. 如果 layerlayout"stereo"

    如果 textureType"texture-array"
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 2 层的 TEXTURE_2D_ARRAY 纹理。
    返回 array 并中止这些步骤。
    否则
    使用 2 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值的 TEXTURE_2D 纹理。
    返回 array 并中止这些步骤。
  8. 如果 layerlayoutstereo-left-right, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidth 的两倍和 viewPixelHeight 值的 textureType 纹理。

  9. 如果 layerlayoutstereo-top-bottom, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 的两倍值的 textureType 纹理。

  10. 返回 array

要使用 XRCompositionLayer layerXRTextureType textureTypeXRLayerInit init分配深度 纹理,用户代理必须运行以下步骤:

  1. array 为在 context相关 Realm新建的数组。

  2. contextlayercontext

  3. 如果未设置 initdepthFormat, 则返回 array 并中止这些步骤。

  4. 如果 initdepthFormat 不在非投影层深度格式列表中, 则抛出 NotSupportedError 并中止这些步骤。

  5. 如果 initmipLevels 小于 1,则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 initmipLevels 大于 1,且 viewPixelWidthviewPixelHeight 不是 2 的幂,则抛出 InvalidStateError 并中止这些步骤。

  7. 如果 layerlayout"mono"

    如果 textureType"texture-array"
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 1 个内部纹理的 TEXTURE_2D_ARRAY 纹理。
    否则
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值的 TEXTURE_2D 纹理。
  8. 如果 layerlayout"stereo"

    如果 textureType"texture-array"
    使用 1 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 2 层的 TEXTURE_2D_ARRAY 纹理。
    返回 array 并中止这些步骤。
    否则
    使用 2 个在 context相关 Realm新建不透明 纹理实例初始化 array, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值的 TEXTURE_2D 纹理。
    返回 array 并中止这些步骤。
  9. 如果 layerlayoutstereo-left-right, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidth 的两倍和 viewPixelHeight 值的 textureType 纹理。

  10. 如果 layerlayoutstereo-top-bottom, 则使用 1 个在 context相关 Realm新建不透明纹理 实例初始化 array,该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 的两倍值的 textureType 纹理。

  11. 返回 array

createProjectionLayer(optional XRProjectionLayerInit init) 方法创建一个新的 XRProjectionLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. contextthiscontext

  3. layer 为在 this相关 Realm新建XRProjectionLayer

  4. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  6. 使用 sessioncontextlayer 上运行初始化合成层

  7. layerisStatic 初始化为 false

  8. 按如下方式初始化 layerignoreDepthValues

    如果 initdepthFormatfalse,并且 XR Compositor 将使用深度值
    layerignoreDepthValues 初始化为 false
    否则
    layerignoreDepthValues 初始化为 true
  9. layerfixedFoveation 初始化为 0

  10. layout 为使用 inittextureTypecontext"default" 确定 layout 属性的结果。

  11. maximum scalefactor 为使用 sessioncontextlayout 确定最大 scalefactor的结果。

  12. 如果 scaleFactor 大于 maximum scalefactor,则将 scaleFactor 设置为 maximum scalefactor

  13. layerlayout 初始化为 layout

  14. layerneedsRedraw 初始化为 true

  15. layercolorTextures 为使用 layerinittextureTypeinitcolorFormatinitscaleFactor 为投影层分配颜色纹理的结果。

  16. layerdepthStencilTextures 为使用 layerinittextureTypeinitdepthFormatinitscaleFactor 为投影层分配深度纹理的结果。

  17. layermotionVectorTextures 为使用 layerinitdepthFormatinitscaleFactor 为投影层分配运动向量 纹理的结果。

  18. 按如下方式初始化 辅助视图的 colortextures

    如果 session 是在启用 "secondary-views" 的情况下创建的
    辅助视图的 colortextures为使用 layerinittextureTypeinitcolorFormatinitscaleFactor 为辅助视图分配颜色 纹理的结果。
    否则
    辅助视图的 colortexturesnull
  19. 按如下方式初始化 辅助视图的 depthstenciltextures

    如果 session 是在启用 "secondary-views" 的情况下创建的
    辅助视图的 depthstenciltextures为使用 layerinittextureTypeinitdepthFormatinitscaleFactor 为辅助视图分配深度 纹理的结果。
    否则
    辅助视图的 depthstenciltexturesnull
  20. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  21. 返回 layer

createQuadLayer(XRQuadLayerInit init) 方法创建一个新的 XRQuadLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下 创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. contextthiscontext

  4. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 layout"default", 则抛出 TypeError 并中止这些步骤。

  7. layer 为在 this相关 Realm新建XRQuadLayer

  8. 使用 sessioncontextlayer 上运行初始化合成层

  9. 使用 layerinit 运行初始化四边形层

  10. layout 为使用 inittextureTypecontextinitlayout 确定 layout 属性的结果。

  11. layerlayout 初始化为 layout

  12. layerneedsRedraw 初始化为 true

  13. layercolorTextures 为使用 layerinittextureTypeinit 分配颜色 纹理的结果。

  14. layerdepthStencilTextures 为使用 layerinittextureTypeinit 分配深度纹理的结果。

  15. layermotionVectorTextures 为在 context相关 Realm新建的数组。

  16. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  17. 返回 layer

createCylinderLayer(XRCylinderLayerInit init) 方法创建一个新的 XRCylinderLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下 创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. contextthiscontext

  4. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 layout"default", 则抛出 TypeError 并中止这些步骤。

  7. layer 为在 this相关 Realm新建XRCylinderLayer

  8. 使用 sessioncontextlayer 上运行初始化合成层

  9. 使用 layerinit 运行初始化圆柱层

  10. layout 为使用 inittextureTypecontextinitlayout 确定 layout 属性的结果。

  11. layerlayout 初始化为 layout

  12. layerneedsRedraw 初始化为 true

  13. layercolorTextures 为使用 layerinittextureTypeinit 分配颜色 纹理的结果。

  14. layerdepthStencilTextures 为使用 layerinittextureTypeinit 分配深度纹理的结果。

  15. layermotionVectorTextures 为在 context相关 Realm新建的数组。

  16. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  17. 返回 layer

createEquirectLayer(XREquirectLayerLayerInit init) 方法创建一个新的 XREquirectLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下 创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. contextthiscontext

  4. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 layout"default", 则抛出 TypeError 并中止这些步骤。

  7. 如果 initspace 不是 XRReferenceSpace 类型的实例, 则抛出 TypeError 并中止这些步骤。

  8. 如果 initspace 具有 "viewer"type, 则抛出 TypeError 并中止这些步骤。

  9. layer 为在 this相关 Realm新建XREquirectLayer

  10. 使用 sessioncontextlayer 上运行初始化合成层

  11. 使用 layerinit 运行初始化等矩形层

  12. layout 为使用 inittextureTypecontextinitlayout 确定 layout 属性的结果。

  13. layerlayout 初始化为 layout

  14. layerneedsRedraw 初始化为 true

  15. layercolorTextures 为使用 layerinittextureTypeinit 分配颜色 纹理的结果。

  16. layerdepthStencilTextures 为使用 layerinittextureTypeinit 分配深度纹理的结果。

  17. layermotionVectorTextures 为在 context相关 Realm新建的数组。

  18. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  19. 返回 layer

createCubeLayer(XRCubeLayerInit init) 方法创建一个新的 XRCubeLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下 创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. contextthiscontext

  4. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 context 不是 WebGL2RenderingContext 上下文,则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 context 已丢失,则抛出 InvalidStateError 并中止这些步骤。

  7. 如果 initspace 不是 XRReferenceSpace 类型的实例, 则抛出 TypeError 并中止这些步骤。

  8. 如果 initspace 具有 "viewer"type, 则抛出 TypeError 并中止这些步骤。

  9. layer 为在 this相关 Realm新建XRCubeLayer

  10. 使用 sessioncontextlayer 上运行初始化合成层

  11. layerspaceinitspace

  12. layerisStatic 初始化为 initisStatic

  13. 按如下方式初始化 layerorientation

    如果设置了 initorientation
    layerorientation 为使用 initorientation 运行 fromPoint 的结果。
    否则
    layerorientation 为在 this相关 Realm新建DOMPointReadOnly
  14. layoutinitlayout

  15. textureTypeinittextureType

  16. layerneedsRedraw 初始化为 true

  17. 如果 layout"default""stereo-left-right""stereo-top-bottom", 则抛出 TypeError 并中止这些步骤。

  18. layercolorTextures 为在此 XRCubeLayer相关 Realm新建的数组。

  19. 根据 layout 的值,按如下方式初始化 layercolorTextures

    1. 如果 layerlayout"mono"

      如果 textureType"texture-array"
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 6 层的 TEXTURE_2D_ARRAY 纹理。
      否则
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 contextinitcolorFormatviewPixelWidthviewPixelHeight 值的 TEXTURE_CUBE_MAP 纹理。
    2. 否则,如果 layerlayout"stereo"

      如果 textureType"texture-array"
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 12 层的 TEXTURE_2D_ARRAY 纹理。
      否则
      使用 2 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 contextinitcolorFormatviewPixelWidthviewPixelHeight 值的 TEXTURE_CUBE_MAP 纹理。
  20. layerdepthStencilTextures 为在此 XRCubeLayer相关 Realm新建的数组。

  21. layermotionVectorTextures 为在此 XRCubeLayer相关 Realm新建的数组。

  22. 如果设置了 initdepthFormat, 则按如下方式初始化 layerdepthStencilTextures

    1. 如果 context 不是 WebGL2RenderingContextWEBGL_depth_texture 扩展未在 context 中启用,则抛出 TypeError 并中止这些步骤。

    2. 如果 layerlayout"mono"

      如果 textureType"texture-array"
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 6 层的 TEXTURE_2D_ARRAY 纹理。
      否则
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 contextinitdepthFormatviewPixelWidthviewPixelHeight 值的 TEXTURE_CUBE_MAP 纹理。
    3. 否则,如果 layerlayout"stereo"

      如果 textureType"texture-array"
      使用 1 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight 值、具有 12 层的 TEXTURE_2D_ARRAY 纹理。
      否则
      使用 2 个在此 XRCubeLayer相关 Realm新建不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 contextinitdepthFormatviewPixelWidthviewPixelHeight 值的 TEXTURE_CUBE_MAP 纹理。
  23. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  24. 返回 layer

当使用 textureType"texture-array" 时, XRCubeLayer 必须使用 6 个纹理层,按以下顺序存储立方体贴图的各个面: [TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z]

当使用 textureType"texture-array"layout"stereo" 时, 左眼的内容必须从层索引 0 开始存储,右眼的内容 必须从层索引 6 开始存储。

定义立方体贴图尺寸 如何确定。

应如何处理 space。 能否走到立方体贴图的边缘?

确定 orientation 的初始状态。

要对一个带有 XRCompositionLayer layerXRFrame frame 参数的 XRWebGLBinding bindingXRWebGLSubImage 创建函数的 状态进行验证,用户代理必须运行以下步骤:

  1. 如果 framesession 不等于 layersession,则返回 false 并中止 这些步骤。

  2. 如果 frameactive 布尔值为 false,则返回 false 并中止这些步骤。

  3. 如果 frameanimationFrame 布尔值为 false,则返回 false 并中止这些步骤。

  4. 如果 bindingsession 不等于 layersession,则返回 false 并中止 这些步骤。

  5. 如果 bindingcontext 不等于 layercontext,则返回 false 并中止 这些步骤。

  6. 如果 layercolorTextures 数组为空或缺失,则返回 false 并中止这些步骤。

  7. 如果 layerisStatictruelayerneedsRedrawfalse,则返回 false 并中止这些步骤。

  8. 返回 true

要使用一个不透明纹理 texture、一个 XRLayerLayout layout、一个整数 offset 和一个整数 num 初始化 XRViewport viewport 的视口,用户代理必须运行 以下步骤:

  1. viewportx 设置为 0

  2. viewporty 设置为 0

  3. viewportwidth 设置为 texture 的像素宽度。

  4. viewportheight 设置为 texture 的像素高度。

  5. 按如下方式更新 viewport

    如果 layout"stereo-left-right"
    viewportx 设置为 texture 的像素宽度乘以 offset 再除以 num
    viewportwidth 设置为 subimagetexture 的像素宽度除以 num
    否则,如果 layout"stereo-top-bottom"
    viewporty 设置为 texture 的像素高度乘以 offset 再除以 num
    viewportheight 设置为 subimagetexture 的像素高度除以 num
getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none") 方法创建一个新的 XRWebGLSubImage

当此方法在 XRWebGLBinding binding 上调用时,它必须运行以下步骤:

  1. 按如下方式初始化 subimage

    如果之前曾使用相同的 bindinglayereye 调用过 getSubImage(), 用户代理可以
    subimage 为先前使用相同实参调用时返回的同一个 XRWebGLSubImage 对象。
    否则
    subimage 为在 this相关 Realm新建XRWebGLSubImage
    subimageviewport 为在 this相关 Realm新建XRViewport
  2. sessionthissession

  3. 如果 layer 不在 sessionlayers 数组中,则抛出 TypeError 并中止这些步骤。

  4. 如果 layer 的类型为 XRProjectionLayer, 则抛出 TypeError 并中止这些步骤。

  5. 如果 layerlayout 属性为 "default", 则抛出 TypeError 并中止这些步骤。

  6. index0

  7. 如果 layerlayout 属性为 "stereo"

    1. 如果 eye"none", 则抛出 TypeError 并中止这些步骤。

    2. 如果 eye"right"

      如果 layer 的类型为 XRCubeLayer
      index 设置为 6
      否则
      index 设置为 1
  8. 如果使用 layerframe 验证 XRWebGLSubImage 创建函数的状态的结果为 false,则抛出 InvalidStateError 并中止这些步骤。

  9. 按如下方式初始化 subimageimageIndex

    如果 layer 是使用 "texture-array" textureType 创建的
    subimageimageIndex 初始化为 index
    否则
    subimageimageIndex 初始化为 0
  10. 按如下方式初始化 subimagecolorTexture

    如果 layer 是使用 "texture" textureType 创建的
    subimagecolorTexture 初始化为 layercolorTextures 数组中偏移量为 index 的元素。
    否则
    subimagecolorTexture 初始化为 layercolorTextures 数组的第一个元素。
  11. 按如下方式初始化 subimagedepthStencilTexture

    如果 layerdepthStencilTextures 是空数组
    subimagedepthStencilTexture 初始化为 null
    否则,layer 是使用 "texture" textureType 创建的
    subimagedepthStencilTexture 初始化为 layerdepthStencilTextures 数组中偏移量为 index 的元素。
    否则
    subimagedepthStencilTexture 初始化为 layerdepthStencilTextures 数组的第一个元素。
  12. subimagemotionVectorTexturemotionVectorTextureWidthmotionVectorTextureHeight 初始化为 null

  13. subimagecolorTextureWidth 设置为 subimagecolorTexture 的像素宽度。

  14. subimagecolorTextureHeight 设置为 subimagecolorTexture 的像素高度。

  15. 如果 subimagedepthStencilTexture 不是 null,则将 subimagedepthStencilTextureWidth 设置为 depthStencilTexture 数组中第一个纹理的像素宽度。

  16. 如果 subimagedepthStencilTexture 不是 null,则将 subimagedepthStencilTextureHeight 设置为 depthStencilTexture 数组中第一个纹理的像素高度。

  17. viewsPerTexture1

  18. 如果 layerlayout 属性为 "stereo-left-right""stereo-top-bottom", 则将 viewsPerTexture 设置为 2

  19. 使用 subimagecolorTexturelayerlayoutindexviewsPerTexture,在 subimageviewport 上运行初始化视口

  20. 排队一个任务,将 needsRedraw 设置为 false

  21. 返回 subimage

getViewSubImage(XRProjectionLayer layer, XRView view) 方法创建一个新的 XRWebGLSubImage

当此方法在 XRWebGLBinding binding 上调用时,它必须运行以下步骤:

  1. 按如下方式初始化 subimage

    如果之前曾使用相同的 bindinglayerview 调用过 getViewSubImage(), 用户代理可以
    subimage 为先前使用相同实参调用时返回的同一个 XRWebGLSubImage 对象。
    否则
    subimage 为在 this相关 Realm新建XRWebGLSubImage
    subimageviewport 为在 this相关 Realm新建XRViewport
  2. frameviewframe

  3. sessionthissession

  4. 如果使用 layerframe 验证 XRWebGLSubImage 创建函数的状态的结果为 false,则抛出 InvalidStateError 并中止这些步骤。

  5. 如果 layer 不在 sessionlayers 数组中,则抛出 TypeError 并中止这些步骤。

  6. 如果 viewactive 标志为 false,则抛出 InvalidStateError 并中止这些步骤。

  7. 按如下方式初始化 index

    如果 view 是来自 session视图列表辅助视图
    indexviewviewsession视图列表中排除主视图后的偏移量。
    否则
    indexviewviewsession视图列表中排除辅助视图后的偏移量。
  8. 按如下方式初始化 subimageimageIndex

    如果 layer 是使用 "texture-array" textureType 创建的:
    subimageimageIndex 初始化为 index
    否则
    subimageimageIndex 初始化为 0
  9. 按如下方式初始化 subimagecolorTexture

    如果 view 是来自 session视图列表辅助视图
    subimagecolorTexture 初始化为 layer辅助视图的 colorTextures 中偏移量为 index 的元素。
    否则,如果 layerlayout"default"layer 是使用 "texture" textureType 创建的
    subimagecolorTexture 初始化为 layercolorTextures 数组中偏移量为 index 的元素。
    否则
    subimagecolorTexture 初始化为 layercolorTextures 数组的第一个元素。
  10. 按如下方式初始化 subimagedepthStencilTexture

    如果 layerdepthStencilTextures 是空数组
    subimagedepthStencilTexture 初始化为 null
    否则,如果 view 是来自 session视图列表辅助视图
    subimagecolorTexture 初始化为 layer辅助视图的 depthStencilTextures 中偏移量为 index 的元素。
    否则,如果 layerlayout"default"layer 是使用 "texture" textureType 创建的
    subimagedepthStencilTexture 初始化为 layerdepthStencilTextures 数组中偏移量为 index 的元素。
    否则
    subimagedepthStencilTexture 初始化为 layerdepthStencilTextures 数组的第一个元素。
  11. 按如下方式初始化 subimagemotionVectorTexture

    如果 layermotionVectorTextures 是空数组,或 view 是来自 session视图列表辅助视图
    subimagemotionVectorTexture 初始化为 null
    否则,layer 是使用 "texture" textureType 创建的
    subimagemotionVectorTexture 初始化为 layermotionVectorTextures 数组中偏移量为 index 的元素。
    否则
    subimagemotionVectorTexture 初始化为 layermotionVectorTextures 数组的第一个元素。
  12. subimagecolorTextureWidth 设置为 subimagecolorTexture 的像素宽度。

  13. subimagecolorTextureHeight 设置为 subimagecolorTexture 的像素高度。

  14. 如果 subimagedepthStencilTexture 不是 null,则将 subimagedepthStencilTextureWidth 设置为 depthStencilTexture 数组中第一个纹理的像素宽度。

  15. 如果 subimagedepthStencilTexture 不是 null,则将 subimagedepthStencilTextureHeight 设置为 depthStencilTexture 数组中第一个纹理的像素高度。

  16. 如果 subimagemotionVectorTexture 不是 null,则将 subimagemotionVectorTextureWidth 设置为 motionVectorTexture 数组中第一个纹理的像素宽度。

  17. 如果 subimagemotionVectorTexture 不是 null,则将 subimagemotionVectorTextureHeight 设置为 motionVectorTexture 数组中第一个纹理的像素高度。

  18. 使用 subimagecolorTexturelayerlayoutindexsession视图列表的数量,在 subimageviewport 上运行初始化视口

  19. needsRedraw 设置为 false

  20. 返回 subimage

注: 会话应尽量将 getSubImage()getViewSubImage() 的调用推迟到体验开始使用 WebGL 绘制时。 通常这会在游戏逻辑运行之后。在某些用户代理中,为依赖 CPU 和 GPU 的代码设置不同阶段,可以让它们动态优化系统资源。

foveateBoundTexture(GLenum target, float fixed_foveation) 将凹区化应用到当前绑定的纹理或纹理数组。

当此方法在 XRWebGLBinding binding 上调用时,它必须运行以下步骤:

  1. 如果 target 不是 TEXTURE_2DTEXTURE_2D_ARRAY 类型,则抛出 InvalidStateError 并中止这些步骤。

  2. 如果用户代理或设备不支持凹区化,则中止这些步骤。

  3. 如果 fixed_foveation 小于 0,则将其设置为 0

  4. 如果 fixed_foveation 大于 1,则将其设置为 1

  5. 如果在 bindingcontext 中没有纹理绑定到 target, 则抛出 InvalidStateError 并中止这些步骤。

  6. 使用与 fixedFoveation 相同的算法,通过 bindingcontextfixed_foveation 应用于 target

  7. 将使用 bindingcontext 绑定到 target 的纹理添加到 foveatedTextures

注: 凹区化的效果会立即生效。

XRLayerlayers 数组的成员时,它必须在一个 XR 动画帧完成后立即呈现给沉浸式 XR 设备,但前提是自上一个 XR 动画 帧以来至少发生了以下一种情况:

在将不透明帧缓冲区colorTexture 纹理呈现给沉浸式 XR 设备之前,用户代理必须确保所有渲染 操作都已刷新。

7. 视频层创建

7.1. XRMediaLayerInit

XRMediaLayerInit 字典表示一组可配置值,用于描述包含视频的 XRCompositionLayer 如何初始化。
dictionary XRMediaLayerInit {
  required XRSpace space;
  XRLayerLayout layout = "mono";
  boolean invertStereo = false;
};

space 属性定义与用户物理环境的空间关系。

layout 属性定义 XRCompositionLayer 中视频的布局。

invertStereo 属性定义视频中每个视图的自然 位置是否应被反转。

7.2. XRMediaQuadLayerInit

XRMediaQuadLayerInit 字典表示一组可配置值,用于描述包含视频的 XRQuadLayer 如何初始化。
dictionary XRMediaQuadLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float? width;
  float? height;
};

7.3. XRMediaCylinderLayerInit

XRMediaCylinderLayerInit 字典表示一组可配置值,用于描述包含视频的 XRCylinderLayer 如何初始化。
dictionary XRMediaCylinderLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float radius = 2.0;
  float centralAngle = 0.78539;
  float? aspectRatio;
};

7.4. XRMediaEquirectLayerInit

XRMediaEquirectLayerInit 字典表示一组可配置值,用于描述包含视频的 XREquirectLayer 如何初始化。
dictionary XRMediaEquirectLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float radius = 0.0;
  float centralHorizontalAngle = 6.28318;
  float upperVerticalAngle = 1.570795;
  float lowerVerticalAngle = -1.570795;
};

7.5. XRMediaBinding

XRMediaBinding 对象用于创建显示 HTMLVideoElement 内容的层。
[Exposed=Window] interface XRMediaBinding {
  constructor(XRSession session);

  XRQuadLayer createQuadLayer(HTMLVideoElement video, optional XRMediaQuadLayerInit init = {});
  XRCylinderLayer createCylinderLayer(HTMLVideoElement video, optional XRMediaCylinderLayerInit init = {});
  XREquirectLayer createEquirectLayer(HTMLVideoElement video, optional XRMediaEquirectLayerInit init = {});
};

init 字典 不应是可选的。这是 bikeshed 议题 1566。

每个 XRMediaBinding 都有关联的 session,即 创建它时使用的 XRSession

注: 可以创建多个 XRMediaBinding。 层的生命周期并不绑定到创建它的 XRMediaBinding 的生命周期。

每个通过 XRMediaBinding 创建的层都有一个内部 HTMLVideoElement media。 如果该层是会话的 renderState 的一部分,则它会显示视频的当前帧。该层会以 XR 设备或视频的原生帧率 进行更新,取两者中较低者。

注: 层中只会显示视频帧。视频控件应由作者实现,并且必须 绘制在另一个层中。

需要进一步说明 如何将视频 blit 到层中。

当带有 XRCompositionLayer layerHTMLVideoElement media 的层需要渲染时,用户代理 必须运行以下步骤:
  1. usability检查 media 可用性的结果。

  2. 如果 usabilitybad,则用透明黑色填充 layer, 并中止这些步骤。

  3. media 元素的内容填充 layer

添加一个更好的算法来 描述绘制。

XRMediaBinding(XRSession session) 构造函数在被调用时 必须执行以下步骤:

  1. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  2. 如果 session 不是沉浸式会话,则抛出 InvalidStateError 并中止这些步骤。

  3. binding 为在 session相关 Realm新建XRMediaBinding

  4. bindingsession 初始化为 session

  5. 返回 binding

要计算一个 HTMLVideoElement video 和一个 XRLayerLayout layout宽高比, 运行以下步骤:
  1. widthvideovideoWidth

  2. heightvideovideoHeight

  3. 如果 layout"stereo-left-right", 则将 width 除以 2

  4. 如果 layout"stereo-top-bottom", 则将 height 除以 2

  5. 返回 width 除以 height

createQuadLayer(HTMLVideoElement video, XRMediaQuadLayerInit init) 方法创建一个新的 XRQuadLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  4. 如果 initlayout"default", 则抛出 TypeError 并中止这些步骤。

  5. layer 为在 this相关 Realm新建XRQuadLayer

  6. 使用 sessionlayer 上运行初始化合成层

  7. layermedia 初始化为 video

  8. layerneedsRedraw 初始化为 false

  9. aspectRatio 为使用 videoinitlayout 计算宽高比的结果。

  10. 如果 initwidthheightundefined,则将 width 设置为 1

  11. 如果 initheightundefined,则将 height 设置为 width 除以 aspectRatio

  12. 如果 initwidthundefined,则将 width 设置为 height 乘以 aspectRatio

  13. 使用 layerinit 运行初始化四边形层

  14. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  15. 返回 layer

createCylinderLayer(HTMLVideoElement video, XRMediaCylinderLayerInit init) 方法创建一个新的 XRCylinderLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  4. 如果 initlayout"default", 则抛出 TypeError 并中止这些步骤。

  5. layer 为在 this相关 Realm新建XRCylinderLayer

  6. 使用 sessionlayer 上运行初始化合成层

  7. layermedia 初始化为 video

  8. layerneedsRedraw 初始化为 false

  9. aspectRatio 为使用 videoinitlayout 计算宽高比的结果。

  10. 如果 initaspectRatioundefined,则将 aspectRatio 设置为 aspectRatio

  11. 使用 layerinit 运行初始化圆柱层

  12. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  13. 返回 layer

createEquirectLayer(HTMLVideoElement video, XRMediaEquirectLayerInit init) 方法创建一个新的 XREquirectLayer layer

调用此方法时,用户代理必须运行以下步骤:

  1. sessionthissession

  2. 如果 session 不是在启用 "layers" 的情况下创建的,则抛出 NotSupportedError 并中止这些步骤。

  3. 如果 sessionended 值为 true,则抛出 InvalidStateError 并中止这些步骤。

  4. 如果 initlayout"default", 则抛出 TypeError 并中止这些步骤。

  5. 如果 initspace 不是 XRReferenceSpace 类型的实例, 则抛出 InvalidStateError 并中止这些步骤。

  6. 如果 initspace 具有 "viewer"type, 则抛出 InvalidStateError 并中止这些步骤。

  7. layer 为在 this相关 Realm新建XREquirectLayer

  8. 使用 sessionlayer 上运行初始化合成层

  9. layermedia 初始化为 video

  10. layerneedsRedraw 初始化为 false

  11. 使用 layerinit 运行初始化等矩形层

  12. 如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出 OperationError 并中止这些步骤。

  13. 返回 layer

定义 XREquirectLayer 的 参数如何影响视频显示。

8. 事件

8.1. XRLayerEvent

XRLayerEvent 会被触发,以指示 XRLayer 状态的变化。

[SecureContext, Exposed=Window] interface XRLayerEvent : Event {
  constructor(DOMString type, XRLayerEventInit eventInitDict);
  [SameObject] readonly attribute XRLayer layer;
};

dictionary XRLayerEventInit : EventInit {
  required XRLayer layer;
};

layer 属性指示生成该事件的 XRLayer

8.2. 事件类型

用户代理必须提供以下新事件。事件的注册和触发必须遵循 DOM4 Events 的通常行为。

层的底层资源丢失XR Compositor 无法再重投影该层时,用户代理可以在 XRLayer 对象上触发一个 redraw 事件。

作者应该在下一个 XR 动画 帧重新绘制该层的内容。该事件必须属于 XRLayerEvent 类型。

9. 层之间的深度排序

默认情况下,layers 数组定义层的合成顺序,并且每个层都绘制在前一个 层之上。 如果应用想要让层按深度排序,则必须使用 "depth-sorted-layers" 特性 描述符来请求会话。

如果 XRSession 是使用 "depth-sorted-layers" 特性 描述符创建的,则 XRProjectionLayerXRQuadLayerXRCylinderLayer 层必须根据其深度显示,而不是根据在 layers 数组中的位置显示。 其他层类型必须继续像以前一样排序。

XRQuadLayerXRCylinderLayer 层必须根据其尺寸(例如 widthcentralAngle)、 transform 和 space 进行排序。

XRProjectionLayer 层必须按照其 depthStencilTexture 中的值进行排序。 这也意味着,如果启用了 "depth-sorted-layers",则 XR Compositor 必须使用深度值,并且 ignoreDepthValuesusesDepthValues 必须设置为 `true`。

10. 空间扭曲

空间扭曲是一种 改进 XR Compositor 重投影的技术。 通过同时提交 motionVectorTexturedepthStencilTextureXR Compositor 可以进行高质量的帧外推和 重投影,从而允许用户代理以降低的帧率运行,同时仍然为用户提供流畅的 体验。

要启用空间扭曲XRSession 必须使用 "space-warp" 特性 描述符创建。 如果启用了 "space-warp",则 XR Compositor 必须使用深度值,ignoreDepthValues 必须设置为 `false`,并且 usesDepthValues 必须设置为 `true`。

motionVectorTexture 必须采用 RGBA16F 格式。作者应该用该区域以米每秒为单位的速度填充此纹理的 RGB 分量, 其中红色像素对应 x 轴,绿色对应 y 轴,蓝色对应 z 轴。

11. WebXR 设备 API 集成

11.1. XRRenderState 变更

此模块使用一个新的可选数组 layers 扩展 XRRenderStateInitXRRenderState 接口,该数组包含 XRLayer 实例。
[SecureContext, Exposed=Window] partial interface XRRenderState {
  readonly attribute FrozenArray<XRLayer> layers;
};

layers 属性返回一个数组,其中包含 由 XR Compositor 显示的 XRLayer 实例。

默认情况下,layers 数组定义层的合成顺序。XR Compositor 必须 按照层在数组中的位置顺序,使用 source-over 混合绘制每个层。除非启用了 "depth-sorted-layers" 特性 描述符,否则 XR Compositor 不得对层应用任何深度排序。

注: 这意味着每个层都可能 覆盖之前的层,无论之前的层在虚拟空间中是否更接近观看者。

此模块替换初始化渲染状态给出的步骤。取而代之,当为 XRSession session 创建 XRRenderState 对象 state 时,用户代理必须通过运行以下步骤 初始化渲染状态
  1. 通过运行原始初始化渲染状态步骤来初始化 state

  2. statelayers 初始化为在 session相关 Realm新建的空数组。

11.2. updateRenderState 变更

此模块替换 WebXR 规范中由 "更新待处理 layers 状态" 给出的步骤。取而代之,当用户代理将使用 XRSession sessionXRRenderStateInit newState 更新待处理 layers 状态时,必须运行以下步骤:

  1. 如果 newStatebaseLayernewStatelayers 都已设置,则抛出 NotSupportedError 并中止这些步骤。

  2. activeStatesession活动渲染状态

  3. 如果设置了 newStatebaseLayer

    1. 如果 session待处理渲染状态null,则将 其设置为 activeState 的副本。

    2. session待处理渲染状态layers 设置为 null

  4. 如果设置了 newStatelayers

    1. 如果 session 不是在启用 "layers" 的情况下创建的,并且 newStatelayers 包含超过 1 个实例,则抛出 NotSupportedError 并中止这些步骤。

    2. 如果 newStatelayers 包含超过 maxRenderLayers 个条目,则抛出 NotSupportedError 并中止这些步骤。

    3. 如果 session待处理渲染状态null, 则将其设置为 activeState 的副本。

    4. 如果 newStatelayers 包含重复实例,则抛出 TypeError 并中止这些步骤。

    5. 对于 newStatelayers 中的每个 layer

      1. 如果 layerXRCompositionLayerlayersession 不同于 session,则抛出 TypeError 并中止这些步骤。

      2. 如果 layerXRWebGLLayerlayersession 不同于 session,则抛出 TypeError 并中止这些步骤。

    6. session待处理渲染状态baseLayer 设置为 null

    7. session待处理渲染状态layers 设置为 newStatelayers

11.3. XRCompositor 变更

XR Compositor 必须扩展,以便来自 layers 数组的所有 XRLayer 实例同时合成。WebXR 的所有其他要求必须继续 适用。

如果 XR Compositor 正在渲染到一个 view,其 XREye"none", 并且正在绘制一个不是 XRProjectionLayerlayout 不是 "mono"XRCompositionLayer, 则 XR Compositor 必须像该 view 具有值为 "left"XREye 那样渲染该层。

注: 这意味着该层右眼的一侧会被忽略。 这使作者能够为立体和单视设备使用相同的素材。

11.4. XRView 变更

每个 view 必须定义一个 推荐 WebGL 颜色纹理分辨率,它表示 足够容纳该 view 的 WebGL 纹理分辨率的最佳估计。

如果 XRSession 是使用 "space-warp" 特性 描述符创建的,则每个 view 必须定义一个 推荐运动向量纹理分辨率, 它基于推荐 WebGL 颜色纹理 分辨率

每个 view 还必须 定义一个 推荐 WebGL 深度纹理分辨率,它 基于推荐 WebGL 颜色纹理分辨率推荐运动向量纹理 分辨率。如果启用了 "space-warp",用户代理可以决定降低 推荐 WebGL 深度纹理分辨率

如果启用了 "depth-sorted-layers" 特性描述符,则推荐 WebGL 深度纹理 分辨率必须等于推荐 WebGL 颜色纹理 分辨率

11.5. 动画帧变更

此模块替换 WebXR 规范中由 "检查 layers 状态" 给出的步骤。取而代之,要使用 renderState state 检查 layers 状态, 用户代理必须运行以下步骤:
  1. 如果 statebaseLayer 不是 null,则返回 true

  2. 如果 statelayers 不为空,则返回 true

  3. 返回 false

11.6. XRSession 变更

此模块扩展并向 XRSession 接口添加以下内容:
[SecureContext, Exposed=Window] partial interface XRSession {
  readonly attribute unsigned long maxRenderLayers;
};

maxRenderLayers 表示 compositor 必须处理的 最大层数,因此也表示任何 XRRenderStateInitlayers 数组的最大大小。应该可以在给定时间创建超过该数量的层。

注: 此指导并非旨在对用户代理可分配的层数量 设置限制,如层的分配中所述。用户代理可以允许例如创建 20 个层, 同时只允许一次通过 updateRenderState() 设置 10 个。还值得注意的是,由于不同层可能需要不同数量的后端能力或 对象,用户代理在设置 `maxRenderLayers` 值时具有一定自由裁量权,以确保至少 这么多层可以被渲染。不过,当传入更多层时,用户代理仍然需要拒绝,并且不能在传入更少层时拒绝 updateRenderState。

每个 XRSession 都有一个内部 WeakSet bindings,其中保存 对使用该会话创建的每个 XRWebGLBinding 的弱引用。

此模块向 WebXR 规范中的 "关闭 会话" 添加一个步骤。 将以下内容添加到列表中:

  1. 对于 session|bindings 中的每个 binding

    1. 对于 bindingfoveatedTextures 中的每个 texture

    2. texture 移除凹区化。

12. 安全和隐私考量

12.1. 合成的时序

合成时序必须独立于所渲染的内容。 此外,一个层中的内容不得在其他层中被观察到。

如果可能,层的合成应该在浏览器之外进行,以降低时序攻击或 其他安全漏洞的风险。

12.2. 层的分配

用户代理可以限制任何资源分配,例如最大像素大小或 层数,以降低 GPU 硬件的可识别性。

变更

2020 年 12 月 3 日第一份公开工作 草案以来的变更

新特性:

变更:

一致性

文档 约定

一致性要求通过 描述性断言 与 RFC 2119 术语的组合来表达。 本文档规范性部分中的关键字 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY” 和 “OPTIONAL” 应按 RFC 2119 中的描述来解释。 但是,为提高可读性, 这些词在本规范中并不全都以大写字母出现。

本规范的所有文本均为规范性内容, 但明确标记为非规范性的章节、示例和注释除外。 [RFC2119]

本规范中的示例以 “for example” 等词引入,或通过 class="example" 与规范性文本分隔开, 如下所示:

这是一个资料性示例。

资料性注释以 “Note” 开头,并通过 class="note" 与规范性文本分隔开, 如下所示:

注,这是一个资料性注释。

一致性 算法

作为算法一部分以祈使语气表述的要求 (例如 "strip any leading space characters" 或 "return false and abort these steps") 应按引入该算法时所使用的关键字 ("must"、"should"、"may" 等) 的含义来解释。

以算法或具体步骤表述的一致性要求 可以以任何方式实现, 只要最终结果等价即可。 特别是,本规范中定义的算法 旨在易于理解, 并不旨在具有高性能。 鼓励实现者进行优化。

索引

由本 规范定义的术语

由引用定义的术语

参考文献

规范性参考文献

[COMPOSITING-1]
Chris Harrelson. Compositing and Blending Level 1. 2024 年 3 月 21 日. CRD. URL: https://www.w3.org/TR/compositing-1/
[DOM]
Anne van Kesteren. DOM Standard. 活标准. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. Geometry Interfaces Module Level 1. 2025 年 12 月 4 日. CRD. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; et al. HTML Standard. 活标准. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997 年 3 月. 最佳当前实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Dean Jackson; Jeff Gilbert. WebGL 2.0 Specification. 2017 年 8 月 12 日. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 活 标准. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2025 年 10 月 1 日. CRD. URL: https://www.w3.org/TR/webxr/
[WEBXR-AR-MODULE-1]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Augmented Reality Module - Level 1. 2025 年 4 月 25 日. CRD. URL: https://www.w3.org/TR/webxr-ar-module-1/

资料性参考文献

[PERMISSIONS-REQUEST]
Requesting Permissions. 社区组报告草案. URL: https://wicg.github.io/permissions-request/

IDL 索引

enum XRLayerLayout {
  "default",
  "mono",
  "stereo",
  "stereo-left-right",
  "stereo-top-bottom"
};

enum XRLayerQuality {
  "default",
  "text-optimized",
  "graphics-optimized"
};

[Exposed=Window] interface XRCompositionLayer : XRLayer {
  readonly attribute XRLayerLayout layout;

  attribute boolean blendTextureSourceAlpha;
  attribute boolean forceMonoPresentation;
  attribute float opacity;
  readonly attribute unsigned long mipLevels;
  attribute XRLayerQuality quality;

  readonly attribute boolean needsRedraw;

  undefined destroy();
};

[Exposed=Window] interface XRProjectionLayer : XRCompositionLayer {
  readonly attribute unsigned long textureWidth;
  readonly attribute unsigned long textureHeight;
  readonly attribute unsigned long textureArrayLength;

  readonly attribute boolean ignoreDepthValues;
  attribute float? fixedFoveation;
  attribute XRRigidTransform? deltaPose;
};

[Exposed=Window] interface XRQuadLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float width;
  attribute float height;

  // Events
  attribute EventHandler onredraw;
};

[Exposed=Window] interface XRCylinderLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float radius;
  attribute float centralAngle;
  attribute float aspectRatio;

  // Events
  attribute EventHandler onredraw;
};

[Exposed=Window] interface XREquirectLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute XRRigidTransform transform;

  attribute float radius;
  attribute float centralHorizontalAngle;
  attribute float upperVerticalAngle;
  attribute float lowerVerticalAngle;

  // Events
  attribute EventHandler onredraw;
};

[Exposed=Window] interface XRCubeLayer : XRCompositionLayer {
  attribute XRSpace space;
  attribute DOMPointReadOnly orientation;

  // Events
  attribute EventHandler onredraw;
};

[Exposed=Window] interface XRSubImage {
  [SameObject] readonly attribute XRViewport viewport;
};

[Exposed=Window] interface XRWebGLSubImage : XRSubImage {
  [SameObject] readonly attribute WebGLTexture colorTexture;
  [SameObject] readonly attribute WebGLTexture? depthStencilTexture;
  [SameObject] readonly attribute WebGLTexture? motionVectorTexture;

  readonly attribute unsigned long? imageIndex;
  readonly attribute unsigned long colorTextureWidth;
  readonly attribute unsigned long colorTextureHeight;
  readonly attribute unsigned long? depthStencilTextureWidth;
  readonly attribute unsigned long? depthStencilTextureHeight;
  readonly attribute unsigned long? motionVectorTextureWidth;
  readonly attribute unsigned long? motionVectorTextureHeight;
};

enum XRTextureType {
  "texture",
  "texture-array"
};

dictionary XRProjectionLayerInit {
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum depthFormat = 0x1902; // DEPTH_COMPONENT
  double scaleFactor = 1.0;
  boolean clearOnAccess = true;
};

dictionary XRLayerInit {
  required XRSpace space;
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum? depthFormat;
  unsigned long mipLevels = 1;
  required unsigned long viewPixelWidth;
  required unsigned long viewPixelHeight;
  XRLayerLayout layout = "mono";
  boolean isStatic = false;
  boolean clearOnAccess = true;
};

dictionary XRQuadLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float width = 1.0;
  float height = 1.0;
};

dictionary XRCylinderLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float radius = 2.0;
  float centralAngle = 0.78539;
  float aspectRatio = 2.0;
};

dictionary XREquirectLayerInit : XRLayerInit {
  XRRigidTransform? transform;
  float radius = 0;
  float centralHorizontalAngle = 6.28318;
  float upperVerticalAngle = 1.570795;
  float lowerVerticalAngle = -1.570795;
};

dictionary XRCubeLayerInit : XRLayerInit {
  DOMPointReadOnly? orientation;
};

[Exposed=Window] interface XRWebGLBinding {
  constructor(XRSession session, XRWebGLRenderingContext context);

  readonly attribute double nativeProjectionScaleFactor;
  readonly attribute boolean usesDepthValues;

  XRProjectionLayer createProjectionLayer(optional XRProjectionLayerInit init = {});
  XRQuadLayer createQuadLayer(optional XRQuadLayerInit init = {});
  XRCylinderLayer createCylinderLayer(optional XRCylinderLayerInit init = {});
  XREquirectLayer createEquirectLayer(optional XREquirectLayerInit init = {});
  XRCubeLayer createCubeLayer(optional XRCubeLayerInit init = {});

  XRWebGLSubImage getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none");
  XRWebGLSubImage getViewSubImage(XRProjectionLayer layer, XRView view);

  undefined foveateBoundTexture(GLenum target, float fixed_foveation);
};

dictionary XRMediaLayerInit {
  required XRSpace space;
  XRLayerLayout layout = "mono";
  boolean invertStereo = false;
};

dictionary XRMediaQuadLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float? width;
  float? height;
};

dictionary XRMediaCylinderLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float radius = 2.0;
  float centralAngle = 0.78539;
  float? aspectRatio;
};

dictionary XRMediaEquirectLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float radius = 0.0;
  float centralHorizontalAngle = 6.28318;
  float upperVerticalAngle = 1.570795;
  float lowerVerticalAngle = -1.570795;
};

[Exposed=Window] interface XRMediaBinding {
  constructor(XRSession session);

  XRQuadLayer createQuadLayer(HTMLVideoElement video, optional XRMediaQuadLayerInit init = {});
  XRCylinderLayer createCylinderLayer(HTMLVideoElement video, optional XRMediaCylinderLayerInit init = {});
  XREquirectLayer createEquirectLayer(HTMLVideoElement video, optional XRMediaEquirectLayerInit init = {});
};

[SecureContext, Exposed=Window] interface XRLayerEvent : Event {
  constructor(DOMString type, XRLayerEventInit eventInitDict);
  [SameObject] readonly attribute XRLayer layer;
};

dictionary XRLayerEventInit : EventInit {
  required XRLayer layer;
};

[SecureContext, Exposed=Window] partial interface XRRenderState {
  readonly attribute FrozenArray<XRLayer> layers;
};

[SecureContext, Exposed=Window] partial interface XRSession {
  readonly attribute unsigned long maxRenderLayers;
};

议题索引

本节需要澄清
本节需要澄清
init 字典不应是可选的。这是 bikeshed 议题 1566。
如果尺寸导致布局变化,则需要特殊处理 UA 行为(即,如果请求的宽度 超过 "stereo-left-right" 的限制)
需要为辅助视图重新计算 scaleFactor。
定义立方体贴图尺寸如何确定。
应如何处理 space。能否走到立方体贴图的边缘?
确定 orientation 的初始状态。
init 字典不应是可选的。这是 bikeshed 议题 1566。
需要进一步说明如何将视频 blit 到层中。
添加一个更好的算法来描述绘制。
定义 XREquirectLayer 的参数 如何影响视频显示。