1. 简介
本规范为 WebXR 规范添加对 `composition` 层的支持。层的优点如下:
-
性能和抖动:合成层以 合成器的帧率(即 HMD 的原生刷新率)呈现,而不是以应用帧率呈现。 即使应用没有以合成器的原生刷新率更新层的渲染, 合成器也可能能够将已有 渲染重投影到正确的姿态。这会带来更平滑的渲染和更少的抖动。层的另一个 特性是,每个层可以具有不同的分辨率。这允许 应用在低性能系统上降低主眼缓冲区分辨率,同时将 文本或地图等关键信息保留在其自己的更高 分辨率层中。
-
可读性/视觉保真度:在常规 WebXR 中,眼缓冲区的分辨率可能 被降低到相对较低的值,尤其是在低性能系统上。这使得 渲染高保真内容(例如文本)更加困难。使用合成层时,一个静态 圆柱层或四边形层可以以高分辨率绘制一次,并且只由 合成器重采样一次。这与 渲染
XRWebGLLayer的传统方法形成对比,在该方法中,内容以设备刷新率生成,并至少被重采样两次:一次是在 渲染到 WebGL 眼缓冲区时(由于 眼缓冲区分辨率较低,可能会丢失细节),第二次由合成器执行。 -
功耗/电池续航:由于渲染管线减少、没有 双重采样且无需每帧更新层的渲染,因此预计 功耗会得到改善。
-
延迟:合成层的姿态采样可以发生在帧的最末端, 然后可以使用某些重投影技术来更新层的姿态, 使其与最新的 HMD 姿态匹配。这可以显著降低 层渲染的有效延迟,从而改善整体体验。
-
支持更多颜色类型:WebXR 仅支持 RGB 值。合成层将 更广泛地支持颜色类型,以便作者可以使用压缩格式或 sRGB。
1.1. 术语
1.2. 应用流程
如果作者想使用 GL 层,则必须执行以下步骤:
-
对于除
XRProjectionLayer之外的任何层类型,通过requiredFeatures或optionalFeatures在requestSession()中请求支持。 -
创建一个
XRWebGLBinding或XRMediaBinding。 -
使用这些对象创建层。
-
将层添加到
XRRenderStateInit并调用updateRenderState()。 -
在用于 webgl 层的
requestAnimationFrame()期间,绘制每个 WebGL 层的内容。
2. 初始化
如果应用想在会话期间创建 XRProjectionLayer
类型之外的层,
则必须使用适当的特性
描述符来请求该会话。本模块引入字符串 "layers",
作为 WebXR Layers 特性的新的有效特性描述符。
XRProjectionLayer
类型的层必须始终受支持,无论是否请求了该特性
描述符。
层仅支持用于以 "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布局表示该层可以 容纳会话视图列表中的所有视图。 -
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" };
-
default布局表示该层以 常规设置显示。 -
text-optimized布局表示 XR Compositor 会尝试以最易读的方式渲染该层。 -
graphics-optimized布局表示 XR Compositor 会尝试以额外 锐度渲染该层。
注: text-optimized
和 graphics-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 发送信号,以
移除此 XRCompositionLayer
的 stereo
效果。
在 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 的层的底层资源丢失时,
用户代理必须运行以下步骤:
-
将 layer 的
needsRedraw设置为true。 -
如果 layer 不是
XRProjectionLayer, 则排队一个任务,以便在 layer 上使用XRLayerEvent触发 一个事件,该事件名为redraw。
destroy()
将删除底层附件。如果没有附件,则此函数不执行任何操作。
要使用 XRSession
session 和一个可选的 WebGLRenderingContext
或 WebGL2RenderingContext
context 实例初始化合成层,用户代理必须运行以下步骤:
调用 destroy()
时,用户代理必须运行以下步骤:
-
将 this colorTextures 数组设置为空数组。
-
将 this depthStencilTextures 数组设置为空数组。
-
销毁底层 GL 附件。
每个 XRCompositionLayer
都有一个 context 对象,它是
null,或者 WebGLRenderingContext
或 WebGL2RenderingContext
的实例,还有一个 media
对象,它是 null 或 HTMLVideoElement
的实例。
每个 XRCompositionLayer
都有关联的 session,即
创建它时使用的 XRSession。
当使用 XRSpace
space 和 XRCompositionLayer
layer 设置
层上的空间时,用户代理必须运行以下步骤来验证 space 是否
有效:
XRCompositionLayer
有一个内部布尔值 isStatic,表示作者只能
在 needsRedraw
为 true 时绘制
到此层。
注: 如果 isStatic 为
true,则作者只能在创建后绘制到该层一次,或在
redraw 事件之后绘制一次。这允许 UA 只分配一个 GPU 缓冲区。
当在 XRCompositionLayer
或其任何派生类上设置可写属性时,
读取该属性必须返回该值。
在 requestAnimationFrame()
回调结束时,该值必须发送到
底层 XR
Compositor。XR 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 的值会将其设置为 1。0 设置最小
注视点渲染量,而
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 ; // Eventsattribute EventHandler onredraw ; };
transform 属性设置并返回相对于
space 属性的偏移和
方向。transform
和 space
属性
建立层在用户物理环境中的空间关系。
设置 space
时,首先运行设置层上的空间的步骤。
width 和 height 属性
设置并返回层的宽度和高度,单位为米。
XRQuadLayerInit
init初始化 XRQuadLayer
layer 时,用户代理必须运行以下步骤:
-
按如下方式初始化 layer 的
transform:- 如果设置了 init 的
transform - 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform, 并使用 init 的transform的position和orientation初始化。 - 否则
- 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform, 并使用DOMPointInitposition{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }初始化。
- 如果设置了 init 的
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 ; // Eventsattribute EventHandler onredraw ; };
transform 属性设置并返回相对于
space 属性的偏移
和方向。transform
和 space
属性
建立层在用户物理环境中的空间关系。
设置 space
时,首先运行设置层上的空间的步骤。
radius 属性控制圆柱的
半径,单位为米。
centralAngle 属性控制圆柱可见部分的角度,
单位为弧度。
它围绕 0 角对称增长。
aspectRatio 属性控制
可见圆柱部分的比例。它是圆柱可见部分的宽度除以其
高度的比值。宽度通过将 radius
乘以 centralAngle
计算得出。

XRCylinderLayerInit
init初始化 XRCylinderLayer
layer 时,用户代理必须运行以下步骤:
-
将 layer 的
centralAngle初始化为 init 的centralAngle。 -
将 layer 的
aspectRatio初始化为 init 的aspectRatio。 -
按如下方式初始化 layer 的
transform:- 如果设置了 init 的
transform - 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform, 并使用 init 的transform的position和orientation初始化。 - 否则
- 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform, 并使用DOMPointInitposition{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }初始化。
- 如果设置了 init 的
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 ; // Eventsattribute EventHandler onredraw ; };
transform 属性设置并返回相对于
space
的偏移和方向。
transform
属性和 space
建立层在用户物理环境中的空间关系。
radius 属性是球体的非负半径,单位为米。
zero 或 infinity 值被视为无限球体。
将 radius
设置为小于 0 的值会将其设置为 0。
centralHorizontalAngle、upperVerticalAngle
和 lowerVerticalAngle 属性设置并
返回纹理如何映射到球体。
将 centralHorizontalAngle
设置为小于 0 的值会将其设置为 0,而设置为
大于 2π 的值会将其设置为 2π。
将 upperVerticalAngle
或 lowerVerticalAngle
设置为小于 -π/2 的值会将其
设置为 -π/2,而设置为大于 π/2 的值会将其设置为 π/2。

