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。
每个 XRCompositionLayer
都有一个关联的 destroyed 布尔值,初始值为 false。
destroy()
会立即将该层标记为已销毁,并使其图形资源无法用于
未来的渲染。
对一个已经销毁的层调用 destroy()
不会执行任何操作。
即使在应用待处理的渲染状态更新时,该层仍存在于 layers
数组中,已销毁的层也不得由 XR
合成器呈现。
如果调用某个方法来获取已销毁层的 XRSubImage,
则该方法必须抛出 InvalidStateError。
当其层被销毁时,先前返回的 XRSubImage
对象本身不会被销毁。它们的属性会继续返回相同的
对象和值,但这些对象公开的任何图形资源都必须失效,不能用于未来的
渲染操作。在资源失效之前排队的 GPU 工作可以完成。
要使用一个 XRCompositionLayer
layer 销毁层的资源,用户代理必须运行以下步骤:
-
对于 layer 的 colorTextures、depthStencilTextures 或 motionVectorTextures 数组中存在的每个不透明 纹理,将该纹理标记为待删除,就像已经在 layer 的上下文上以该纹理为参数调用了
deleteTexture一样。这是用户代理的内部操作,不得生成INVALID_OPERATION错误。 -
如果 layer 是
XRProjectionLayer:-
如果 layer 的辅助视图的 colorTextures 不是
null,则对于该 数组中的每个不透明纹理,以相同方式将该纹理标记为待删除。 -
如果 layer 的辅助视图的 depthStencilTextures 不是
null,则对于该 数组中的每个不透明纹理,以相同方式将该纹理标记为待删除。
-
-
如果 layer 有一个 colorTextures 数组,则将其设置为空数组。
-
如果 layer 有一个 depthStencilTextures 数组,则将其设置为空数组。
-
如果 layer 有一个 motionVectorTextures 数组,则将其设置为空数组。
-
如果 layer 是
XRProjectionLayer, 则将其辅助视图的 colorTextures 和辅助视图的 depthStencilTextures 设置为空数组。 -
对于 layer 的每个底层资源,一旦在资源失效之前排队的所有 GPU 工作 均已完成,并且 XR 合成器不再访问该资源,用户代理就可以实际释放该资源。
要使用一个 XRSession
session 和一个可选的 WebGLRenderingContext
或 WebGL2RenderingContext
实例 context 初始化合成层,用户代理必须运行以下步骤:
当在一个 XRCompositionLayer
layer 上调用 destroy()
时,用户代理必须运行以下步骤:
每个 XRCompositionLayer
都有一个 context 对象,它是 null 或 WebGLRenderingContext
或 WebGL2RenderingContext
的实例,并且还有一个 media
对象,它是 null 或 HTMLVideoElement
的实例。
每个 XRCompositionLayer
都有一个关联的 session,即创建它时使用的
XRSession。
当使用 XRSpace
space 和 XRCompositionLayer
layer 设置
层上的空间时,用户代理必须运行以下步骤,以验证 space 是否
有效:
XRCompositionLayer
有一个内部布尔值 isStatic,它表示作者只能在 needsRedraw
为 true 时向
此层绘制内容。
注:如果 isStatic 为
true,作者只能在创建后向该层绘制一次,或者在
redraw 事件后绘制一次。这使用户代理只需分配一个 GPU 缓冲区。
当在 XRCompositionLayer
或其任何派生类上设置一个可写属性时,
读取该属性必须返回该值。
在 requestAnimationFrame()
回调结束时,该值必须发送给
底层的 XR 合成器。XR 合成器必须
在下一次呈现传递给 requestAnimationFrame()
回调的 XRFrame
时应用该值。
注:这意味着,当
XR
合成器使用新的
XRFrame
重绘场景时,即使与 XRCompositionLayer
关联的 colorTexture
或与媒体层关联的视频帧没有发生变化,也必须应用这些值。如果
XR
合成器使用前一个 XRFrame
的
状态重绘场景,则不得使用这些新
值。
3.5. XRProjectionLayer
AnXRProjectionLayer
是一个填充观察者整个视图的层。
投影层应以接近设备原生帧率的频率刷新。

[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
合成器使用的注视点渲染程度。如果用户代理或设备不支持此属性,则
获取时应返回 null,设置时应为 no-op。
将 fixedFoveation
设置为小于 0 的值会将其设置为 0,而设置为
大于 1 的值会将其设置为 1。0 设置最小的
注视点渲染程度,而
1 设置最大的程度。由用户代理决定 XR 合成器
如何解释这些值。
如果 fixedFoveation
级别发生更改,它将在下一个 XRFrame
生效。
ignoreDepthValues 属性如果为
true,则表示
XR
合成器在渲染时不得使用深度缓冲区附件中的值。当该
属性
为 false 时,表示深度缓冲区附件的内容将由
XR
合成器使用,并且预期它能够代表渲染到该层中的场景。
deltaPose 属性描述自上一帧以来影响视图的、
由应用程序应用的增量变换(如果有)。
如果用户代理或设备不支持此属性,或者未请求“space-warp”特性描述符,则用户代理在获取时应返回
null,设置时应为 no-op。
null 值表示未提供由应用程序应用的变换。
deltaPose
的值会一直保持,直到作者更改它;用户代理不会在 requestAnimationFrame()
回调结束时将其重置。
当人工移动在帧之间将世界从一个应用程序姿态变换为另一个应用程序姿态时,将
deltaPose
设置为这些姿态之间的差值,有助于 XR 合成器
合成缺失的帧。
当该变换发生变化时,作者应更新 deltaPose,
并且对于未发生由应用程序应用的变换的帧,将其设置为 null 或恒等变换。
3.6. XRQuadLayer
AnXRQuadLayer
渲染一个在虚拟环境中占据平坦矩形空间的层。
只有该层的正面必须可见;背面不得由 XR 合成器绘制。
XRQuadLayer 没有厚度。它是一个在 3D 空间中定位和定向的二维对象。四边形的 位置 是指四边形的中心。

[Exposed =Window ]interface :XRQuadLayer XRCompositionLayer {attribute XRSpace space ;attribute XRRigidTransform transform ;attribute float width ;attribute float height ; // 事件attribute 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
AnXRCylinderLayer
渲染一个在虚拟环境中占据弯曲矩形空间的层。
只有该层的正面必须可见;背面不得由 XR 合成器绘制。

XRCylinderLayer 没有厚度。它是一个在 3D 空间中定位和定向的二维对象。圆柱的 位置 是指四边形的中心。
[Exposed =Window ]interface :XRCylinderLayer XRCompositionLayer {attribute XRSpace space ;attribute XRRigidTransform transform ;attribute float radius ;attribute float centralAngle ;attribute float aspectRatio ; // 事件attribute 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 合成器必须将等距柱状投影编码的数据映射到
球体的内表面。

[Exposed =Window ]interface :XREquirectLayer XRCompositionLayer {attribute XRSpace ;space attribute XRRigidTransform transform ;attribute float radius ;attribute float centralHorizontalAngle ;attribute float upperVerticalAngle ;attribute float lowerVerticalAngle ; // 事件attribute 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 合成器直接从立方体贴图进行渲染。

[Exposed =Window ]interface :XRCubeLayer XRCompositionLayer {attribute XRSpace space ;attribute DOMPointReadOnly orientation ; // 事件attribute 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 ; };
The colorTexture 属性返回用于
XRCompositionLayer
的颜色不透明纹理。
viewport
描述 colorTexture
中与所请求视图对应的区域。它不描述 depthStencilTexture
或 motionVectorTexture
的区域。
depthStencilTexture 属性返回
XRCompositionLayer
的深度/模板不透明
纹理。
如果该层创建时没有深度/模板,则此属性返回 null。
motionVectorTexture 属性返回
XRProjectionLayer
的运动不透明纹理。
如果 XRSession
创建时没有 space-warp 特性
描述符,或者该层不是 XRProjectionLayer,
则此属性必须返回 null。
imageIndex 属性返回纹理
数组中的偏移量。仅对请求时使用 texture-array
的层有效。
colorTextureWidth 和 colorTextureHeight 属性
返回 GL 颜色附件的像素宽度和高度。
depthStencilTextureWidth 和 depthStencilTextureHeight
属性
返回 GL 深度/模板附件的像素宽度和高度。如果该层创建时没有
深度/模板,则这些属性返回 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. 不透明纹理
When using WebXR GPU layers, theXRWebGLBinding
对象将为颜色和深度/模板附件返回不透明纹理的实例。
不透明纹理的功能
与标准 WebGLTexture
完全相同,但有以下变化:
-
不透明纹理在 其会话的
requestAnimationFrame()回调之外被视为无效。 -
不透明纹理在 由
getSubImage()或getViewSubImage()调用返回之前是无效的。 -
在
requestAnimationFrame()回调结束时,纹理必须解除绑定并与所有WebGLShader对象分离。 -
不透明纹理 必须表现得如同使用 texStorage2D 或 texStorage3D 适当地进行分配,即使使用 WebGL 1.0 上下文也是如此。
-
使用不透明 纹理调用
deleteTexture必须生成INVALID_OPERATION错误。
当 clearOnAccess
为 true 时,在每个 XR 动画帧中第一次调用 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 规范中的 “不可变格式 纹理图像” 一节更详细地定义了这些限制。
层资源(例如内存)的分配必须通过与 WebGL 相同的机制完成。
如果一个 XRLayer
使用 RGBA
或 RGB
colorFormat
进行分配,
则其 colorTextures 必须以
RGBA
或 RGB
的形式公开给 WebGLRenderingContext
上下文。
但是,XR
合成器必须将 colorTextures
的像素视为采用
SRGB8_ALPHA8
或 SRGB8
colorFormat。
注:这意味着 XR 合成器在处理
colorTextures 时,不得对线性的 RGBA
或 RGB
执行任何伽马转换。否则,最终渲染中的像素会显得
过亮,这与常规 2D WebGLRenderingContext
上下文中的渲染结果不匹配。
6.3. XRProjectionLayerInit
TheXRProjectionLayerInit
字典表示一组可配置的值,用于描述如何初始化 XRProjectionLayer。
dictionary {XRProjectionLayerInit XRTextureType textureType = "texture";GLenum colorFormat = 0x1908; // RGBAGLenum depthFormat = 0x1902; // DEPTH_COMPONENTdouble scaleFactor = 1.0;boolean clearOnAccess =true ; };
textureType 属性定义
该层所具有的纹理类型。
colorFormat 属性定义
颜色纹理数据的数据类型。
以下是 XR 合成器必须支持的投影层颜色格式列表:
对于 WebGL2 上下文,还支持以下格式:
depthFormat 属性定义
深度纹理数据的数据类型。
如果 depthFormat
为 0,则该层不会提供深度/模板纹理。
以下是 XR 合成器必须支持的投影层深度格式列表:
对于启用了“WEBGL_depth_texture”
扩展的 WebGLRenderingContext
上下文,或 WebGL2 上下文:
如果未启用该扩展,则对深度纹理的请求将被忽略。
注:这可能会让作者感到困惑,因为他们 可能期望获得深度纹理。如果可能,请提供警告,说明纹理未 创建的原因。
对于 WebGL2RenderingContext
上下文,还支持以下格式:
scaleFactor 属性定义
在确定该层附件的分辨率时,session 的
推荐的 WebGL 帧缓冲区分辨率必须
乘以的值。
clearOnAccess 属性
定义与此层关联的纹理是应在初始帧中清除,还是在每一帧中清除。
注:XRProjectionLayerInit
字典不像
XRLayerInit
那样支持配置 mipLevels。
如果用户代理希望在投影层上支持 mipmapping,则可以自由地为纹理分配
mip。
在这种情况下,由用户代理(而不是作者)负责生成所有 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 issue 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
数组,它是一个由用于颜色纹理的不透明纹理构成的
array;以及一个内部 辅助视图的
depthStencilTextures
数组,它是一个由用于渲染辅助视图的深度/模板纹理的不透明纹理构成的 array。
XRWebGLBinding(session, context)
构造函数
在调用时必须执行以下步骤:
-
令 binding 为 session 的相关领域中的一个新
XRWebGLBinding。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
如果 session 不是沉浸式会话,则抛出
InvalidStateError并中止这些步骤。 -
如果 context 的XR 兼容布尔值为
false,则抛出InvalidStateError并中止这些步骤。 -
将 binding 的context 初始化为 context。
-
将 binding 的session 初始化为 session。
-
将 binding 添加到 session 的bindings。
-
返回 binding。
nativeProjectionScaleFactor
函数返回一个值,session 的推荐的 WebGL 帧缓冲区分辨率
必须乘以该值,才能得到 session 的原生 WebGL 帧缓冲区分辨率。
如果尺寸导致布局发生变化,
则需特殊处理用户代理行为(例如在 "stereo-left-right"
下请求的宽度超过限制时)
usesDepthValues 属性如果为
false,则表示存在深度缓冲区附件时,
XR
合成器不得使用其中的值。当该属性
为 true 时,表示深度缓冲区附件的内容将由
XR
合成器使用,并且预期它能够代表渲染到该层中的场景。
要使用一个 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 个新的不透明 纹理实例初始化 array,该实例位于 context 的相关领域中,并使用 context、textureFormat、 width 和 height 创建为一个具有 numViews 个层的
TEXTURE_2D_ARRAY纹理。- 如果由于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 使用 1 个新的不透明 纹理实例初始化 array,该实例位于 context 的相关领域中,并使用 context、textureFormat、 width 和 height 创建为一个具有 numViews 个层的
- 否则
-
对于 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 width 为 view 的推荐的 WebGL 颜色纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐的 WebGL 颜色纹理分辨率的高度乘以 scaleFactor。
-
令 texture 为 context 的相关领域中的一个新 不透明纹理实例, 使用 context、textureFormat、width 和 height 创建为
TEXTURE_2D纹理。 -
如果由于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果会话视图列表中的视图在排除辅助 视图后并非都具有相同的推荐的 WebGL 颜色纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context、textureFormat、 numViews 乘以 width 以及 height 创建为 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 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并中止这些步骤。 -
令 recommendedDepthResolution 为 view 的推荐的 WebGL 深度纹理 分辨率。
-
如果 session 创建时使用了“space-warp”特性描述符,则将 recommendedDepthResolution 设置为 view 的推荐的运动矢量纹理 分辨率。
-
令 width 为 recommendedDepthResolution 的宽度乘以 scaleFactor。
-
令 height 为 recommendedDepthResolution 的高度乘以 scaleFactor。
-
如果 layer 的
layout为"mono"或"default":- 如果 textureType 为
"texture-array": - 使用 1 个新的不透明
纹理实例初始化 array,该实例位于 context 的相关领域中,并使用
context、textureFormat、
stencil、width 和 height 创建为一个具有 numViews 个层的
TEXTURE_2D_ARRAY纹理。- 如果由于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 如果由于任何原因无法创建该不透明 纹理,则抛出
- 否则
-
对于 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 recommendedDepthResolution 为 view 的推荐的 WebGL 深度纹理分辨率。
-
如果 session 创建时使用了“space-warp”特性描述符,则将 recommendedDepthResolution 设置为 view 的推荐的 运动矢量纹理分辨率。
-
令 width 为 recommendedDepthResolution 的宽度乘以 scaleFactor。
-
令 height 为 recommendedDepthResolution 的高度乘以 scaleFactor。
-
令 texture 为 context 的相关领域中的一个新 不透明纹理实例, 使用 context、textureFormat、stencil、 width 和 height 创建为
TEXTURE_2D纹理。 -
如果由于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果 session 创建时使用了“space-warp”特性描述符,并且会话视图列表中的视图 在排除辅助 视图后并非都具有相同的推荐的运动矢量纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 session 创建时未使用“space-warp”特性描述符,并且会话视图列表中的视图 在排除辅助 视图后并非都具有相同的推荐的 WebGL 深度纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context、textureFormat、 stencil、numViews 乘以 width 以及 height 创建为 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context、textureFormat、 stencil、width 以及 numViews 乘以 height 创建为 textureType 纹理。 -
如果由于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。 -
返回 array。
要使用一个 XRProjectionLayer
layer、一个 XRTextureType
textureType 和一个 float scaleFactor 为投影层分配运动矢量纹理,用户代理必须运行以下步骤:
-
令 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 个新的不透明
纹理实例初始化 array,该实例位于 context 的相关领域中,并使用 context、
RGBA16F、 width 和 height 创建为一个具有 numViews 个层的TEXTURE_2D_ARRAY纹理。- 如果由于任何原因无法创建该不透明 纹理,则抛出
OperationError并中止这些步骤。- 返回 array 并中止这些步骤。
- 如果由于任何原因无法创建该不透明 纹理,则抛出
- 否则
-
对于 session 的视图列表中的每个 view:
-
如果 view 是辅助视图,则继续。
-
令 width 为 view 的推荐的 运动矢量纹理分辨率的宽度乘以 scaleFactor。
-
令 height 为 view 的推荐的 运动矢量纹理分辨率的高度乘以 scaleFactor。
-
令 texture 为 context 的相关领域中的一个新 不透明纹理实例, 使用 context、
RGBA16F、 width 和 height 创建为TEXTURE_2D纹理。 -
如果由于任何原因无法创建 texture,则抛出
OperationError并中止这些步骤。 -
将 texture 追加到 array。
- 返回 array 并中止这些步骤。
-
- 如果 textureType 为
-
如果会话视图列表中的视图在排除辅助 视图后并非都具有相同的推荐的运动矢量纹理 分辨率,则抛出
NotSupportedError并中止这些步骤。 -
如果 layer 的
layout为stereo-left-right, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context、RGBA16F、 numViews 乘以 width 以及 height 创建为 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 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 的相关领域中的一个新
不透明纹理实例,
使用 context、textureFormat、width 和
height 创建为
TEXTURE_2D_ARRAY纹理。 - 否则
- 令 texture 为 context 的相关领域中的一个新
不透明纹理实例,
使用 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 的相关领域中的一个新
不透明纹理实例,
使用 context、textureFormat、stencil、
width 和 height 创建为
TEXTURE_2D_ARRAY纹理。 - 否则
- 令 texture 为 context 的相关领域中的一个新
不透明纹理实例,
使用 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": - 使用位于此 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 1 个内部纹理的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为TEXTURE_2D纹理。
- 如果 textureType 为
-
- 如果 textureType 为
"texture-array": - 使用位于 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 2 个层的TEXTURE_2D_ARRAY纹理。- 返回 array 并中止这些步骤。
- 否则
- 使用位于 context 的相关领域中的 2 个新不透明
纹理实例初始化 array,这些实例使用 context 和 init 的
colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为TEXTURE_2D纹理。- 返回 array 并中止这些步骤。
- 如果 textureType 为
-
如果 layer 的
layout为stereo-left-right, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context 和 init 的colorFormat、mipLevels、 两倍的viewPixelWidth和viewPixelHeight值创建为 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 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": - 使用位于 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 1 个内部纹理的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为TEXTURE_2D纹理。
- 如果 textureType 为
-
- 如果 textureType 为
"texture-array": - 使用位于 context 的相关领域中的 1 个新不透明
纹理实例初始化 array,该实例使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 2 个层的TEXTURE_2D_ARRAY纹理。- 返回 array 并中止这些步骤。
- 否则
- 使用位于 context 的相关领域中的 2 个新不透明
纹理实例初始化 array,这些实例使用 context 和 init 的
depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为TEXTURE_2D纹理。- 返回 array 并中止这些步骤。
- 如果 textureType 为
-
如果 layer 的
layout为stereo-left-right, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context 和 init 的depthFormat、mipLevels、 两倍的viewPixelWidth和viewPixelHeight值创建为 textureType 纹理。 -
如果 layer 的
layout为stereo-top-bottom, 则使用位于 context 的相关领域中的 1 个新不透明纹理 实例初始化 array,该实例使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和两倍的viewPixelHeight值创建为 textureType 纹理。 -
返回 array。
createProjectionLayer(optional XRProjectionLayerInit init)
方法创建一个新的 XRProjectionLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
令 layer 为此对象的相关领域中的一个新
XRProjectionLayer。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
将 layer 的isStatic 初始化为
false。 -
按如下方式初始化 layer 的
ignoreDepthValues:- 如果 session 创建时使用了“space-warp”特性描述符
- 将 layer 的
ignoreDepthValues初始化为false - 如果 init 的
depthFormat为false且 XR 合成器将使用深度值 - 将 layer 的
ignoreDepthValues初始化为false - 否则
- 将 layer 的
ignoreDepthValues初始化为true
-
将 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 的
textureType和 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 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createQuadLayer(XRQuadLayerInit init)
方法创建一个新的 XRQuadLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 创建时未启用“layers”, 则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
令 layer 为此对象的相关领域中的一个新
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 的相关领域中的一个新数组。
-
如果 XR 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createCylinderLayer(XRCylinderLayerInit init)
方法创建一个新的 XRCylinderLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 创建时未启用“layers”, 则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
令 layer 为此对象的相关领域中的一个新
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 的相关领域中的一个新数组。
-
如果 XR 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createEquirectLayer(XREquirectLayerLayerInit init)
方法创建一个新的 XREquirectLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 创建时未启用“layers”, 则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 context 已丢失,则抛出
InvalidStateError并中止这些步骤。 -
如果 init 的
space不是XRReferenceSpace类型的实例,则抛出TypeError并中止这些步骤。 -
令 layer 为此对象的相关领域中的一个新
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 的相关领域中的一个新数组。
-
如果 XR 合成器知道由于任何原因无法为 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 为此对象的相关领域中的一个新
XRCubeLayer。 -
使用 session 和 context 在 layer 上运行初始化合成层。
-
按如下方式初始化 layer 的
orientation:- 如果设置了 init 的
orientation - 令 layer 的
orientation为使用 init 的orientation运行fromPoint的结果。 - 否则
- 令 layer 的
orientation为此对象的相关领域中的一个新DOMPointReadOnly。
- 如果设置了 init 的
-
令 layout 为 init 的
layout。 -
令 textureType 为 init 的
textureType。 -
将 layer 的
needsRedraw初始化为true。 -
如果 layout 为
"default"或"stereo-left-right"或"stereo-top-bottom", 则抛出TypeError并中止这些步骤。 -
令 layer 的colorTextures 为此
XRCubeLayer的相关领域中的一个新数组。 -
根据 layout 的值,按如下方式初始化 layer 的colorTextures:
-
- 如果 textureType 为
"texture-array": - 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化colorTextures,该实例使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 6 个层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化colorTextures,该实例使用 context 和 init 的colorFormat、viewPixelWidth和viewPixelHeight值创建为TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
否则,如果 layer 的
layout为"stereo":- 如果 textureType 为
"texture-array": - 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化colorTextures,该实例使用 context 和 init 的colorFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 12 个层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于此
XRCubeLayer的相关领域中的 2 个新不透明纹理实例初始化colorTextures,这些实例使用 context 和 init 的colorFormat、viewPixelWidth和viewPixelHeight值创建为TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
-
令 layer 的depthStencilTextures 为此
XRCubeLayer的相关领域中的一个新数组。 -
令 layer 的motionVectorTextures 为此
XRCubeLayer的相关领域中的一个新数组。 -
如果设置了 init 的
depthFormat, 则按如下方式初始化 layer 的depthStencilTextures:-
如果 context 不是
WebGL2RenderingContext且WEBGL_depth_texture扩展未在 context 中启用,则抛出TypeError并中止这些步骤。 -
- 如果 textureType 为
"texture-array": - 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化 depthStencilTextures,该实例使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 6 个层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化 depthStencilTextures,该实例使用 context 和 init 的depthFormat、viewPixelWidth和viewPixelHeight值创建为TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
否则,如果 layer 的
layout为"stereo":- 如果 textureType 为
"texture-array": - 使用位于此
XRCubeLayer的相关领域中的 1 个新不透明纹理实例初始化 depthStencilTextures,该实例使用 context 和 init 的depthFormat、mipLevels、viewPixelWidth和viewPixelHeight值创建为一个具有 12 个层的TEXTURE_2D_ARRAY纹理。 - 否则
- 使用位于此
XRCubeLayer的相关领域中的 2 个新不透明纹理实例初始化 depthStencilTextures,这些实例使用 context 和 init 的depthFormat、viewPixelWidth和viewPixelHeight值创建为TEXTURE_CUBE_MAP纹理。
- 如果 textureType 为
-
-
如果 XR 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
当使用值为 "texture-array"
的 textureType
时,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]
当使用值为 "texture-array"
的 textureType
和值为 "stereo"
的 layout
时,左眼的内容必须从层索引 0 开始存储,而右眼的内容
必须从层索引 6 开始存储。
确定 orientation
的初始状态。
要使用参数 XRCompositionLayer
layer 和 XRFrame
frame 验证 XRWebGLBinding
binding 的 XRWebGLSubImage 创建函数的状态,用户代理必须运行以下步骤:
-
如果 frame 的active 布尔值为
false,则返回false并中止这些步骤。 -
如果 frame 的animationFrame 布尔值为
false,则返回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 为此对象的相关领域中的一个新
XRWebGLSubImage。- 令 subimage 的
viewport为此对象的相关领域中的一个新XRViewport。 - 令 subimage 的
- 如果此前曾使用相同的 binding、layer 和 eye
调用
-
如果 layer 的destroyed 为
true,则抛出InvalidStateError并中止这些步骤。 -
如果 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 创建时使用的 textureType 为
"texture-array" - 使用 index 初始化 subimage 的
imageIndex。 - 否则
- 使用
0初始化 subimage 的imageIndex。
- 如果 layer 创建时使用的 textureType 为
-
按如下方式初始化 subimage 的
colorTexture:- 如果 layer 创建时使用的 textureType 为
"texture" - 使用 layer 的colorTextures 数组中偏移量为 index 的元素
初始化 subimage 的
colorTexture。 - 否则
- 使用 layer 的colorTextures 数组中的第一个元素
初始化 subimage 的
colorTexture。
- 如果 layer 创建时使用的 textureType 为
-
按如下方式初始化 subimage 的
depthStencilTexture:- 如果 layer 的depthStencilTextures 是空数组
- 使用
null初始化 subimage 的depthStencilTexture。 - 否则,如果 layer 创建时使用的 textureType 为
"texture" - 使用 layer 的depthStencilTextures 数组中偏移量为 index
的元素
初始化 subimage 的
depthStencilTexture。 - 否则
- 使用 layer 的depthStencilTextures 数组中的第一个元素
初始化 subimage 的
depthStencilTexture。
-
使用
null初始化 subimage 的depthStencilTextureWidth、depthStencilTextureHeight和motionVectorTexture。 -
将 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 为此对象的相关领域中的一个新
XRWebGLSubImage。- 令 subimage 的
viewport为此对象的相关领域中的一个新XRViewport。 - 令 subimage 的
- 如果此前曾使用相同的 binding、layer 和
view 调用
-
令 frame 为 view 的
frame。 -
如果 layer 的destroyed 为
true,则抛出InvalidStateError并中止这些步骤。 -
如果使用 layer 和 frame 验证 XRWebGLSubImage 创建函数的状态的结果为
false,则抛出InvalidStateError并中止这些步骤。 -
如果 view 的active 标志为
false,则抛出InvalidStateError并中止这些步骤。 -
按如下方式初始化 index:
-
按如下方式初始化 subimage 的
imageIndex:- 如果 layer 创建时使用的 textureType 为
"texture-array": - 使用 index 初始化 subimage 的
imageIndex。 - 否则
- 将 subimage 的
imageIndex初始化为0。
- 如果 layer 创建时使用的 textureType 为
-
按如下方式初始化 subimage 的
colorTexture:- 如果 view 是 session 的视图列表中的辅助视图
- 使用 layer 的辅助视图的
colorTextures 中偏移量为 index 的元素
初始化 subimage 的
colorTexture。 - 否则,如果 layer 的
layout为"default"且 layer 创建时使用的 textureType 为"texture" - 使用 layer 的colorTextures 数组中偏移量为 index 的元素
初始化 subimage 的
colorTexture。 - 否则
- 使用 layer 的colorTextures 数组中的第一个元素
初始化 subimage 的
colorTexture。
-
按如下方式初始化 subimage 的
depthStencilTexture:- 如果 layer 的depthStencilTextures 是空数组
- 使用
null初始化 subimage 的depthStencilTexture。 - 否则,如果 view 是 session 的视图列表中的辅助视图
- 使用 layer 的辅助视图的
depthStencilTextures 中偏移量为 index 的元素
初始化 subimage 的
colorTexture。 - 否则,如果 layer 的
layout为"default"且 layer 创建时使用的 textureType 为"texture" - 使用 layer 的depthStencilTextures 数组中偏移量为 index
的元素
初始化 subimage 的
depthStencilTexture。 - 否则
- 使用 layer 的depthStencilTextures 数组中的第一个元素
初始化 subimage 的
depthStencilTexture。
-
按如下方式初始化 subimage 的
motionVectorTexture:- 如果 layer 的motionVectorTextures 是空数组,或者 view 是 session 的视图列表中的辅助视图
- 使用
null初始化 subimage 的motionVectorTexture。 - 否则,如果 layer 创建时使用的 textureType 为
"texture" - 使用 layer 的motionVectorTextures 数组中偏移量为 index 的元素
初始化 subimage 的
motionVectorTexture。 - 否则
- 使用 layer 的motionVectorTextures
数组中的第一个元素初始化 subimage 的
motionVectorTexture。
-
将 subimage 的
colorTextureWidth设置为 subimage 的colorTexture的像素宽度。 -
将 subimage 的
colorTextureHeight设置为 subimage 的colorTexture的像素高度。 -
使用
null初始化 subimage 的depthStencilTextureWidth和depthStencilTextureHeight。 -
如果 subimage 的
depthStencilTexture不为null,则将 subimage 的depthStencilTextureWidth设置为depthStencilTexture数组中第一个纹理的像素宽度。 -
如果 subimage 的
depthStencilTexture不为null,则将 subimage 的depthStencilTextureHeight设置为depthStencilTexture数组中第一个纹理的像素高度。 -
使用 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并中止这些步骤。 -
使用 binding 的context,采用与
fixedFoveation相同的算法,将 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 设备或视频的原生帧率
进行更新,取两者中较低者。
注: 层中只会显示视频帧。视频控件应由作者实现,并且必须 绘制在另一个层中。
HTMLVideoElement
media 的 XRCompositionLayer
layer 需要渲染时,用户代理
必须运行以下步骤:
-
令 usability 为检查 media 的可用性的结果。
-
如果 usability 为
bad,则用透明 黑色填充 layer 并中止这些步骤。 -
使用 media 元素的内容填充 layer。
XRMediaBinding(XRSession session)
构造函数
在调用时必须执行以下步骤:
-
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 session 不是沉浸式会话,则抛出
InvalidStateError并中止这些步骤。 -
令 binding 为 session 的相关领域中的一个新
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 为此对象的相关领域中的一个新
XRQuadLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
如果 init 的
height为undefined,则将height设置为width除以 aspectRatio。 -
如果 init 的
width为undefined,则将width设置为height乘以 aspectRatio。 -
使用 layer 和 init 运行初始化四边形层。
-
如果 XR 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createCylinderLayer(HTMLVideoElement video, XRMediaCylinderLayerInit init)
方法创建一个新的 XRCylinderLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 创建时未启用“layers”, 则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
令 layer 为此对象的相关领域中的一个新
XRCylinderLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
如果 init 的
aspectRatio为undefined,则将aspectRatio设置为 aspectRatio。 -
使用 layer 和 init 运行初始化圆柱层。
-
如果 XR 合成器知道由于任何原因无法为 layer 创建资源,则抛出
OperationError并中止这些步骤。 -
返回 layer。
createEquirectLayer(HTMLVideoElement video, XRMediaEquirectLayerInit init)
方法创建一个新的 XREquirectLayer
layer。
调用此方法时,用户代理必须运行以下步骤:
-
如果 session 创建时未启用“layers”, 则抛出
NotSupportedError并中止这些步骤。 -
如果 session 的
ended值为true,则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
space不是XRReferenceSpace类型的实例,则抛出InvalidStateError并中止这些步骤。 -
如果 init 的
space的类型为"viewer", 则抛出InvalidStateError并中止这些步骤。 -
令 layer 为此对象的相关领域中的一个新
XREquirectLayer。 -
使用 session 在 layer 上运行初始化合成层。
-
将 layer 的media 初始化为 video。
-
将 layer 的
needsRedraw初始化为false。 -
使用 layer 和 init 运行初始化等距柱状投影层。
-
如果 XR 合成器知道由于任何原因无法为 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)、
变换和空间进行排序。
XRProjectionLayer
层必须根据其 depthStencilTexture
中的值进行排序。
这也意味着,如果启用了 "depth-sorted-layers",则 XR Compositor 必须使用深度值,并且 ignoreDepthValues
和 usesDepthValues
必须被设置为 `true`。
10. 空间扭曲
空间扭曲是一种
改善 XR
合成器重投影的技术。
通过同时提交 motionVectorTexture
和 depthStencilTexture,
XR
合成器可以执行高质量的帧外推和重投影,
从而允许用户代理以较低的帧率运行,同时仍为用户提供流畅的体验。
requestAnimationFrame()
回调的传递频率可能低于显示器的原生刷新率。XR 合成器将
使用体验提供的运动矢量和深度信息合成缺失的帧。
要启用空间扭曲,XRSession
必须使用“space-warp”特性
描述符创建。
如果启用了“space-warp”,则 XR 合成器必须
使用深度值,ignoreDepthValues
必须设置为 `false`,并且 usesDepthValues
必须设置为 `true`。
当启用 space-warp 特性
描述符时,体验应为其提交的每个 XRProjectionLayer
将具有代表性的深度值渲染到 depthStencilTexture
中。
depthStencilTexture
和 motionVectorTexture
将具有相同的尺寸,该尺寸可能不同于 colorTexture
的尺寸。
作者可以使用 depthStencilTextureWidth
和 depthStencilTextureHeight
来确定深度/模板附件和运动矢量附件二者的尺寸。
作者应在这些附件的完整范围内渲染深度/模板和运动矢量信息,
而不是渲染到 viewport。
注:由于深度/模板和运动矢量
附件的尺寸可能不同于颜色附件,因此它们并不打算附加到
用于渲染到 colorTexture
的帧缓冲区。
作者应按照各自附件的尺寸分别渲染深度/模板和运动矢量信息。
motionVectorTexture
必须采用 RGBA16F
格式。作者应使用该区域的二维屏幕空间运动矢量填充此纹理的 RG 分量,
该运动矢量表示为当前帧与上一帧之间归一化设备坐标(NDC)中的增量。
运动矢量计算为 `(currentClipPos / currentW) - (prevClipPos / prevW)`,其中
`currentClipPos` 和 `prevClipPos` 分别是片段在当前帧和上一帧中的裁剪空间位置。
红色通道对应 NDC X(水平方向)的增量,而绿色通道对应 NDC Y(垂直方向)的增量。蓝色通道可以包含
NDC Z(深度)的增量,而 alpha 通道
不使用。
如果在处理 XRFrame
期间未提交 motionVectorTexture
或 depthStencilTexture,
则 XR
合成器必须像未启用空间扭曲一样处理该 XRFrame
11. WebXR 设备 API 集成
11.1. XRRenderState 变更
此模块扩展了XRRenderStateInit
和 XRRenderState
接口,新增一个可选的 layers
数组,其中包含
XRLayer
[SecureContext ,Exposed =Window ]partial interface XRRenderState {readonly attribute FrozenArray <XRLayer >layers ; };
layers 属性返回一个数组,其中包含
由 XR
合成器显示的 XRLayer
实例。
默认情况下,layers
数组定义各层的合成顺序。XR 合成器必须
按照每个层在数组中的位置顺序绘制它们,并使用 source-over 混合。除非启用了“depth-sorted-layers”特性
描述符,否则 XR 合成器不得对各层应用任何深度排序。
注:这意味着每个层都有可能 覆盖之前的层,无论之前的层在虚拟空间中是否更靠近观察者。
11.2. updateRenderState 变更
此模块替换了 WebXR
规范中“更新待处理的层状态”给出的步骤。相反,当用户代理要使用 XRSession
session 和 XRRenderStateInit
newState
更新待处理的层状态时,必须运行以下步骤:
-
如果 newState 的
baseLayer和 newState 的layers都已设置,则抛出NotSupportedError并中止这些步骤。 -
令 activeState 为 session 的活动渲染状态。
-
如果设置了 newState 的
baseLayer: -
如果设置了 newState 的
layers:-
如果 newState 的
layers包含一个其destroyed 布尔值为true的XRCompositionLayer, 则抛出InvalidStateError并中止这些步骤。 -
如果 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 合成器,使XRLayer
layers
数组中的所有实例都能同时进行合成。
WebXR
的所有其他要求必须继续
如果 XR
合成器正在渲染到一个 视图,其 XREye
为 "none",
并且正在绘制一个不是
XRProjectionLayer
且其 layout
不为 "mono"
的 XRCompositionLayer,
则 XR
合成器必须像该视图
的 XREye
为 "left"
一样渲染该层。
注:这意味着该层中供右眼使用的一侧 会被忽略。这使作者能够为立体显示设备和 单目显示设备使用相同的资源。
11.4. XRView 变更
每个 视图必须定义一个 推荐 WebGL 颜色纹理分辨率,它 表示足以包含该视图的 WebGL 纹理 分辨率的最佳估计。如果 XRSession
是使用“space-warp”特性
描述符创建的,则每个 视图必须定义一个推荐运动矢量纹理分辨率,
该分辨率基于推荐 WebGL 颜色纹理
分辨率。
每个 视图还必须
定义一个 推荐 WebGL 深度纹理分辨率,
它表示足以包含该视图的 WebGL 深度纹理
分辨率的最佳估计。
如果 XRSession
是使用“space-warp”特性
描述符创建的,则推荐 WebGL 深度纹理分辨率
必须等于推荐运动矢量纹理
分辨率。
11.5. 动画帧变更
renderState
state 检查层
状态,用户代理必须运行以下步骤:
-
如果 state 的
baseLayer不为null,则返回true。 -
对于 state 的
layers中的每个 layer:-
如果 layer 不是
XRCompositionLayer或 layer 的destroyed 布尔值为false,则返回true。
-
-
返回
false。
11.6. XRSession 更改
此模块扩展了 XRSession 接口并向其中添加以下内容:[SecureContext ,Exposed =Window ]partial interface XRSession {readonly attribute unsigned long maxRenderLayers ; };
maxRenderLayers 表示
合成器必须处理的最大层数,因此也是任何 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)