将 XRSpace
分配给 space
属性时,首先运行以下步骤。
当使用 XRSpace
space 和 XREquirectLayer
layer 设置等矩形层上的空间时,用户代理必须运行以下步骤来验证 space 是否
有效:
XREquirectLayerInit
init初始化 XREquirectLayer
layer 时,用户代理必须运行以下步骤:
-
将 layer 的
centralHorizontalAngle初始化为 init 的centralHorizontalAngle。 -
将 layer 的
upperVerticalAngle初始化为 init 的upperVerticalAngle。 -
将 layer 的
lowerVerticalAngle初始化为 init 的lowerVerticalAngle。 -
按如下方式初始化 layer 的
transform:- 如果设置了 init 的
transform - 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform, 并使用 init 的transform的position和orientation初始化。 - 否则
- 令 layer 的
transform为在 layer 的相关 Realm 中新建的XRRigidTransform。
- 如果设置了 init 的
onredraw 属性是
redraw
事件类型的事件处理器 IDL
属性。
3.9. XRCubeLayer
XRCubeLayer
渲染一个层,其中 XR Compositor 直接从立方体贴图进行渲染。

[Exposed =Window ]interface :XRCubeLayer XRCompositionLayer {attribute XRSpace space ;attribute DOMPointReadOnly orientation ; // Eventsattribute EventHandler onredraw ; };
orientation 属性设置并返回相对于
space 属性的方向。orientation
和 space
属性
建立层在用户物理环境中的空间关系。
放置 XRCubeLayer
时,仅考虑 space
的方向。立方体层将始终以
视点位于中心的方式渲染。
将 XRSpace
分配给 space
属性时,首先运行以下步骤。
当使用 XRSpace
space 和 XRCubeLayer
layer 设置立方体层上的空间时,用户代理必须运行以下步骤来验证 space 是否
有效:
onredraw 属性是
redraw
事件类型的事件处理器 IDL 属性。
4. 空间
XRProjectionLayer
和 XRWebGLLayer
没有关联的 XRSpace,
因为它们渲染到完整帧。
XRCubeLayer
和 XREquirectLayer
必须仅支持非 "viewer"
类型的 XRReferenceSpaces。
XRQuadLayer
和 XRCylinderLayer
必须支持所有 XRSpace
类型。
通常,开发者不应使用 "viewer"
空间来稳定层,因为这几乎总会破坏位置或
旋转重投影,并导致渲染内容相对于世界的稳定性下降。
例外是一些小型 UI 元素,
例如凝视光标或瞄准标线。
以下是与层类型一起使用的空间的一些最佳实践:
-
XRQuadLayer搭配"viewer"空间:屏幕中心的头部锁定恒定大小标线。 -
XRQuadLayer或XRCylinderLayer位于"local"、"unbounded"空间中:弹性身体锁定 UI。 -
XRQuadLayer或XRCylinderLayer位于"local"、"local-floor"、"unbounded"、"bounded-floor"或锚点空间中:由用户放置的世界锁定视频。 -
XREquirectLayer或XRCubeLayer位于"local"空间中:360 度视频或天空盒。
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
请求的层有效。
colorTextureWidth 和 depthStencilTextureHeight
属性
返回 GL 深度附件的像素宽度和高度
depthStencilTextureWidth 和
colorTextureHeight 属性
返回 GL 颜色附件的像素宽度和高度。如果该层创建时没有
深度/模板,则此属性返回 null。
motionVectorTextureWidth 和
motionVectorTextureHeight
属性
返回 GL 运动向量附件的像素宽度和高度。
如果 XRSession
是在没有 space-warp 特性
描述符的情况下创建的,或者该层不是 XRProjectionLayer,
则这些属性必须返回 null。
5.3. XRTextureType
XRTextureType
枚举定义分配何种类型的纹理。
enum {XRTextureType "texture" ,"texture-array" };
-
texture纹理类型表示XRWebGLSubImage的纹理必须为TEXTURE_2D类型 -
texture-array纹理类型表示XRWebGLSubImage的纹理必须为TEXTURE_2D_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
相同,但有以下变化:
-
不透明纹理 在其会话的
requestAnimationFrame()回调之外被视为无效。 -
不透明纹理 在由
getSubImage()或getViewSubImage()调用返回之前是无效的。 -
XR Compositor 必须假定颜色附件的不透明纹理 包含带有预乘 alpha 的颜色。
-
在
requestAnimationFrame()回调结束时,该纹理必须被解除绑定,并与所有WebGLShader对象分离。 -
不透明纹理 必须表现得如同它是通过 texStorage2D 或 texStorage3D 分配的一样(视情况而定),即使使用的是 WebGL 1.0 上下文。
-
使用不透明 纹理调用
deleteTexture必须生成INVALID_OPERATION错误。
在每个 XR 动画帧中,当 clearOnAccess
为 true 时,
附加到不透明
纹理的缓冲区必须在处理第一次调用
getViewSubImage()
或 getSubImage()
期间清除为下表中的值。
如果 clearOnAccess
为 false,则附加到不透明纹理的缓冲区必须在首次访问时清除。
后续帧中的后续访问可以不清除缓冲区。
| 缓冲区 | 清除值 |
|---|---|
| 颜色 | (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
是使用 RGBA
或 RGB
colorFormat
分配的,
则其 colorTextures 必须
作为 RGBA
或 RGB
暴露给 WebGLRenderingContext
上下文。
但是,XR
Compositor 必须将 colorTextures 的像素视为处于
SRGB8_ALPHA8
或 SRGB8
colorFormat
中一样。
注: 这意味着当 XR Compositor
处理 colorTextures 时,不得从线性 RGBA
或 RGB
进行任何 gamma 转换。否则,最终渲染中的像素会显得
过亮,这将与常规 2D WebGLRenderingContext
上下文中的渲染不匹配。
6.3. XRProjectionLayerInit
XRProjectionLayerInit
字典表示一组可配置值,这些值描述如何初始化 XRProjectionLayer。
dictionary {XRProjectionLayerInit XRTextureType textureType = "texture";GLenum colorFormat = 0x1908; // RGBAGLenum depthFormat = 0x1902; // DEPTH_COMPONENTdouble scaleFactor = 1.0;boolean clearOnAccess =true ; };
textureType 属性定义
层将具有的纹理类型。
colorFormat 属性定义
颜色纹理数据的数据类型。
这是 XR Compositor 必须支持的投影层颜色格式列表:
对于 WebGL2 上下文,还支持以下附加格式:
depthFormat 属性定义
深度纹理数据的数据类型。
如果 depthFormat
为 0,则该层不会提供深度/模板纹理。
这是 XR Compositor 必须支持的投影层深度格式列表:
对于启用了 'WEBGL_depth_texture'
扩展的 WebGLRenderingContext
上下文或 WebGL2 上下文:
如果该扩展未启用,则会忽略对深度纹理的请求。
注: 这可能会令作者困惑,因为他们 可能期望获得深度纹理。如果可能,请提供一条警告,说明未 创建该纹理的原因。
对于 WebGL2RenderingContext
上下文,支持以下附加格式:
scaleFactor 属性定义
session 的
推荐 WebGL 帧缓冲区分辨率必须乘以的值,以确定层附件的分辨率。
clearOnAccess 属性
定义与此层关联的纹理应在初始帧中清除,还是在每一帧中清除。
注: XRProjectionLayerInit
字典不支持像
XRLayerInit
那样配置 mipLevels。
如果用户代理想支持投影层上的 mipmapping,则它可以自由分配带有
mips 的纹理。
在这种情况下,用户代理(而不是作者)负责生成所有 mip 级别。
6.4. XRLayerInit
XRLayerInit
字典表示一组通用可配置值,用于 XRQuadLayer、
XRCylinderLayer、
XREquirectLayer
和 XRCubeLayer。
dictionary {XRLayerInit required XRSpace space ;XRTextureType textureType = "texture";GLenum colorFormat = 0x1908; // RGBAGLenum ?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 级别数量。
viewPixelWidth 和 viewPixelHeight 属性定义
XRCompositionLayer
的矩形尺寸。
layout 属性定义层的布局。
clearOnAccess 属性定义与此层
关联的纹理应在初始帧中清除,还是在每一帧中清除。
6.5. XRQuadLayerInit
XRQuadLayerInit
字典表示一组可配置值,这些值描述如何初始化 XRQuadLayer。
dictionary :XRQuadLayerInit XRLayerInit {XRRigidTransform ?;transform float = 1.0;width float = 1.0; };height
6.6. XRCylinderLayerInit
XRCylinderLayerInit
字典表示一组可配置值,这些值描述如何初始化 XRCylinderLayer。
dictionary :XRCylinderLayerInit XRLayerInit {XRRigidTransform ?;transform float = 2.0;radius float = 0.78539;centralAngle float = 2.0; };aspectRatio
centralAngle
的默认值为 π / 4。
6.7. XREquirectLayerInit
XREquirectLayerInit
字典表示一组可配置值,这些值描述如何初始化 XREquirectLayer。
dictionary :XREquirectLayerInit XRLayerInit {XRRigidTransform ?;transform float = 0;radius float = 6.28318;centralHorizontalAngle float = 1.570795;upperVerticalAngle float = -1.570795; };lowerVerticalAngle
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 = "none");eye XRWebGLSubImage getViewSubImage (XRProjectionLayer ,layer XRView );view undefined foveateBoundTexture (GLenum ,target float ); };fixed_foveation
init 字典 不应是可选的。这是 bikeshed 议题 1566。
每个 XRWebGLBinding
都有一个类型为 XRWebGLRenderingContext
的 context 对象,该对象是
WebGLRenderingContext
或 WebGL2RenderingContext
的实例。
每个 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)
构造函数在被调用时必须执行以下步骤:
-
令 binding 为在 session 的相关 Realm 中新建的
XRWebGLBinding。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
如果 session 不是沉浸式会话,则抛出
InvalidStateError并中止这些步骤。 -
如果 context 的 XR compatible 布尔值为
false,则抛出InvalidStateError并中止这些步骤。 -
将 binding 的 context 初始化为 context。
-
将 binding 的 session 初始化为 session。
-
将 binding 添加到 session 的 bindings。
-
返回 binding。
nativeProjectionScaleFactor
函数返回一个值,session 的推荐 WebGL 帧缓冲区分辨率
必须乘以该值,才能得到 session 的原生 WebGL 帧缓冲区分辨率。
如果尺寸导致布局变化,
则需要特殊处理 UA 行为(即,如果请求的宽度超过 "stereo-left-right"
的限制)
usesDepthValues 属性如果为
false,表示如果存在深度缓冲附件,
XR
Compositor 不得使用其中的值。当该属性
为 true 时,表示深度缓冲附件的内容将由
XR
Compositor 使用,并且预期代表渲染到该层中的场景。
要使用 XRTextureType
textureType、XRWebGLRenderingContext
context 和 XRLayerLayout
layout 确定 layout 属性,用户代理必须运行以下步骤:
-
如果 context 不是
WebGL2RenderingContext, 且 textureType 为"texture-array", 则抛出TypeError并中止这些步骤。 -
如果 textureType 为
"texture-array", 且会话视图列表中的所有视图并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出NotSupportedError并中止这些步骤。 -
如果 layout 为
"mono", 返回 layout 并中止这些步骤。 -
如果 layout 为
"default", 则运行以下步骤:-
如果 textureType 为
"texture-array", 返回 layout 并中止这些步骤。
-
如果 layout 为
"default"或"stereo", 且 textureType 为"texture", 则运行以下步骤:-
如果用户代理偏好
"stereo-left-right"布局,则返回"stereo-left-right"并中止这些步骤。 -
如果用户代理偏好
"stereo-top-bottom"布局,则返回"stereo-top-bottom"并中止这些步骤。
-
-
返回 layout。
要使用 XRSession
session、XRWebGLRenderingContext
context 和 XRLayerLayout
layout 确定最大 scalefactor,用户代理必须运行以下步骤:
-
令 largest width 为来自 session 的视图列表中(不包括辅助视图)推荐 WebGL 颜色纹理 分辨率的最大宽度。
-
令 largest height 为来自 session 的视图列表中(不包括辅助视图)推荐 WebGL 颜色纹理 分辨率的最大高度。
-
如果 layout 为
"stereo-left-right"布局,则将 largest width 乘以2。 -
如果 layout 为
"stereo-top-bottom"布局,则将 largest height 乘以2。 -
令 largest view dimension 为 largest width 或 largest height 中较大的那个。
-
令 largest texture dimension 为由 context 创建的
WebGLTexture的最大尺寸。 -
返回 largest texture dimension 除以 largest view dimension。
要使用 XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat 和 float scaleFactor 为投影层分配颜色纹理,
用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
令 session 为 layer 的 session。
-
令 width 为 view 的推荐 WebGL 颜色纹理 分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 颜色纹理 分辨率的高度乘以 scaleFactor。
-
如果 textureFormat 不在投影层颜色格式列表中, 则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为"mono"或"default":- 如果 textureType 为
"texture-array": - 如果会话视图列表中的视图(不包括辅助视图)并非都具有相同的推荐 WebGL 颜色纹理
分辨率,则抛出
NotSupportedError并中止这些步骤。- 使用 1 个在 context 的相关 Realm 中新建的不透明 纹理实例初始化 array,该实例创建为一个使用 context、textureFormat、 width 和 height、具有 numViews 层的
TEXTURE_2D_ARRAY纹理。- 如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 使用 1 个在 context 的相关 Realm 中新建的不透明 纹理实例初始化 array,该实例创建为一个使用 context、textureFormat、 width 和 height、具有 numViews 层的
- 否则
-
对 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 width 为 view 的推荐 WebGL 颜色纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 颜色纹理分辨率的高度乘以 scaleFactor。
-
令 texture 为在 context 的相关 Realm 中新建 的不透明纹理实例,该实例创建为一个 使用 context、textureFormat、width 和 height 的
TEXTURE_2D纹理。 -
如果出于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、textureFormat、 numViews 乘以 width 和 height 的 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、textureFormat、 width 和 numViews 乘以 height 的 textureType 纹理。 -
如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。 -
返回 array。
要使用 XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat 和 float scaleFactor 为投影层分配深度纹理,
用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
令 session 为 layer 的 session。
-
如果 textureFormat 为
0,则返回 array 并中止这些步骤。 -
如果 context 是
WebGLRenderingContext, 且WEBGL_depth_texture扩展未在 context 中启用,则返回 array 并中止这些步骤。 -
如果 textureFormat 不在投影层深度格式列表中, 则抛出
NotSupportedError并中止这些步骤。 -
令 width 为 view 的推荐 WebGL 深度纹理 分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 深度纹理 分辨率的高度乘以 scaleFactor。
-
如果 layer 的
layout为"mono"或"default":- 如果 textureType 为
"texture-array": - 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,该实例创建为一个使用 context、textureFormat、
stencil、width 和 height、具有 numViews 层的
TEXTURE_2D_ARRAY纹理。- 如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 如果出于任何原因无法创建该不透明 纹理,则抛出
- 否则
-
对 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 width 为 view 的推荐 WebGL 深度纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 深度纹理分辨率的高度乘以 scaleFactor。
-
令 texture 为在 context 的相关 Realm 中新建 的不透明纹理实例,该实例创建为一个 使用 context、textureFormat、stencil、 width 和 height 的
TEXTURE_2D纹理。 -
如果出于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐 WebGL 颜色纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、textureFormat、 stencil、numViews 乘以 width 和 height 的 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、textureFormat、 stencil、width 和 numViews 乘以 height 的 textureType 纹理。 -
如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。 -
返回 array。
要使用 XRProjectionLayer
layer为投影层分配运动向量纹理,
用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
令 session 为 layer 的 session。
-
如果 session 不是使用 "space-warp" 特性描述符创建的,则返回 array 并中止 这些步骤。
-
如果 context 是
WebGLRenderingContext, 且WEBGL_depth_texture扩展未在 context 中启用,则返回 array 并中止这些步骤。 -
令 width 为 view 的推荐运动向量纹理 分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐运动向量纹理 分辨率的高度乘以 scaleFactor。
-
如果 layer 的
layout为"mono"或"default":- 如果 textureType 为
"texture-array": - 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,该实例创建为一个使用 context、
RGBA16F、 width 和 height、具有 numViews 层的TEXTURE_2D_ARRAY纹理。- 如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 如果出于任何原因无法创建该不透明 纹理,则抛出
- 否则
-
对 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 width 为 view 的推荐 运动向量纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 运动向量纹理分辨率的高度乘以 scaleFactor。
-
令 texture 为在 context 的相关 Realm 中新建 的不透明纹理实例,该实例创建为一个 使用 context、
RGBA16F、 width 和 height 的TEXTURE_2D纹理。 -
如果出于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果会话视图列表中的视图(不包括辅助 视图)并非都具有相同的推荐运动向量纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、RGBA16F、 numViews 乘以 width 和 height 的 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context、RGBA16F、 width 和 numViews 乘以 height 的 textureType 纹理。 -
如果出于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。 -
返回 array。
要使用 XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat 和 float scaleFactor为辅助视图分配颜色纹理,
用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
令 session 为 layer 的 session。
-
如果 textureFormat 不在投影层颜色格式列表中, 则抛出
NotSupportedError并中止这些步骤。 -
对 session 的视图列表中的每个 view:
-
如果 view 不是辅助视图,则继续。
-
令 width 为 view 的推荐 WebGL 颜色 纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 颜色 纹理分辨率的高度乘以 scaleFactor。
-
按如下方式初始化 texture:
- 如果 textureType 为
"texture-array": - 令 texture 为在 context 的相关 Realm 中新建的不透明纹理实例,
该实例创建为一个使用 context、textureFormat、width 和
height 的
TEXTURE_2D_ARRAY纹理。 - 否则
- 令 texture 为在 context 的相关 Realm 中新建的不透明纹理实例,
该实例创建为一个使用 context、textureFormat、width 和
height 的
TEXTURE_2D纹理。
- 如果 textureType 为
-
如果出于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
-
-
返回 array 并中止这些步骤。
要使用 XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat 和 float scaleFactor为辅助视图分配深度纹理,
用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
令 session 为 layer 的 session。
-
如果 textureFormat 为
0,则返回 array 并中止这些步骤。 -
如果 context 是
WebGLRenderingContext, 且WEBGL_depth_texture扩展未在 context 中启用,则返回 array 并中止这些步骤。 -
如果 textureFormat 不在投影层深度格式列表中, 则抛出
NotSupportedError并中止这些步骤。 -
对 session 的视图列表中的每个 view:
-
如果 view 不是辅助视图,则继续。
-
令 width 为 view 的推荐 WebGL 深度 纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐 WebGL 深度 纹理分辨率的高度乘以 scaleFactor。
-
按如下方式初始化 texture:
- 如果 textureType 为
"texture-array": - 令 texture 为在 context 的相关 Realm 中新建的不透明纹理实例,
该实例创建为一个使用 context、textureFormat、stencil、
width 和 height 的
TEXTURE_2D_ARRAY纹理。 - 否则
- 令 texture 为在 context 的相关 Realm 中新建的不透明纹理实例,
该实例创建为一个使用 context、textureFormat、stencil、
width 和 height 的
TEXTURE_2D纹理。
- 如果 textureType 为
-
将 texture 追加到 array。
-
-
返回 array 并中止这些步骤。
要使用 XRCompositionLayer
layer、XRTextureType
textureType 和 XRLayerInit
init分配颜色
纹理,用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
如果 init 的
colorFormat不在非投影层颜色格式列表中, 则抛出NotSupportedError并中止这些步骤。 -
如果 init 的
mipLevels小于1,则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
mipLevels大于1,且viewPixelWidth和viewPixelHeight不是2的幂,则抛出InvalidStateError并中止这些步骤 -
- 如果 textureType 为
"texture-array": - 使用 1 个在 this context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 1 个内部纹理的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值的TEXTURE_2D纹理。
- 如果 textureType 为
-
- 如果 textureType 为
"texture-array": - 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 2 层的TEXTURE_2D_ARRAY纹理。- 返回 array 并中止这些步骤。
- 否则
- 使用 2 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值的TEXTURE_2D纹理。- 返回 array 并中止这些步骤。
- 如果 textureType 为
-
如果 layer 的
layout为stereo-left-right, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth的两倍和viewPixelHeight值的 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth和viewPixelHeight的两倍值的 textureType 纹理。 -
返回 array。
要使用 XRCompositionLayer
layer、XRTextureType
textureType 和 XRLayerInit
init分配深度
纹理,用户代理必须运行以下步骤:
-
令 context 为 layer 的 context。
-
如果未设置 init 的
depthFormat, 则返回 array 并中止这些步骤。 -
如果 init 的
depthFormat不在非投影层深度格式列表中, 则抛出NotSupportedError并中止这些步骤。 -
如果 init 的
mipLevels小于1,则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
mipLevels大于1,且viewPixelWidth和viewPixelHeight不是2的幂,则抛出InvalidStateError并中止这些步骤。 -
- 如果 textureType 为
"texture-array": - 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 1 个内部纹理的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值的TEXTURE_2D纹理。
- 如果 textureType 为
-
- 如果 textureType 为
"texture-array": - 使用 1 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 2 层的TEXTURE_2D_ARRAY纹理。- 返回 array 并中止这些步骤。
- 否则
- 使用 2 个在 context 的相关 Realm 中新建的不透明
纹理实例初始化 array,
该实例创建为一个使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值的TEXTURE_2D纹理。- 返回 array 并中止这些步骤。
- 如果 textureType 为
-
如果 layer 的
layout为stereo-left-right, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth的两倍和viewPixelHeight值的 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用 1 个在 context 的相关 Realm 中新建的不透明纹理 实例初始化 array,该实例创建为一个使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和viewPixelHeight的两倍值的 textureType 纹理。 -
返回 array。
createProjectionLayer(optional XRProjectionLayerInit init)
方法创建一个新的 XRProjectionLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
令 layer 为在 this 的相关 Realm 中新建的
XRProjectionLayer。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
将 layer 的 isStatic 初始化为
false。 -
按如下方式初始化 layer 的
ignoreDepthValues:- 如果 init 的
depthFormat为false,并且 XR Compositor 将使用深度值 - 将 layer 的
ignoreDepthValues初始化为false - 否则
- 将 layer 的
ignoreDepthValues初始化为true
- 如果 init 的
-
将 layer 的
fixedFoveation初始化为0。 -
令 layout 为使用 init 的
textureType、 context 和"default"确定 layout 属性的结果。 -
令 maximum scalefactor 为使用 session、context 和 layout 确定最大 scalefactor的结果。
-
如果
scaleFactor大于 maximum scalefactor,则将scaleFactor设置为 maximum scalefactor。 -
将 layer 的
layout初始化为 layout。 -
将 layer 的
needsRedraw初始化为true。 -
令 layer 的 colorTextures 为使用 layer、init 的
textureType、 init 的colorFormat和 init 的scaleFactor为投影层分配颜色纹理的结果。 -
令 layer 的 depthStencilTextures 为使用 layer、init 的
textureType、 init 的depthFormat和 init 的scaleFactor为投影层分配深度纹理的结果。 -
令 layer 的 motionVectorTextures 为使用 layer、init 的
depthFormat和 init 的scaleFactor为投影层分配运动向量 纹理的结果。 -
按如下方式初始化 辅助视图的 colortextures:
- 如果 session 是在启用 "secondary-views" 的情况下创建的
- 令辅助视图的
colortextures为使用 layer、init 的
textureType、 init 的colorFormat和 init 的scaleFactor为辅助视图分配颜色 纹理的结果。 - 否则
- 令辅助视图的
colortextures为
null。
-
按如下方式初始化 辅助视图的 depthstenciltextures:
- 如果 session 是在启用 "secondary-views" 的情况下创建的
- 令辅助视图的
depthstenciltextures为使用 layer、init 的
textureType、 init 的depthFormat和 init 的scaleFactor为辅助视图分配深度 纹理的结果。 - 否则
- 令辅助视图的
depthstenciltextures为
null。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createQuadLayer(XRQuadLayerInit init)
方法创建一个新的 XRQuadLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下 创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XRQuadLayer。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
使用 layer 和 init 运行初始化四边形层。
-
令 layout 为使用 init 的
textureType、 context 和 init 的layout确定 layout 属性的结果。 -
将 layer 的
layout初始化为 layout。 -
将 layer 的
needsRedraw初始化为true。 -
令 layer 的 colorTextures 为使用 layer、init 的
textureType和 init 分配颜色 纹理的结果。 -
令 layer 的 depthStencilTextures 为使用 layer、 init 的
textureType和 init 分配深度纹理的结果。 -
令 layer 的 motionVectorTextures 为在 context 的相关 Realm 中新建的数组。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createCylinderLayer(XRCylinderLayerInit init)
方法创建一个新的 XRCylinderLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下 创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XRCylinderLayer。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
使用 layer 和 init 运行初始化圆柱层。
-
令 layout 为使用 init 的
textureType、 context 和 init 的layout确定 layout 属性的结果。 -
将 layer 的
layout初始化为 layout。 -
将 layer 的
needsRedraw初始化为true。 -
令 layer 的 colorTextures 为使用 layer、init 的
textureType和 init 分配颜色 纹理的结果。 -
令 layer 的 depthStencilTextures 为使用 layer、 init 的
textureType和 init 分配深度纹理的结果。 -
令 layer 的 motionVectorTextures 为在 context 的相关 Realm 中新建的数组。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createEquirectLayer(XREquirectLayerLayerInit init)
方法创建一个新的 XREquirectLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下 创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
如果 init 的
space不是XRReferenceSpace类型的实例, 则抛出TypeError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XREquirectLayer。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
使用 layer 和 init 运行初始化等矩形层。
-
令 layout 为使用 init 的
textureType、 context 和 init 的layout确定 layout 属性的结果。 -
将 layer 的
layout初始化为 layout。 -
将 layer 的
needsRedraw初始化为true。 -
令 layer 的 colorTextures 为使用 layer、init 的
textureType和 init 分配颜色 纹理的结果。 -
令 layer 的 depthStencilTextures 为使用 layer、 init 的
textureType和 init 分配深度纹理的结果。 -
令 layer 的 motionVectorTextures 为在 context 的相关 Realm 中新建的数组。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createCubeLayer(XRCubeLayerInit init)
方法创建一个新的 XRCubeLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下 创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 不是
WebGL2RenderingContext上下文,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
如果 init 的
space不是XRReferenceSpace类型的实例, 则抛出TypeError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XRCubeLayer。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
按如下方式初始化 layer 的
orientation:- 如果设置了 init 的
orientation - 令 layer 的
orientation为使用 init 的orientation运行fromPoint的结果。 - 否则
- 令 layer 的
orientation为在 this 的相关 Realm 中新建的DOMPointReadOnly。
- 如果设置了 init 的
-
令 layout 为 init 的
layout。 -
令 textureType 为 init 的
textureType。 -
将 layer 的
needsRedraw初始化为true。 -
如果 layout 为
"default"或"stereo-left-right"或"stereo-top-bottom", 则抛出TypeError并中止这些步骤。 -
令 layer 的 colorTextures 为在此
XRCubeLayer的相关 Realm 中新建的数组。 -
根据 layout 的值,按如下方式初始化 layer 的 colorTextures:
-
- 如果 textureType 为
"texture-array": - 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 6 层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 context 和 init 的colorFormat、viewPixelWidth和viewPixelHeight值的TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
否则,如果 layer 的
layout为"stereo":- 如果 textureType 为
"texture-array": - 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 12 层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 2 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 colorTextures, 该实例创建为一个使用 context 和 init 的colorFormat、viewPixelWidth和viewPixelHeight值的TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
-
令 layer 的 depthStencilTextures 为在此
XRCubeLayer的相关 Realm 中新建的数组。 -
令 layer 的 motionVectorTextures 为在此
XRCubeLayer的相关 Realm 中新建的数组。 -
如果设置了 init 的
depthFormat, 则按如下方式初始化 layer 的 depthStencilTextures:-
如果 context 不是
WebGL2RenderingContext且WEBGL_depth_texture扩展未在 context 中启用,则抛出TypeError并中止这些步骤。 -
- 如果 textureType 为
"texture-array": - 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 6 层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 context 和 init 的depthFormat、viewPixelWidth和viewPixelHeight值的TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
否则,如果 layer 的
layout为"stereo":- 如果 textureType 为
"texture-array": - 使用 1 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值、具有 12 层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用 2 个在此
XRCubeLayer的相关 Realm 中新建的不透明纹理实例初始化 depthStencilTextures, 该实例创建为一个使用 context 和 init 的depthFormat、viewPixelWidth和viewPixelHeight值的TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 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 开始存储。
确定 orientation
的初始状态。
要对一个带有 XRCompositionLayer
layer 和 XRFrame
frame 参数的 XRWebGLBinding
binding 的 XRWebGLSubImage 创建函数的
状态进行验证,用户代理必须运行以下步骤:
-
如果 frame 的 active 布尔值为
false,则返回false并中止这些步骤。 -
如果 frame 的 animationFrame 布尔值为
false,则返回false并中止这些步骤。 -
如果 binding 的 session 不等于 layer 的 session,则返回
false并中止 这些步骤。 -
如果 binding 的 context 不等于 layer 的 context,则返回
false并中止 这些步骤。 -
如果 layer 的 colorTextures 数组为空或缺失,则返回
false并中止这些步骤。 -
如果 layer 的 isStatic 为
true且 layer 的needsRedraw为false,则返回false并中止这些步骤。 -
返回
true。
要使用一个不透明纹理
texture、一个 XRLayerLayout
layout、一个整数 offset 和一个整数 num 初始化
XRViewport
viewport 的视口,用户代理必须运行
以下步骤:
-
将 viewport 的
x设置为0。 -
将 viewport 的
y设置为0。 -
将 viewport 的
width设置为 texture 的像素宽度。 -
将 viewport 的
height设置为 texture 的像素高度。 -
按如下方式更新 viewport:
- 如果 layout 为
"stereo-left-right" - 将 viewport 的
x设置为 texture 的像素宽度乘以 offset 再除以 num。- 将 viewport 的
width设置为 subimage 的 texture 的像素宽度除以 num。 - 将 viewport 的
- 否则,如果 layout 为
"stereo-top-bottom" - 将 viewport 的
y设置为 texture 的像素高度乘以 offset 再除以 num。- 将 viewport 的
height设置为 subimage 的 texture 的像素高度除以 num。 - 将 viewport 的
- 如果 layout 为
getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none")
方法创建一个新的 XRWebGLSubImage。
当此方法在 XRWebGLBinding
binding 上调用时,它必须运行以下步骤:
-
按如下方式初始化 subimage:
- 如果之前曾使用相同的 binding、layer 和 eye
调用过
getSubImage(), 用户代理可以 - 令 subimage 为先前使用相同实参调用时返回的同一个
XRWebGLSubImage对象。 - 否则
- 令 subimage 为在 this 的相关 Realm 中新建的
XRWebGLSubImage。- 令 subimage 的
viewport为在 this 的相关 Realm 中新建的XRViewport。 - 令 subimage 的
- 如果之前曾使用相同的 binding、layer 和 eye
调用过
-
如果 layer 的类型为
XRProjectionLayer, 则抛出TypeError并中止这些步骤。 -
令 index 为
0。 -
如果 layer 的
layout属性为"stereo":-
如果 eye 为
"right":- 如果 layer 的类型为
XRCubeLayer - 将 index 设置为
6 - 否则
- 将 index 设置为
1
- 如果 layer 的类型为
-
如果使用 layer 和 frame 验证 XRWebGLSubImage 创建函数的状态的结果为
false,则抛出InvalidStateError并中止这些步骤。 -
按如下方式初始化 subimage 的
imageIndex:- 如果 layer 是使用
"texture-array"textureType 创建的 - 将 subimage 的
imageIndex初始化为 index。 - 否则
- 将 subimage 的
imageIndex初始化为0。
- 如果 layer 是使用
-
按如下方式初始化 subimage 的
colorTexture:- 如果 layer 是使用
"texture"textureType 创建的 - 将 subimage 的
colorTexture初始化为 layer 的 colorTextures 数组中偏移量为 index 的元素。 - 否则
- 将 subimage 的
colorTexture初始化为 layer 的 colorTextures 数组的第一个元素。
- 如果 layer 是使用
-
按如下方式初始化 subimage 的
depthStencilTexture:- 如果 layer 的 depthStencilTextures 是空数组
- 将 subimage 的
depthStencilTexture初始化为null。 - 否则,layer 是使用
"texture"textureType 创建的 - 将 subimage 的
depthStencilTexture初始化为 layer 的 depthStencilTextures 数组中偏移量为 index 的元素。 - 否则
- 将 subimage 的
depthStencilTexture初始化为 layer 的 depthStencilTextures 数组的第一个元素。
-
将 subimage 的
motionVectorTexture、motionVectorTextureWidth和motionVectorTextureHeight初始化为null。 -
将 subimage 的
colorTextureWidth设置为 subimage 的colorTexture的像素宽度。 -
将 subimage 的
colorTextureHeight设置为 subimage 的colorTexture的像素高度。 -
如果 subimage 的
depthStencilTexture不是null,则将 subimage 的depthStencilTextureWidth设置为depthStencilTexture数组中第一个纹理的像素宽度。 -
如果 subimage 的
depthStencilTexture不是null,则将 subimage 的depthStencilTextureHeight设置为depthStencilTexture数组中第一个纹理的像素高度。 -
令 viewsPerTexture 为
1。 -
如果 layer 的
layout属性为"stereo-left-right"或"stereo-top-bottom", 则将 viewsPerTexture 设置为2。 -
使用 subimage 的
colorTexture、 layer 的layout、 index 和 viewsPerTexture,在 subimage 的viewport上运行初始化视口。 -
排队一个任务,将
needsRedraw设置为false。 -
返回 subimage。
getViewSubImage(XRProjectionLayer layer, XRView view)
方法创建一个新的 XRWebGLSubImage。
当此方法在 XRWebGLBinding
binding 上调用时,它必须运行以下步骤:
-
按如下方式初始化 subimage:
- 如果之前曾使用相同的 binding、layer 和
view 调用过
getViewSubImage(), 用户代理可以 - 令 subimage 为先前使用相同实参调用时返回的同一个
XRWebGLSubImage对象。 - 否则
- 令 subimage 为在 this 的相关 Realm 中新建的
XRWebGLSubImage。- 令 subimage 的
viewport为在 this 的相关 Realm 中新建的XRViewport。 - 令 subimage 的
- 如果之前曾使用相同的 binding、layer 和
view 调用过
-
令 frame 为 view 的
frame。 -
如果使用 layer 和 frame 验证 XRWebGLSubImage 创建函数的状态的结果为
false,则抛出InvalidStateError并中止这些步骤。 -
如果 view 的 active 标志为
false,则抛出InvalidStateError并中止这些步骤。 -
按如下方式初始化 index:
-
按如下方式初始化 subimage 的
imageIndex:- 如果 layer 是使用
"texture-array"textureType 创建的: - 将 subimage 的
imageIndex初始化为 index。 - 否则
- 将 subimage 的
imageIndex初始化为0。
- 如果 layer 是使用
-
按如下方式初始化 subimage 的
colorTexture:- 如果 view 是来自 session 的视图列表的辅助视图
- 将 subimage 的
colorTexture初始化为 layer 的 辅助视图的 colorTextures 中偏移量为 index 的元素。 - 否则,如果 layer 的
layout为"default"且 layer 是使用"texture"textureType 创建的 - 将 subimage 的
colorTexture初始化为 layer 的 colorTextures 数组中偏移量为 index 的元素。 - 否则
- 将 subimage 的
colorTexture初始化为 layer 的 colorTextures 数组的第一个元素。
-
按如下方式初始化 subimage 的
depthStencilTexture:- 如果 layer 的 depthStencilTextures 是空数组
- 将 subimage 的
depthStencilTexture初始化为null。 - 否则,如果 view 是来自 session 的视图列表的辅助视图
- 将 subimage 的
colorTexture初始化为 layer 的 辅助视图的 depthStencilTextures 中偏移量为 index 的元素。 - 否则,如果 layer 的
layout为"default"且 layer 是使用"texture"textureType 创建的 - 将 subimage 的
depthStencilTexture初始化为 layer 的 depthStencilTextures 数组中偏移量为 index 的元素。 - 否则
- 将 subimage 的
depthStencilTexture初始化为 layer 的 depthStencilTextures 数组的第一个元素。
-
按如下方式初始化 subimage 的
motionVectorTexture:- 如果 layer 的 motionVectorTextures 是空数组,或 view 是来自 session 的视图列表的辅助视图
- 将 subimage 的
motionVectorTexture初始化为null。 - 否则,layer 是使用
"texture"textureType 创建的 - 将 subimage 的
motionVectorTexture初始化为 layer 的 motionVectorTextures 数组中偏移量为 index 的元素。 - 否则
- 将 subimage 的
motionVectorTexture初始化为 layer 的 motionVectorTextures 数组的第一个元素。
-
将 subimage 的
colorTextureWidth设置为 subimage 的colorTexture的像素宽度。 -
将 subimage 的
colorTextureHeight设置为 subimage 的colorTexture的像素高度。 -
如果 subimage 的
depthStencilTexture不是null,则将 subimage 的depthStencilTextureWidth设置为depthStencilTexture数组中第一个纹理的像素宽度。 -
如果 subimage 的
depthStencilTexture不是null,则将 subimage 的depthStencilTextureHeight设置为depthStencilTexture数组中第一个纹理的像素高度。 -
如果 subimage 的
motionVectorTexture不是null,则将 subimage 的motionVectorTextureWidth设置为motionVectorTexture数组中第一个纹理的像素宽度。 -
如果 subimage 的
motionVectorTexture不是null,则将 subimage 的motionVectorTextureHeight设置为motionVectorTexture数组中第一个纹理的像素高度。 -
使用 subimage 的
colorTexture、 layer 的layout、 index 和 session 的视图列表的数量,在 subimage 的viewport上运行初始化视口。 -
将
needsRedraw设置为false。 -
返回 subimage
注: 会话应尽量将 getSubImage()
和 getViewSubImage()
的调用推迟到体验开始使用 WebGL 绘制时。
通常这会在游戏逻辑运行之后。在某些用户代理中,为依赖 CPU 和
GPU 的代码设置不同阶段,可以让它们动态优化系统资源。
foveateBoundTexture(GLenum target, float fixed_foveation)
将凹区化应用到当前绑定的纹理或纹理数组。
当此方法在 XRWebGLBinding
binding 上调用时,它必须运行以下步骤:
-
如果 target 不是
TEXTURE_2D或TEXTURE_2D_ARRAY类型,则抛出InvalidStateError并中止这些步骤。 -
如果用户代理或设备不支持凹区化,则中止这些步骤。
-
如果 fixed_foveation 小于
0,则将其设置为0。 -
如果 fixed_foveation 大于
1,则将其设置为1。 -
如果在 binding 的 context 中没有纹理绑定到 target, 则抛出
InvalidStateError并中止这些步骤。 -
使用与
fixedFoveation相同的算法,通过 binding 的 context 将 fixed_foveation 应用于 target。 -
将使用 binding 的 context 绑定到 target 的纹理添加到 foveatedTextures。
注: 凹区化的效果会立即生效。
当 XRLayer
是 layers
数组的成员时,它必须在一个 XR 动画帧完成后立即呈现给沉浸式 XR
设备,但前提是自上一个 XR 动画
帧以来至少发生了以下一种情况:
-
XRLayer是XRWebGLLayer, 且在与该XRWebGLLayer关联的WebGLRenderingContext的不透明帧缓冲区为当前绑定帧缓冲区时,调用了clear、drawArrays、drawElements或任何其他类似影响帧缓冲区颜色值的渲染操作。 -
XRLayer是XRCompositionLayer, 且调用了getSubImage()或getViewSubImage(), 并且调用了任何影响colorTexture纹理颜色值的渲染操作。
在将不透明帧缓冲区或 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 = 2.0;radius float = 0.78539;centralAngle float ?; };aspectRatio
7.4. XRMediaEquirectLayerInit
XRMediaEquirectLayerInit
字典表示一组可配置值,用于描述包含视频的 XREquirectLayer
如何初始化。
dictionary :XRMediaEquirectLayerInit XRMediaLayerInit {XRRigidTransform ?;transform float = 0.0;radius float = 6.28318;centralHorizontalAngle float = 1.570795;upperVerticalAngle float = -1.570795; };lowerVerticalAngle
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 设备或视频的原生帧率
进行更新,取两者中较低者。
注: 层中只会显示视频帧。视频控件应由作者实现,并且必须 绘制在另一个层中。
XRCompositionLayer
layer 和 HTMLVideoElement
media 的层需要渲染时,用户代理
必须运行以下步骤:
-
令 usability 为检查 media 可用性的结果。
-
如果 usability 为
bad,则用透明黑色填充 layer, 并中止这些步骤。 -
用 media 元素的内容填充 layer。
XRMediaBinding(XRSession session)
构造函数在被调用时
必须执行以下步骤:
-
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 session 不是沉浸式会话,则抛出
InvalidStateError并中止这些步骤。 -
令 binding 为在 session 的相关 Realm 中新建的
XRMediaBinding。 -
将 binding 的 session 初始化为 session。
-
返回 binding。
HTMLVideoElement
video 和一个 XRLayerLayout
layout 的宽高比,
运行以下步骤:
-
令 width 为 video 的
videoWidth。 -
令 height 为 video 的
videoHeight。 -
如果 layout 为
"stereo-left-right", 则将 width 除以2。 -
如果 layout 为
"stereo-top-bottom", 则将 height 除以2。 -
返回 width 除以 height。
createQuadLayer(HTMLVideoElement video, XRMediaQuadLayerInit init)
方法创建一个新的 XRQuadLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XRQuadLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的 media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
如果 init 的
height为undefined,则将height设置为width除以 aspectRatio。 -
如果 init 的
width为undefined,则将width设置为height乘以 aspectRatio。 -
使用 layer 和 init 运行初始化四边形层。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createCylinderLayer(HTMLVideoElement video, XRMediaCylinderLayerInit init)
方法创建一个新的 XRCylinderLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XRCylinderLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的 media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
如果 init 的
aspectRatio为undefined,则将aspectRatio设置为 aspectRatio。 -
使用 layer 和 init 运行初始化圆柱层。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createEquirectLayer(HTMLVideoElement video, XRMediaEquirectLayerInit init)
方法创建一个新的 XREquirectLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 不是在启用 "layers" 的情况下创建的,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
space不是XRReferenceSpace类型的实例, 则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
space具有"viewer"的type, 则抛出InvalidStateError并中止这些步骤。 -
令 layer 为在 this 的相关 Realm 中新建的
XREquirectLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的 media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
使用 layer 和 init 运行初始化等矩形层。
-
如果 XR Compositor 知道出于任何原因将无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 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" 特性
描述符创建的,则 XRProjectionLayer、
XRQuadLayer
和 XRCylinderLayer
层必须根据其深度显示,而不是根据在 layers
数组中的位置显示。
其他层类型必须继续像以前一样排序。
XRQuadLayer
和 XRCylinderLayer
层必须根据其尺寸(例如 width
或 centralAngle)、
transform 和 space 进行排序。
XRProjectionLayer
层必须按照其 depthStencilTexture
中的值进行排序。
这也意味着,如果启用了 "depth-sorted-layers",则 XR Compositor 必须使用深度值,并且 ignoreDepthValues
和 usesDepthValues
必须设置为 `true`。
10. 空间扭曲
空间扭曲是一种
改进 XR Compositor 重投影的技术。
通过同时提交 motionVectorTexture
和 depthStencilTexture,
XR 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
扩展 XRRenderStateInit
和 XRRenderState
接口,该数组包含
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 不得对层应用任何深度排序。
注: 这意味着每个层都可能 覆盖之前的层,无论之前的层在虚拟空间中是否更接近观看者。
11.2. updateRenderState 变更
此模块替换 WebXR 规范中由 "更新待处理 layers 状态" 给出的步骤。取而代之,当用户代理将使用 XRSession
session 和 XRRenderStateInit
newState
更新待处理 layers 状态时,必须运行以下步骤:
-
如果 newState 的
baseLayer和 newState 的layers都已设置,则抛出NotSupportedError并中止这些步骤。 -
令 activeState 为 session 的活动渲染状态。
-
如果设置了 newState 的
baseLayer: -
如果设置了 newState 的
layers:-
如果 session 不是在启用 "layers" 的情况下创建的,并且 newState 的
layers包含超过1个实例,则抛出NotSupportedError并中止这些步骤。 -
如果 newState 的
layers包含超过maxRenderLayers个条目,则抛出NotSupportedError并中止这些步骤。 -
如果 session 的待处理渲染状态为
null, 则将其设置为 activeState 的副本。 -
对于 newState 的
layers中的每个 layer:-
如果 layer 是
XRCompositionLayer且 layer 的 session 不同于 session,则抛出TypeError并中止这些步骤。 -
如果 layer 是
XRWebGLLayer且 layer 的 session 不同于 session,则抛出TypeError并中止这些步骤。
-
-
11.3. XRCompositor 变更
XR Compositor 必须扩展,以便来自layers
数组的所有 XRLayer
实例同时合成。WebXR 的所有其他要求必须继续
适用。
如果 XR
Compositor 正在渲染到一个 view,其 XREye
为 "none",
并且正在绘制一个不是 XRProjectionLayer
且 layout
不是 "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. 动画帧变更
renderState
state
检查 layers
状态,
用户代理必须运行以下步骤:
11.6. XRSession 变更
此模块扩展并向 XRSession 接口添加以下内容:[SecureContext ,Exposed =Window ]partial interface XRSession {readonly attribute unsigned long maxRenderLayers ; };
maxRenderLayers 表示 compositor 必须处理的
最大层数,因此也表示任何 XRRenderStateInit
的
layers
数组的最大大小。应该可以在给定时间创建超过该数量的层。
注: 此指导并非旨在对用户代理可分配的层数量
设置限制,如层的分配中所述。用户代理可以允许例如创建 20 个层,
同时只允许一次通过 updateRenderState()
设置 10 个。还值得注意的是,由于不同层可能需要不同数量的后端能力或
对象,用户代理在设置 `maxRenderLayers` 值时具有一定自由裁量权,以确保至少
这么多层可以被渲染。不过,当传入更多层时,用户代理仍然需要拒绝,并且不能在传入更少层时拒绝 updateRenderState。
每个 XRSession
都有一个内部 WeakSet bindings,其中保存
对使用该会话创建的每个 XRWebGLBinding
的弱引用。
此模块向 WebXR 规范中的 "关闭 会话" 添加一个步骤。 将以下内容添加到列表中:
-
对于 session| 的 bindings 中的每个 binding:
-
对于 binding 的 foveatedTextures 中的每个 texture:
-
从 texture 移除凹区化。
-
12. 安全和隐私考量
12.1. 合成的时序
合成时序必须独立于所渲染的内容。 此外,一个层中的内容不得在其他层中被观察到。
如果可能,层的合成应该在浏览器之外进行,以降低时序攻击或 其他安全漏洞的风险。
12.2. 层的分配
用户代理可以限制任何资源分配,例如最大像素大小或 层数,以降低 GPU 硬件的可识别性。
变更
自 2020 年 12 月 3 日第一份公开工作 草案以来的变更
新特性:
-
为 XRCompositionLayer 添加对透明度的支持(GitHub #284
-
添加对跨层深度测试的支持(GitHub #271)
-
为 XRWebGLBinding 添加对 usesDepthValues 的支持(GitHub #269)
-
如果上下文中未启用深度支持,也允许创建投影层(GitHub #250)
-
添加返回已创建 mip 级别数量的支持(GitHub #245)
-
添加对 mipmapping 的支持(GitHub #243)
-
纹理大小属性(GitHub #241)
变更:
-
修复 layout 算法和不透明纹理清除中的小问题(GitHub #257)
-
阐明 aspectratio(GitHub #256)
-
添加一些关于层内存分配的表述(GitHub #255)
-
移除层创建中的同步 GPU 分配 + 在 getsubimage/getviewsubimage 中添加验证(GitHub #254)
-
对 getSubImage 和 getViewSubImage 的一些修复(GitHub #253)
-
修复缺失的并排纹理处理(GitHub #251)
-
向可选字典参数添加默认值 {}(GitHub #248)
-
将 foveation 移至投影层(GitHub #247)
-
将 textureLayers 重命名为 textureArrayLength(GitHub #242)
-
阐明不透明纹理总是在帧开始时初始化(GitHub #234)