1. はじめに
この仕様は、WebXR 仕様に `composition` レイヤーのサポートを追加します。レイヤーの利点は次のとおりです:
-
性能とジャダー: Composition レイヤーは、アプリケーションのフレームレートではなく、 コンポジターのフレームレート(すなわち HMD のネイティブリフレッシュレート)で提示されます。 アプリケーションがコンポジターのネイティブリフレッシュレートでレイヤーのレンダリングを更新していない場合でも、 コンポジターは既存のレンダリングを適切なポーズへ再投影できることがあります。 これにより、より滑らかなレンダリングと少ないジャダーが得られます。レイヤーのもう 1 つの 特徴は、それぞれが異なる解像度を持てることです。これにより、アプリケーションは 低性能システムでメインのアイバッファ解像度を下げつつ、テキストやマップなどの 重要な情報を独自のレイヤーでより高い解像度に保つことができます。
-
可読性/視覚的忠実度: 通常の WebXR では、アイバッファの解像度は、特に低性能システムで 比較的低い値まで下げられることがあります。これにより、 テキストなどの高忠実度コンテンツのレンダリングが難しくなります。Composition Layers では、静的な cylinder または quad レイヤーを高解像度で一度描画し、コンポジターによって一度だけ再サンプリングできます。 これは、
XRWebGLLayerにレンダリングする従来の手法とは対照的です。その場合、コンテンツはデバイスのリフレッシュレートで生成され、 少なくとも 2 回再サンプリングされます。1 回目は WebGL アイバッファへのレンダリング時(低い アイバッファ解像度により詳細が失われる可能性があります)、2 回目はコンポジターによるものです。 -
消費電力 / バッテリー寿命: レンダリングパイプラインの削減、二重サンプリングがないこと、 およびレイヤーのレンダリングを毎フレーム更新する必要がないことにより、消費電力の改善が期待されます。
-
レイテンシ: composition レイヤーのポーズサンプリングはフレームの最後の段階で行われることがあり、 その後、特定の再投影技術を使用して、レイヤーのポーズを 最新の HMD ポーズに一致するよう更新できます。これにより、レイヤーのレンダリングに対する実効レイテンシが 大幅に低減され、その結果、全体的な体験が改善される可能性があります。
-
より多くの色型のサポート: WebXR は RGB 値のみをサポートします。Composition レイヤーは 色型をより広くサポートするため、作者は圧縮形式や sRGB を使用できます。
1.1. 用語
1.2. アプリケーションフロー
作者が GL レイヤーを使用したい場合、次の手順を踏む必要があります:
-
XRProjectionLayer以外の任意のレイヤー型について、requiredFeaturesまたはoptionalFeaturesを通じて、requestSession()内でサポートを要求します。 -
XRWebGLBindingまたはXRMediaBindingを作成します。 -
これらのオブジェクトでレイヤーを作成します。
-
レイヤーを
XRRenderStateInitに追加し、updateRenderState()を呼び出します。 -
WebGL レイヤーについては、
requestAnimationFrame()中に、各 WebGL レイヤーのコンテンツを描画します。
2. 初期化
アプリケーションがセッション中に XRProjectionLayer
型以外のレイヤーを作成したい場合、
セッションは適切な feature
descriptor とともに要求されなければなりません。文字列 "layers" は、
WebXR Layers 機能の新しい有効な feature descriptor として、このモジュールにより導入されます。
XRProjectionLayer
型のレイヤーは、feature
descriptor が要求されたかどうかにかかわらず、常にサポートされなければなりません。
navigator. xr. requestSession( 'immersive-vr' , { optionalFeatures: [ 'layers' ] }
レイヤーは、XRSessionMode が "immersive-vr"
または "immersive-ar"
で作成された XRSessions に対してのみサポートされます。
"inline"
セッションはレイヤーをサポートしてはなりません。
"layers" feature descriptor には、feature requirement があり、active immersive session が存在するときには有効化できません。
注: これは、"layers" とともに request(permissionDesc)
API を実行しても、現在のアクティブなセッションに対してレイヤーサポートが有効にならないことを意味します。
3. レイヤー型
3.1. モノおよびステレオレイヤー
ステレオレイヤーは、各ビューに対してレンダリング先となるXRSubImage を
供給しなければなりません。
モノレイヤーは、各ビューに表示される単一の XRSubImage
を供給しなければなりません。
XR Compositor は、レイヤーが観察者に対してステレオで正しく提示されることを保証しなければなりません。
3.2. XRLayerLayout
XRLayerLayout
enum は、レイヤーのレイアウトを定義します。
enum {XRLayerLayout "default" ,"mono" ,"stereo" ,"stereo-left-right" ,"stereo-top-bottom" };
-
defaultのレイアウトは、レイヤーがセッションの list of views のすべてのビューに対応できることを示します。 -
monoのレイアウトは、レイヤーがモノであることを示します。 -
stereoのレイアウトは、レイヤーがステレオであることを示します。 -
stereo-left-rightのレイアウトは、 レイヤーがステレオであり、左から右に分割されていることを示します。 -
stereo-top-bottomのレイアウトは、 レイヤーがステレオであり、上から下に分割されていることを示します。
注: XRCompositionLayer
が "default"
または "stereo"
XRLayerLayout
で作成される場合、それは "texture-array"
texture type で割り当てられることが強く推奨されます。
注: "stereo-left-right"
および "stereo-top-bottom"
レイアウトは、既にステレオであるコンテンツ(たとえばステレオ動画や画像)に対する描画
呼び出しを最小化するよう設計されています。そのようなアセット型を必要としない体験では、"default"
または "stereo"
レイアウトを使用すべきです。
3.3. XRLayerQuality
XRLayerQuality
enum は、レイヤーの表示品質を定義します。
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 属性は、
レイヤーのテクスチャアルファチャンネルを有効にします。
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 animation frame で
再レンダリングされるべきであることを示します。これは、the underlying resources of a layer are
lost 場合、または
XR
Compositor がレイヤーを再投影できなくなった場合に設定されてもよいです。次の XR animation
frame
でコンテンツを再描画しないと、ちらつきまたはその他の副作用が発生する可能性があります。
mipLevels 属性は、ミップチェーンの深さを返します。
これは、mipLevels
で要求された値以下でなければなりません。
注: 一部のプラットフォームはミップレベルをサポートしません。
作者は、特定のミップレベルを対象にできるか判断するために mipLevels
を照会すべきであり、mipLevels
で渡した値に依存すべきではありません。
quality 属性は、XRCompositionLayer
の品質を設定し、返します。
default
が初期値です。
XRCompositionLayer
layer について、the underlying resources of a layer are lost 場合、
ユーザーエージェントは次の手順を実行しなければなりません:
-
layer の
needsRedrawをtrueに設定します。 -
layer が
XRProjectionLayerでない場合、タスクをキューに入れ、XRLayerEventを使用して、layer 上でredrawという名前のイベントを発火します。
destroy()
は、基礎となるアタッチメントを削除します。アタッチメントが存在しない場合、この関数は何もしません。
XRSession
session および任意の WebGLRenderingContext
または WebGL2RenderingContext
context のインスタンスで initialize a composition layer するには、
ユーザーエージェントは次の手順を実行しなければなりません:
destroy()
を呼び出すとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
this の colorTextures 配列を空の配列に設定します。
-
this の depthStencilTextures 配列を空の配列に設定します。
-
基礎となる GL アタッチメントを破棄します。
各 XRCompositionLayer
は、null または WebGLRenderingContext
もしくは WebGL2RenderingContext
のインスタンスである context オブジェクトと、null または HTMLVideoElement
のインスタンスである media
オブジェクトを持ちます。
各 XRCompositionLayer
は、作成時に使用された
XRSession
である、関連付けられた session を持ちます。
XRSpace
space および XRCompositionLayer
layer で setting
the space on a layer するとき、ユーザーエージェントは space が有効かを検証するために
次の手順を実行しなければなりません:
XRCompositionLayer
は、作者がこのレイヤーへ描画できるのが needsRedraw
が true のときのみであることを示す、内部 boolean isStatic を持ちます。
注: isStatic が
true の場合、作者は作成後に一度、または redraw イベント後に一度だけ
レイヤーへ描画できます。これにより、UA は単一の GPU バッファのみを割り当てることができます。
書き込み可能な属性が XRCompositionLayer
またはその派生クラスのいずれかに設定された場合、
その属性を読み取ると、その値を返さなければなりません。
requestAnimationFrame()
callback の終了時に、その値は
underlying XR Compositor に送信されなければなりません。XR Compositor は、
XRFrame
を次に提示するとき、その値を適用しなければなりません。この XRFrame は requestAnimationFrame()
callback に渡されたものです。
注: これは、
XR
Compositor が新しい
XRFrame
を使用して scene を再描画するときに、値が適用されなければならないことを意味します。
これは、colorTexture
に変更がなかった場合でも同様です。この colorTexture は
XRCompositionLayer
に関連付けられています。また、media layer に関連付けられた videoframe に変更がなかった場合も同様です。
XR
Compositor が前の XRFrame
の
state で scene を再描画する場合、新しい値を使用してはなりません。
3.5. XRProjectionLayer
XRProjectionLayer
は、観察者のビュー全体を満たすレイヤーです。
Projection レイヤーは、デバイスのネイティブフレームレートに近い頻度で更新されるべきです。

[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 属性は、
XRProjectionLayer
が textureType
として "texture-array"
で初期化された場合、このレイヤーの
colorTextures テクスチャの
レイヤー数を返します。そうでない場合は 1 を返します。
fixedFoveation 属性は、
XR
Compositor によって使用される foveation の量を制御します。ユーザーエージェントまたはデバイスがこの属性をサポートしない場合、
取得時には null を返すべきであり、設定は no-op であるべきです。
fixedFoveation
を 0 未満の値に設定すると 0 に設定され、
1 より大きい値に設定すると 1 に設定されます。0 は
foveation の最小量を設定し、1 は最大量を設定します。XR Compositor
がこれらの値をどのように解釈するかはユーザーエージェントに委ねられます。
fixedFoveation
レベルが変更された場合、それは次の XRFrame
で有効になります。
ignoreDepthValues 属性は、
true の場合、
XR
Compositor がレンダリング時に深度バッファアタッチメント内の値を使用してはならないことを示します。
属性が false の場合、深度バッファアタッチメントの内容が
XR
Compositor によって使用され、レイヤー内にレンダリングされたシーンを表すことが期待されることを示します。
deltaPose 属性は、
XR Compositor によって使用される
foveation の量を制御します。ユーザーエージェントまたはデバイスがこの属性をサポートしない場合、または
"space-warp" feature
descriptor が要求されていなかった場合、取得時には
null を返すべきであり、設定は no-op であるべきです。この属性は、
view に影響する、前の frame 以降に application によって適用された増分 transform があれば、
それを記述します。人工的な
locomotion が発生すると、experience は frames 間で world 全体を 1 つの application pose から別の pose へ
transform し、deltaPose
には scene の world position の差分が設定されなければなりません。
deltaPose
は、前の frame と現在の XRFrame
の間に transformation がない場合、identity であるべきです。
3.6. XRQuadLayer
XRQuadLayer
は、仮想環境内の平坦な矩形空間を占めるレイヤーをレンダリングします。
レイヤーの前面のみが可視でなければならず、背面は XR Compositor によって
描画されてはなりません。
XRQuadLayer には厚みがありません。これは 3D 空間内に配置および方向付けされた 2 次元オブジェクトです。 quad の位置は quad の中心を指します。

[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
を設定するときは、まず setting the space on a layer の手順を実行します。
width および height 属性は、
レイヤーの幅と高さをメートル単位で設定し、返します。
XRQuadLayer
layer を XRQuadLayerInit
init で initializing an XRQuadLayer
するとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
layer の
transformを次のように初期化します:- init の
transformが設定されている場合 - layer の
transformを、layer の relevant realm 内の newXRRigidTransformとし、init のtransformのpositionおよびorientationで初期化します。 - それ以外の場合
- layer の
transformを、layer の relevant realm 内の newXRRigidTransformとし、{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }のDOMPointInitposition で初期化します。
- init の
onredraw 属性は、redraw
イベント型に対するイベントハンドラー IDL 属性です。
3.7. XRCylinderLayer
XRCylinderLayer
は、仮想環境内の曲面の矩形空間を占めるレイヤーをレンダリングします。
レイヤーの前面のみが可視でなければならず、背面は XR Compositor によって
描画されてはなりません。

XRCylinderLayer には厚みがありません。これは 3D 空間内に配置および方向付けされた 2 次元オブジェクトです。 cylinder の位置は quad の中心を指します。
[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
を設定するときは、まず setting the space on a layer の手順を実行します。
radius 属性は、cylinder の半径をメートル単位で制御します。
centralAngle 属性は、cylinder の可視部分の角度を
ラジアン単位で制御します。
これは 0 角を中心に対称に広がります。
aspectRatio 属性は、可視 cylinder 部分の比率を
制御します。これは cylinder の可視部分の幅をその高さで割った比率です。幅は、radius
に centralAngle
を掛けて計算されます。

XRCylinderLayer
layer を XRCylinderLayerInit
init で initializing an XRCylinderLayer
するとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
layer の
centralAngleを init のcentralAngleに初期化します。 -
layer の
aspectRatioを init のaspectRatioに初期化します。 -
layer の
transformを次のように初期化します:- init の
transformが設定されている場合 - layer の
transformを、layer の relevant realm 内の newXRRigidTransformとし、init のtransformのpositionおよびorientationで初期化します。 - それ以外の場合
- layer の
transformを、layer の relevant realm 内の newXRRigidTransformとし、{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }のDOMPointInitposition で初期化します。
- 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 で setting the space on an equirect layer するとき、ユーザーエージェントは
space が有効かを検証するために次の手順を実行しなければなりません:
-
init の
spaceがXRReferenceSpace型のインスタンスでない場合、TypeErrorを投げ、これらの手順を中止します。 -
init の
spaceが"viewer"の type を持つ場合、TypeErrorを投げ、これらの手順を中止します。 -
space および layer で setting the space on a layer を実行します。
XREquirectLayer
layer を XREquirectLayerInit
init で initializing an XREquirectLayer
するとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
layer の
centralHorizontalAngleを init のcentralHorizontalAngleに初期化します。 -
layer の
upperVerticalAngleを init のupperVerticalAngleに初期化します。 -
layer の
lowerVerticalAngleを init のlowerVerticalAngleに初期化します。 -
layer の
transformを次のように初期化します:- init の
transformが設定されている場合 - layer の
transformを、layer の relevant realm 内の newXRRigidTransformとし、init のtransformのpositionおよびorientationで初期化します。 - それ以外の場合
- layer の
transformを、layer の relevant realm 内の newXRRigidTransformとします。
- init の
onredraw 属性は、redraw
イベント型に対するイベントハンドラー IDL 属性です。
3.9. XRCubeLayer
XRCubeLayer
は、XR
Compositor が cubemap から直接レンダリングするレイヤーを
レンダリングします。

[Exposed =Window ]interface :XRCubeLayer XRCompositionLayer {attribute XRSpace space ;attribute DOMPointReadOnly orientation ; // Eventsattribute EventHandler onredraw ; };
orientation 属性は、
space 属性に対する向きを設定し、返します。orientation
および space
属性は、
ユーザーの物理環境内におけるレイヤーの空間的関係を確立します。
XRCubeLayer
を配置するときは、space
の向きのみが考慮されます。cube レイヤーは常に、
視点を中心に置いてレンダリングされます。
XRSpace
を space
属性に割り当てるときは、まず次の手順を実行します。
XRSpace
space および XRCubeLayer
layer で setting the space on an cube layer するとき、ユーザーエージェントは
space が有効かを検証するために次の手順を実行しなければなりません:
-
init の
spaceがXRReferenceSpace型のインスタンスでない場合、TypeErrorを投げ、これらの手順を中止します。 -
init の
spaceが"viewer"の type を持つ場合、TypeErrorを投げ、これらの手順を中止します。 -
space および layer で setting the space on a layer を実行します。
onredraw 属性は、redraw
イベント型に対するイベントハンドラー IDL 属性です。
4. 空間
XRProjectionLayer
および XRWebGLLayer
は、全フレームにレンダリングするため、関連付けられた XRSpace
を持ちません。
XRCubeLayer
および XREquirectLayer
は、"viewer"
型でない XRReferenceSpaces
のみをサポートしなければなりません。
XRQuadLayer
および XRCylinderLayer
は、すべての XRSpace
型をサポートしなければなりません。
一般に、開発者はレイヤーを安定させるために "viewer"
空間を使用すべきではありません。これはほとんどの場合、位置または回転の再投影を無効にし、
ワールドに対するレンダリング済みコンテンツの安定性を失わせるためです。
例外は、gaze cursor や targeting reticle のような小さな UI 要素です。
以下は、レイヤー型とともに使用する空間のベストプラクティスです:
-
XRQuadLayerと"viewer"空間: 画面中央の head-locked 定サイズ reticle。 -
XRQuadLayerまたはXRCylinderLayerを"local","unbounded"空間内で使用: 弾性のある body-locked UI。 -
XRQuadLayerまたはXRCylinderLayerを"local","local-floor","unbounded","bounded-floor"または anchor 空間内で使用: ユーザーが配置する world-locked video。 -
XREquirectLayerまたはXRCubeLayerを"local"空間内で使用: 360 度動画または skybox。
5. レンダリング
5.1. XRSubImage
XRSubImage
オブジェクトは、GPU テクスチャのどの viewport を使用するかを表します。
[Exposed =Window ]interface { [XRSubImage SameObject ]readonly attribute XRViewport viewport ; };
注: このクラスは将来の拡張に対応するよう 設計されています
viewport 属性は、sub image をレンダリングするときに使用する 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
に対する色 opaque texture を返します。
depthStencilTexture 属性は、
XRCompositionLayer
に対する depth/stencil opaque
texture を返します。
レイヤーが depth/stencil なしで作成された場合、この属性は null を返します。
motionVectorTexture
属性は、XRProjectionLayer
に対する motion opaque
texture を返します。
XRSession
が space-warp feature
descriptor なしで作成された場合、またはレイヤーが XRProjectionLayer
でない場合、この属性は null を返さなければなりません。
imageIndex 属性は、texture array 内のオフセットを返します。
texture-array
とともに要求されたレイヤーに対してのみ有効です。
colorTextureWidth および depthStencilTextureHeight
属性は、GL depth アタッチメントのピクセル単位の幅と高さを返します
depthStencilTextureWidth および
colorTextureHeight 属性は、
GL color アタッチメントのピクセル単位の幅と高さを返します。レイヤーが depth/stencil なしで
作成された場合、この属性は null を返します。
motionVectorTextureWidth および
motionVectorTextureHeight
属性は、GL motion vector アタッチメントのピクセル単位の幅と高さを返します。
XRSession
が space-warp feature
descriptor なしで作成された場合、またはレイヤーが XRProjectionLayer
でない場合、これらの属性は null を返さなければなりません。
5.3. XRTextureType
XRTextureType
enum は、割り当てられるテクスチャの型を定義します。
enum {XRTextureType "texture" ,"texture-array" };
-
textureのテクスチャ型は、XRWebGLSubImageのテクスチャがTEXTURE_2D型でなければならないことを示します -
texture-arrayのテクスチャ型は、XRWebGLSubImageのテクスチャがTEXTURE_2D_ARRAY型でなければならないことを示します
6. GPU レイヤーおよびビューの作成
6.1. 概要
レイヤーが作成されると、それは GPU リソース、典型的には Web プラットフォームのグラフィックス API の
1 つによって提供されるテクスチャによって裏付けられます。どの API がレイヤーの GPU リソースを
提供しているかを指定するために、対象 API に対する XRWebGLBinding
が作成されなければなりません。
各グラフィックス API は、レイヤー作成で context を使用できるようになる前に満たす必要のある
固有の要件を持つことがあります。たとえば、
WebGLRenderingContext
は、XRWebGLBinding
インスタンスのコンストラクターに渡される前に、その xrCompatible フラグが設定されていなければなりません。
テクスチャの割り当てや取得など、XRSession
とグラフィックス API の間のあらゆる相互作用は、この XRWebGLBinding
インスタンスを通じて行われ、その相互作用の正確な仕組みは通常 API 固有です。これにより、
WebXR API の残りの部分はグラフィックス API に依存せず、将来のレンダリング技術の進歩に
より容易に適応できます。
XRWebGLBinding
インスタンスが取得されると、それを使用してさまざまな XRCompositionLayer
を作成できます。
そのインスタンスによって作成されたレイヤーは、各フレームで関連付けられた GPU リソースを照会できるようになり、
それは一般にネイティブ API のテクスチャインターフェイスであることが期待されます。
各種レイヤー型は、XRWebGLBinding
インスタンス上の create____Layer 系メソッドで作成されます。必要なグラフィックスリソースに関する情報、
たとえば depth buffer や alpha channel を割り当てるかどうかは、レイヤー作成時に渡され、
レイヤーの存続期間中は不変です。
このメソッドは関連付けられた XRCompositionLayer 型を返します。
XRSession
が "layers" feature
descriptor とともに作成された場合、それはすべてのレイヤー型をサポートしなければなりません。
レイヤー型がサポートされていない場合、その作成メソッドは例外を投げなければなりません。XRProjectionLayer
は、"layers" feature
descriptor とともに作成されたかどうかにかかわらず、すべての XRSession
でサポートされなければなりません。
6.2. 不透明テクスチャ
WebXR GPU レイヤーを使用するとき、XRWebGLBinding
オブジェクトは、color および depth/stencil アタッチメントに対して opaque texture のインスタンスを返します。
opaque texture は、
次の変更を伴って、標準の WebGLTexture
と同一に機能します:
-
opaque texture は、 そのセッションの
requestAnimationFrame()コールバックの外では無効とみなされます。 -
opaque texture は、
getSubImage()またはgetViewSubImage()呼び出しによって返されるまでは無効です。 -
XR Compositor は、color attachment に対する opaque texture が premultiplied alpha の色を含むものと仮定しなければなりません。
-
requestAnimationFrame()コールバックの終了時に、テクスチャはバインド解除され、すべてのWebGLShaderオブジェクトから切り離されなければなりません。 -
opaque texture は、WebGL 1.0 context を使用する場合でも、適宜 texStorage2D または texStorage3D で割り当てられたかのように振る舞わなければなりません。
-
opaque texture を伴う
deleteTextureの呼び出しは、INVALID_OPERATIONエラーを生成しなければなりません。
opaque
texture にアタッチされたバッファは、clearOnAccess
が true のとき、各 XR animation frame における getViewSubImage()
または getSubImage()
の最初の呼び出しの処理中に、下の表の値にクリアされなければなりません。
clearOnAccess
が false の場合、opaque
texture にアタッチされたバッファは、それらが初めてアクセスされたときに
クリアされなければなりません。
後のフレームにおける以後のアクセスでは、バッファをクリアしなくてもよいです。
| バッファ | クリア値 |
|---|---|
| Color | (0, 0, 0, 0) |
| Depth | 1.0 |
| Stencil | 0 |
opaque texture が
2 以上の mipLevels
で作成された場合、作者はすべての mip levels を設定すべきです。ユーザーエージェントは mip
levels を作成すべきであると仮定してはなりません。
注: opaque textures は、レイヤーが構築されるときに
allocate color
textures および allocate depth textures アルゴリズムを用いて割り当てられます。
この事前割り当ての副作用として、同じパラメーターで
getSubImage()
および getViewSubImage()
を呼び出すと、常に同じテクスチャオブジェクトが返されます。
注: opaque textures の 寸法または形式の変更は許可されません。GL コマンドは texel 値およびテクスチャパラメーターのみを変更できます。WebGLTexture に対して次の コマンドのいずれかを使用すると、寸法または形式に影響しない場合でも INVALID_OPERATION エラーが 生成されます: TexImage*, CompressedTexImage*, CopyTexImage* および TexStorage*。 OpenGL ES 3.0 仕様の "Immutable-Format Texture Images" 節では、これらの制限がより詳しく定義されています。
レイヤーのリソース(メモリなど)の割り当ては、WebGL と同じ仕組みを通じて行われなければなりません。
XRLayer
が RGBA
または RGB
colorFormat
で割り当てられる場合、その colorTextures は、
RGBA
または RGB
として WebGLRenderingContext
context に公開されなければなりません。
ただし、XR Compositor は、colorTextures のピクセルを、
SRGB8_ALPHA8
または SRGB8
colorFormat
内にあるかのように扱わなければなりません。
注: これは、XR Compositor が
colorTextures を処理するとき、linear
RGBA
または RGB
からのガンマ変換を行ってはならないことを意味します。そうでない場合、最終レンダリングのピクセルは
明るすぎて見え、通常の 2D WebGLRenderingContext
context 上のレンダリングと一致しなくなります。
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 属性は、
color texture data のデータ型を定義します。
これは、XR Compositor がサポートしなければならない list of color formats for projection layers です:
-
'
EXT_sRGB' extension が有効化された context に対するSRGB_ALPHA_EXT
WebGL2 context では、次の追加形式がサポートされます:
depthFormat 属性は、
depth texture data のデータ型を定義します。
depthFormat
が 0 の場合、レイヤーは depth/stencil texture を提供しません。
これは、XR Compositor がサポートしなければならない list of depth formats for projection layers です:
'WEBGL_depth_texture'
extension が有効化された WebGLRenderingContext
context または WebGL2 context について:
extension が有効化されていない場合、depth texture の要求は無視されます。
注: 作者が depth texture を期待している可能性があるため、 これは作者を混乱させる可能性があります。可能であれば、テクスチャが作成されなかった理由とともに警告を 提供してください。
WebGL2RenderingContext
context では、次の追加形式がサポートされます:
scaleFactor 属性は、
レイヤーのアタッチメントの解像度を決定する際に、session の
recommended WebGL framebuffer resolution に
乗算されなければならない値を定義します。
clearOnAccess 属性は、
このレイヤーに関連付けられたテクスチャを初期フレームまたは毎フレームでクリアすべきかどうかを定義します。
注: XRProjectionLayerInit
辞書は、XRLayerInit
のように mipLevels
を構成するサポートを持ちません。
ユーザーエージェントが projection レイヤーで mipmapping をサポートしたい場合、mips 付きでテクスチャを
割り当てることは自由です。
その場合、すべての mip levels を生成する責任はユーザーエージェント(作者ではなく)にあります。
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 属性は、color texture data のデータ型を定義します。
これは、XR Compositor がサポートしなければならない list of color formats for non-projection layers です:
-
'
EXT_sRGB' extension が有効化された context に対するSRGB_ALPHA_EXT
WebGL2 context では、次の追加形式がサポートされます:
'WEBGL_compressed_texture_etc'
extension が有効化された context では、次の追加形式がサポートされます:
'WEBGL_compressed_texture_astc'
extension が有効化された context では、その extension のすべての形式がサポートされます。
depthFormat 属性は、depth texture data のデータ型を定義します。
depthFormat
が供給されない場合、レイヤーは depth/stencil texture を提供しません。
これは、XR Compositor がサポートしなければならない list of depth formats for non-projection layers です:
'WEBGL_depth_texture'
extension が有効化された WebGLRenderingContext
context または WebGL2 context について:
WebGL2RenderingContext
context では、次の追加形式がサポートされます:
mipLevels 属性は、color および texture data における
mip levels の望ましい数を定義します。
ユーザーエージェントが要求された数を作成できない場合、より少なく作成できます。作者は、実際の
mip levels の数を判断するために mipLevels
を照会しなければなりません。
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 辞書は optional であるべきではありません。これは bikeshed issue 1566 です。
各 XRWebGLBinding
は、XRWebGLRenderingContext
型の context オブジェクトを持ち、これは
WebGLRenderingContext
または WebGL2RenderingContext
のいずれかのインスタンスです。
各 XRWebGLBinding
は、作成時に使用された
XRSession
である、関連付けられた session を持ちます。
各 XRWebGLBinding
は、foveateBoundTexture
を呼び出すときに指定された target にバインドされていたテクスチャへの弱参照を保持する、内部 WeakSet
foveatedTextures を持ちます。
注: 複数の XRWebGLBinding
を作成することは可能です。
XRWebGLBinding
のインスタンスで作成された任意のレイヤーは、両方が同じ session および同じ
context で
作成されている限り、別の XRWebGLBinding
インスタンスとともに使用できます。レイヤーまたは XRWebGLSubImage
インスタンスの存続期間は、それらを作成した XRWebGLBinding
の存続期間に結び付いていません。
XRWebGLBinding
を通じて作成された各 XRCompositionLayer
は、color textures 用の WebGLTextures
の array である内部 colorTextures 配列、
depth/stencil textures 用の opaque textures の
array である内部 depthStencilTextures、
および motion textures 用の opaque
textures の
array である内部 motionVectorTextures を持ちます。
XRWebGLBinding
を通じて作成された各 XRProjectionLayer
は、color textures 用の opaque
textures の array である内部
colorTextures for secondary views
配列と、secondary views をレンダリングするために使用される depth/stencil textures 用の
opaque textures の
array である内部 depthStencilTextures for
secondary
views
配列を持ちます。
XRWebGLBinding(session, context)
コンストラクターは、呼び出されたときに次の手順を実行しなければなりません:
-
binding を、session の relevant realm 内の new
XRWebGLBindingとします。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
session が immersive session でない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
context の XR compatible boolean が
falseの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
binding の context を context に初期化します。
-
binding の session を session に初期化します。
-
binding を session の bindings に追加します。
-
binding を返します。
nativeProjectionScaleFactor
関数は、session の native WebGL framebuffer resolution を得るために、
session の recommended WebGL framebuffer resolution
に乗算されなければならない値を返します。
サイズがレイアウト変更を
引き起こす場合の UA の挙動を特別扱いする(例: 要求された幅が "stereo-left-right"
で制限を超える場合)
usesDepthValues 属性は、
false の場合、depth buffer attachment が存在しても
XR
Compositor が値を使用してはならないことを示します。属性が
true の場合、depth buffer attachment の内容が
XR
Compositor によって使用され、レイヤー内にレンダリングされたシーンを表すことが期待されることを示します。
XRTextureType
textureType、XRWebGLRenderingContext
context、および XRLayerLayout
layout を用いて determine the layout attribute するには、ユーザーエージェントは
次の手順を実行しなければなりません:
-
context が
WebGL2RenderingContextでなく、かつ textureType が"texture-array"である場合、TypeErrorを投げ、これらの手順を中止します。 -
textureType が
"texture-array"であり、かつセッションの list of views 内のすべての views が同じ recommended WebGL color texture resolution を持たない場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
layout が
"mono"である場合、layout を返し、これらの手順を中止します。 -
layout が
"default"である場合、次の手順を実行します:-
list of views のサイズが
1の場合、"mono"を返し、これらの手順を中止します。 -
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 を用いて determine the maximum scalefactor するには、ユーザーエージェントは
次の手順を実行しなければなりません:
-
largest width を、secondary views を除く、session の list of views からの recommended WebGL color texture resolution の最大幅とします。
-
largest height を、secondary views を除く、session の list of views からの recommended WebGL color texture resolution の最大高さとします。
-
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 を用いて
allocate color textures for projection
layers するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
array を、context の relevant realm 内の new array とします。
-
context を layer の context とします。
-
session を layer の session とします。
-
numViews を、secondary views を除く、session の list of views の数とします。
-
view を、session の list of views 内の、secondary views でない最初のエントリーとします。
-
width を、view の recommended WebGL color texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL color texture resolution の高さに scaleFactor を掛けたものとします。
-
textureFormat が list of color formats for projection layers に含まれない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
layer の
layoutが"mono"または"default"である場合:- textureType が
"texture-array"である場合: - セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended WebGL color texture
resolution を持たない場合、
NotSupportedErrorを投げ、これらの手順を中止します。- array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 width、および height を使用して、numViews レイヤーを持つ
TEXTURE_2D_ARRAYtexture として作成されます。- opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。- array を返し、これらの手順を中止します。
- array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 width、および height を使用して、numViews レイヤーを持つ
- それ以外の場合
-
session の list of views 内の各 view について:
-
view が secondary view である場合、継続します。
-
width を、view の recommended WebGL color texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL color texture resolution の高さに scaleFactor を掛けたものとします。
-
texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、 context、textureFormat、width および height を使用して、
TEXTURE_2Dtexture として作成されます。 -
texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
texture を array に追加します。
- array を返し、これらの手順を中止します。
-
- textureType が
-
セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended WebGL color texture resolution を持たない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
layer の
layoutがstereo-left-rightである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 numViews multiplied by width および height を使用して、 textureType texture として作成されます。 -
layer の
layoutがstereo-top-bottomである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 width および numViews multiplied by height を使用して、 textureType texture として作成されます。 -
opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
array を返します。
XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat、および float scaleFactor を用いて
allocate depth textures for projection
layers するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
array を、context の relevant realm 内の new array とします。
-
context を layer の context とします。
-
session を layer の session とします。
-
textureFormat が
0の場合、array を返し、これらの手順を中止します。 -
context が
WebGLRenderingContextであり、かつWEBGL_depth_textureextension が context 内で有効化されていない場合、 array を返し、これらの手順を中止します。 -
textureFormat が list of depth formats for projection layers に含まれない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
numViews を、secondary views を除く、session の list of views の数とします。
-
view を、session の list of views 内の、secondary view でない最初のエントリーとします。
-
width を、view の recommended WebGL depth texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL depth texture resolution の高さに scaleFactor を掛けたものとします。
-
layer の
layoutが"mono"または"default"である場合:- textureType が
"texture-array"である場合: - array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context、textureFormat、
stencil、width および height を使用して、numViews レイヤーを持つ
TEXTURE_2D_ARRAYtexture として作成されます。- opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。- array を返し、これらの手順を中止します。
- opaque texture を何らかの理由で作成できなかった場合、
- それ以外の場合
-
session の list of views 内の各 view について:
-
view が secondary view である場合、継続します。
-
width を、view の recommended WebGL depth texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL depth texture resolution の高さに scaleFactor を掛けたものとします。
-
texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、 context、textureFormat、stencil、 width および height を使用して、
TEXTURE_2Dtexture として作成されます。 -
texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
texture を array に追加します。
- array を返し、これらの手順を中止します。
-
- textureType が
-
セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended WebGL color texture resolution を持たない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
layer の
layoutがstereo-left-rightである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 stencil、numViews multiplied by width および height を使用して、 textureType texture として作成されます。 -
layer の
layoutがstereo-top-bottomである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、textureFormat、 stencil、width および numViews multiplied by height を使用して、 textureType texture として作成されます。 -
opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
array を返します。
XRProjectionLayer
layer を用いて allocate motion vector textures for
projection layers するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
array を、context の new array とします。
-
context を layer の context とします。
-
session を layer の session とします。
-
session が "space-warp" feature descriptor とともに作成されていなかった場合、 array を返し、これらの手順を中止します。
-
context が
WebGLRenderingContextであり、かつWEBGL_depth_textureextension が context 内で有効化されていない場合、 array を返し、これらの手順を中止します。 -
numViews を、secondary views を除く、session の list of views の数とします。
-
view を、session の list of views 内の、secondary view でない最初のエントリーとします。
-
width を、view の recommended motion vector texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended motion vector texture resolution の高さに scaleFactor を掛けたものとします。
-
layer の
layoutが"mono"または"default"である場合:- textureType が
"texture-array"である場合: - array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context、
RGBA16F、 width および height を使用して、numViews レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。- opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。- array を返し、これらの手順を中止します。
- opaque texture を何らかの理由で作成できなかった場合、
- それ以外の場合
-
session の list of views 内の各 view について:
-
view が secondary view である場合、継続します。
-
width を、view の recommended motion vector texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended motion vector texture resolution の高さに scaleFactor を掛けたものとします。
-
texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、 context、
RGBA16F、 width および height を使用して、TEXTURE_2Dtexture として作成されます。 -
texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
texture を array に追加します。
- array を返し、これらの手順を中止します。
-
- textureType が
-
セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended motion vector texture resolution を持たない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
layer の
layoutがstereo-left-rightである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、RGBA16F、 numViews multiplied by width および height を使用して、 textureType texture として作成されます。 -
layer の
layoutがstereo-top-bottomである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context、RGBA16F、 width および numViews multiplied by height を使用して、 textureType texture として作成されます。 -
opaque texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
array を返します。
XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat、および float scaleFactor を用いて
allocate the color textures for the
secondary views するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
context を layer の context とします。
-
session を layer の session とします。
-
array を、context の relevant realm 内の new array とします。
-
textureFormat が list of color formats for projection layers に含まれない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の list of views 内の各 view について:
-
view が secondary view でない場合、継続します。
-
width を、view の recommended WebGL color texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL color texture resolution の高さに scaleFactor を掛けたものとします。
-
texture を次のように初期化します:
- textureType が
"texture-array"である場合: - texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、
context、textureFormat、width および
height を使用して、
TEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、
context、textureFormat、width および
height を使用して、
TEXTURE_2Dtexture として作成されます。
- textureType が
-
texture を何らかの理由で作成できなかった場合、
OperationErrorを投げ、これらの手順を中止します。 -
texture を array に追加します。
-
-
array を返し、これらの手順を中止します。
XRProjectionLayer
layer、XRTextureType
textureType、GLenum
textureFormat、および float scaleFactor を用いて
allocate the depth textures for the
secondary views するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
context を layer の context とします。
-
session を layer の session とします。
-
textureFormat が
0の場合、array を返し、これらの手順を中止します。 -
context が
WebGLRenderingContextであり、かつWEBGL_depth_textureextension が context 内で有効化されていない場合、 array を返し、これらの手順を中止します。 -
textureFormat が list of depth formats for projection layers に含まれない場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
array を、context の relevant realm 内の new array とします。
-
session の list of views 内の各 view について:
-
view が secondary view でない場合、継続します。
-
width を、view の recommended WebGL depth texture resolution の幅に scaleFactor を掛けたものとします。
-
height を、view の recommended WebGL depth texture resolution の高さに scaleFactor を掛けたものとします。
-
texture を次のように初期化します:
- textureType が
"texture-array"である場合: - texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、
context、textureFormat、stencil、
width および height を使用して、
TEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- texture を、context の relevant realm 内の new opaque texture のインスタンスとします。これは、
context、textureFormat、stencil、
width および height を使用して、
TEXTURE_2Dtexture として作成されます。
- textureType が
-
texture を array に追加します。
-
-
array を返し、これらの手順を中止します。
scaleFactor は secondary views 用に再計算される必要があります。
XRCompositionLayer
layer、XRTextureType
textureType、および XRLayerInit
init を用いて allocate color
textures するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
array を、context の new array とします。
-
context を layer の context とします。
-
init の
colorFormatが list of color formats for non-projection layers に含まれない場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
init の
mipLevelsが1より小さい場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
init の
mipLevelsが1より大きく、かつviewPixelWidthおよびviewPixelHeightが2の累乗でない場合、InvalidStateErrorを投げ、これらの手順を中止します -
layer の
layoutが"mono"である場合:- textureType が
"texture-array"である場合: - array を、この context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
colorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、1 つの内部 texture を持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
colorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_2Dtexture として作成されます。
- textureType が
-
layer の
layoutが"stereo"である場合:- textureType が
"texture-array"である場合: - array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
colorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、2 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。- array を返し、これらの手順を中止します。
- それ以外の場合
- array を、context の relevant realm 内の new opaque
texture インスタンス 2 個で初期化します。これは、context および
init の
colorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_2Dtexture として作成されます。- array を返し、これらの手順を中止します。
- textureType が
-
layer の
layoutがstereo-left-rightである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のcolorFormat、mipLevels、viewPixelWidthの 2 倍およびviewPixelHeight値を使用して、textureType texture として作成されます。 -
layer の
layoutがstereo-top-bottomである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のcolorFormat、mipLevels、viewPixelWidthおよびviewPixelHeightの 2 倍の値を使用して、textureType texture として作成されます。 -
array を返します。
XRCompositionLayer
layer、XRTextureType
textureType、および XRLayerInit
init を用いて allocate depth
textures するには、ユーザーエージェントは次の手順を実行しなければなりません:
-
array を、context の new array とします。
-
context を layer の context とします。
-
init の
depthFormatが設定されていない場合、array を返し、これらの手順を中止します。 -
init の
depthFormatが list of depth formats for non-projection layers に含まれない場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
init の
mipLevelsが1より小さい場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
init の
mipLevelsが1より大きく、かつviewPixelWidthおよびviewPixelHeightが2の累乗でない場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
layer の
layoutが"mono"である場合:- textureType が
"texture-array"である場合: - array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
depthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、1 つの内部 texture を持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
depthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_2Dtexture として作成されます。
- textureType が
-
layer の
layoutが"stereo"である場合:- textureType が
"texture-array"である場合: - array を、context の relevant realm 内の new opaque
texture インスタンス 1 個で初期化します。これは、context および
init の
depthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、2 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。- array を返し、これらの手順を中止します。
- それ以外の場合
- array を、context の relevant realm 内の new opaque
texture インスタンス 2 個で初期化します。これは、context および
init の
depthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_2Dtexture として作成されます。- array を返し、これらの手順を中止します。
- textureType が
-
layer の
layoutがstereo-left-rightである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のdepthFormat、mipLevels、viewPixelWidthの 2 倍およびviewPixelHeight値を使用して、textureType texture として作成されます。 -
layer の
layoutがstereo-top-bottomである場合、array を、context の relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のdepthFormat、mipLevels、viewPixelWidthおよびviewPixelHeightの 2 倍の値を使用して、textureType texture として作成されます。 -
array を返します。
createProjectionLayer(optional XRProjectionLayerInit init)
メソッドは、新しい XRProjectionLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
layer を、this の relevant realm 内の new
XRProjectionLayerとします。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
layer に対して、session および context を指定して initialize a composition layer を実行します。
-
layer の isStatic を
falseに初期化します。 -
layer の
ignoreDepthValuesを次のように初期化します:- init の
depthFormatがfalseであり、かつ XR Compositor が depth values を使用する場合 - layer の
ignoreDepthValuesをfalseに初期化します - それ以外の場合
- layer の
ignoreDepthValuesをtrueに初期化します
- init の
-
layer の
fixedFoveationを0に初期化します。 -
layout を、init の
textureType、 context および"default"を指定して determining the layout attribute した結果とします。 -
maximum scalefactor を、session、context および layout を指定して determining the maximum scalefactor した結果とします。
-
scaleFactorが maximum scalefactor より大きい場合、scaleFactorを maximum scalefactor に設定します。 -
layer の
layoutを layout に初期化します。 -
layer の
needsRedrawをtrueに初期化します。 -
layer の colorTextures を、layer、init の
textureType、 init のcolorFormatおよび init のscaleFactorを指定して allocating color textures for projection layers した結果とします。 -
layer の depthStencilTextures を、layer、 init の
textureType、 init のdepthFormatおよび init のscaleFactorを指定して allocating depth textures for projection layers した結果とします。 -
layer の motionVectorTextures を、layer、 init の
depthFormatおよび init のscaleFactorを指定して allocating motion vector textures for projection layers した結果とします。 -
colortextures for secondary views を次のように初期化します:
- session が "secondary-views" を有効にして作成された場合
- colortextures for
secondary views を、layer、init の
textureType、 init のcolorFormatおよび init のscaleFactorを指定して allocate the color textures for the secondary views した結果とします。 - それ以外の場合
- colortextures for
secondary views を
nullとします。
-
depthstenciltextures for secondary views を次のように初期化します:
- session が "secondary-views" を有効にして作成された場合
- depthstenciltextures
for secondary views を、layer、init の
textureType、 init のdepthFormatおよび init のscaleFactorを指定して allocate the depth textures for the secondary views した結果とします。 - それ以外の場合
- depthstenciltextures
for secondary views を
nullとします。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
createQuadLayer(XRQuadLayerInit init)
メソッドは、新しい XRQuadLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
session が "layers" を有効にして作成されていなかった場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
layer を、this の relevant realm 内の new
XRQuadLayerとします。 -
layer に対して、session および context を指定して initialize a composition layer を実行します。
-
layer および init を指定して initialize a quad layer を実行します。
-
layout を、init の
textureType、 context および init のlayoutを指定して determining the layout attribute した結果とします。 -
layer の
layoutを layout に初期化します。 -
layer の
needsRedrawをtrueに初期化します。 -
layer の colorTextures を、layer、init の
textureTypeおよび init を指定して allocating color textures した結果とします。 -
layer の depthStencilTextures を、layer、 init の
textureTypeおよび init を指定して allocating depth textures した結果とします。 -
layer の motionVectorTextures を、context の relevant realm 内の new array とします。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
createCylinderLayer(XRCylinderLayerInit init)
メソッドは、新しい XRCylinderLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
session が "layers" を有効にして作成されていなかった場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
layer を、this の relevant realm 内の new
XRCylinderLayerとします。 -
layer に対して、session および context を指定して initialize a composition layer を実行します。
-
layer および init を指定して initialize a cylinder layer を実行します。
-
layout を、init の
textureType、 context および init のlayoutを指定して determining the layout attribute した結果とします。 -
layer の
layoutを layout に初期化します。 -
layer の
needsRedrawをtrueに初期化します。 -
layer の colorTextures を、layer、init の
textureTypeおよび init を指定して allocating color textures した結果とします。 -
layer の depthStencilTextures を、layer、 init の
textureTypeおよび init を指定して allocating depth textures した結果とします。 -
layer の motionVectorTextures を、context の relevant realm 内の new array とします。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
createEquirectLayer(XREquirectLayerLayerInit init)
メソッドは、新しい XREquirectLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
session が "layers" を有効にして作成されていなかった場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
init の
spaceがXRReferenceSpace型のインスタンスでない場合、TypeErrorを投げ、これらの手順を中止します。 -
init の
spaceが"viewer"の type を持つ場合、TypeErrorを投げ、これらの手順を中止します。 -
layer を、this の relevant realm 内の new
XREquirectLayerとします。 -
layer に対して、session および context を指定して initialize a composition layer を実行します。
-
layer および init を指定して initialize a equirect layer を実行します。
-
layout を、init の
textureType、 context および init のlayoutを指定して determining the layout attribute した結果とします。 -
layer の
layoutを layout に初期化します。 -
layer の
needsRedrawをtrueに初期化します。 -
layer の colorTextures を、layer、init の
textureTypeおよび init を指定して allocating color textures した結果とします。 -
layer の depthStencilTextures を、layer、 init の
textureTypeおよび init を指定して allocating depth textures した結果とします。 -
layer の motionVectorTextures を、context の relevant realm 内の new array とします。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
createCubeLayer(XRCubeLayerInit init)
メソッドは、新しい XRCubeLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
session が "layers" を有効にして作成されていなかった場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が
WebGL2RenderingContextcontext でない場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
context が lost である場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
init の
spaceがXRReferenceSpace型のインスタンスでない場合、TypeErrorを投げ、これらの手順を中止します。 -
init の
spaceが"viewer"の type を持つ場合、TypeErrorを投げ、これらの手順を中止します。 -
layer を、this の relevant realm 内の new
XRCubeLayerとします。 -
layer に対して、session および context を指定して initialize a composition layer を実行します。
-
layer の
orientationを次のように初期化します:- init の
orientationが設定されている場合 - layer の
orientationを、init のorientationを指定してfromPointを実行した結果とします。 - それ以外の場合
- layer の
orientationを、this の relevant realm 内の newDOMPointReadOnlyとします。
- init の
-
layout を init の
layoutとします。 -
textureType を init の
textureTypeとします。 -
layer の
needsRedrawをtrueに初期化します。 -
layout が
"default"または"stereo-left-right"または"stereo-top-bottom"である場合、TypeErrorを投げ、これらの手順を中止します。 -
layer の colorTextures を、この
XRCubeLayerの relevant realm 内の new array とします。 -
layout の値に基づき、layer の colorTextures を次のように初期化します:
-
layer の
layoutが"mono"である場合:- textureType が
"texture-array"である場合: - colorTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および init のcolorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、6 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- colorTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および init のcolorFormat、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_CUBE_MAPtexture として作成されます。
- textureType が
-
それ以外の場合で、layer の
layoutが"stereo"である場合:- textureType が
"texture-array"である場合: - colorTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および init のcolorFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、12 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- colorTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、 context および init のcolorFormat、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_CUBE_MAPtexture として作成されます。
- textureType が
-
-
layer の depthStencilTextures を、この
XRCubeLayerの relevant realm 内の new array とします。 -
layer の motionVectorTextures を、この
XRCubeLayerの relevant realm 内の new array とします。 -
init の
depthFormatが設定されている場合、layer の depthStencilTextures を次のように初期化します:-
context が
WebGL2RenderingContextでなく、かつWEBGL_depth_textureextension が context 内で有効化されていない場合、TypeErrorを投げ、これらの手順を中止します。 -
layer の
layoutが"mono"である場合:- textureType が
"texture-array"である場合: - depthStencilTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のdepthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、6 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- depthStencilTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のdepthFormat、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_CUBE_MAPtexture として作成されます。
- textureType が
-
それ以外の場合で、layer の
layoutが"stereo"である場合:- textureType が
"texture-array"である場合: - depthStencilTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および init のdepthFormat、mipLevels、viewPixelWidthおよびviewPixelHeight値を使用して、12 レイヤーを持つTEXTURE_2D_ARRAYtexture として作成されます。 - それ以外の場合
- depthStencilTextures を、この
XRCubeLayerの relevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、context および init のdepthFormat、viewPixelWidthおよびviewPixelHeight値を使用して、TEXTURE_CUBE_MAPtexture として作成されます。
- textureType が
-
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
textureType
に "texture-array"
を使用する場合、XRCubeLayer
は、
cube map の面を格納するために、次の順序で 6 個の texture layer を使用しなければなりません:
[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"
を使用する場合、左眼のコンテンツは layer index 0 から格納しなければならず、右眼のコンテンツは
layer index 6 から格納しなければなりません。
cubemap サイズが どのように決定されるかを定義する。
space はどのように 扱うべきか。cubemap の端まで歩いて行けるのか?
orientation
の初期状態を決定する。
XRCompositionLayer
layer および XRFrame
frame のパラメーターを持つ XRWebGLBinding
binding の validate the state of the
XRWebGLSubImage creation function を実行するには、ユーザーエージェントは次の手順を
実行しなければなりません:
-
frame の
sessionが layer の session と等しくない場合、falseを返し、これらの手順を中止します。 -
frame の active boolean が
falseの場合、falseを返し、これらの手順を中止します。 -
frame の animationFrame boolean が
falseの場合、falseを返し、これらの手順を中止します。 -
binding の session が layer の session と等しくない場合、
falseを返し、これらの手順を中止します。 -
binding の context が layer の context と等しくない場合、
falseを返し、これらの手順を中止します。 -
layer の colorTextures array が空または存在しない場合、
falseを返し、これらの手順を中止します。 -
layer の isStatic が
trueであり、かつ layer のneedsRedrawがfalseである場合、falseを返し、これらの手順を中止します。 -
trueを返します。
opaque texture
texture、XRLayerLayout
layout、integer offset および integer num を用いて、XRViewport
viewport の initialize the
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 を次のように初期化します:
-
getSubImage()が、同じ binding、layer および eye で以前に 呼び出されていた場合、ユーザーエージェントは次を行ってもよい - subimage を、同じ引数での以前の呼び出しによって返されたものと同じ
XRWebGLSubImageオブジェクトとします。 - それ以外の場合
- subimage を、this の relevant realm 内の new
XRWebGLSubImageとします。- subimage の
viewportを、this の relevant realm 内の newXRViewportとします。 - subimage の
-
-
layer が session の
layersarray 内にない場合、TypeErrorを投げ、これらの手順を中止します。 -
layer の型が
XRProjectionLayerである場合、TypeErrorを投げ、これらの手順を中止します。 -
layer の
layout属性が"default"である場合、TypeErrorを投げ、これらの手順を中止します。 -
index を
0とします。 -
layer の
layout属性が"stereo"である場合:-
eye が
"right"である場合:- layer が
XRCubeLayer型である場合 - index を
6に設定します - それ以外の場合
- index を
1に設定します
- layer が
-
layer および frame を指定して validate the state of the XRWebGLSubImage creation function した結果が
falseである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
subimage の
imageIndexを次のように初期化します:- layer が
"texture-array"の textureType で作成されていた場合 - subimage の
imageIndexを index で初期化します。 - それ以外の場合
- subimage の
imageIndexを0で初期化します。
- layer が
-
subimage の
colorTextureを次のように初期化します:- layer が
"texture"の textureType で作成されていた場合 - subimage の
colorTextureを、layer の colorTextures array のオフセット index にある要素で 初期化します。 - それ以外の場合
- subimage の
colorTextureを、layer の colorTextures array の最初の要素で 初期化します。
- layer が
-
subimage の
depthStencilTextureを次のように初期化します:- layer の depthStencilTextures が空の array である場合
- subimage の
depthStencilTextureをnullで初期化します。 - それ以外の場合で、layer が
"texture"の textureType で作成されていた場合 - subimage の
depthStencilTextureを、layer の depthStencilTextures array のオフセット index にある要素で 初期化します。 - それ以外の場合
- subimage の
depthStencilTextureを、layer の depthStencilTextures array の最初の要素で初期化します。
-
subimage の
motionVectorTexture、motionVectorTextureWidthおよびmotionVectorTextureHeightをnullで初期化します。 -
subimage の
colorTextureWidthを、subimage のcolorTextureのピクセル幅に設定します。 -
subimage の
colorTextureHeightを、subimage のcolorTextureのピクセル高さに設定します。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureWidthを、depthStencilTexturearray 内の最初の texture のピクセル幅に設定します。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureHeightを、depthStencilTexturearray 内の最初の texture のピクセル高さに設定します。 -
viewsPerTexture を
1とします。 -
layer の
layout属性が"stereo-left-right"または"stereo-top-bottom"である場合、viewsPerTexture を2に設定します。 -
subimage の
viewportに対して、subimage のcolorTexture、 layer のlayout、 index および viewsPerTexture を指定して initialize the viewport を実行します。 -
needsRedrawをfalseに設定するために、task をキューに入れます。 -
subimage を返します。
getViewSubImage(XRProjectionLayer layer, XRView view)
メソッドは、新しい XRWebGLSubImage
を作成します。
このメソッドが XRWebGLBinding
binding 上で呼び出されたとき、次の手順を実行しなければなりません:
-
subimage を次のように初期化します:
-
getViewSubImage()が、同じ binding、layer および view で以前に呼び出されていた場合、ユーザーエージェントは次を行ってもよい - subimage を、同じ引数での以前の呼び出しによって返されたものと同じ
XRWebGLSubImageオブジェクトとします。 - それ以外の場合
- subimage を、this の relevant realm 内の new
XRWebGLSubImageとします。- subimage の
viewportを、this の relevant realm 内の newXRViewportとします。 - subimage の
-
-
frame を view の
frameとします。 -
layer および frame を指定して validate the state of the XRWebGLSubImage creation function した結果が
falseである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
layer が session の
layersarray 内にない場合、TypeErrorを投げ、これらの手順を中止します。 -
view の active flag が
falseである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
index を次のように初期化します:
- view が、session の list of views からの secondary view である場合
- index を、primary views を除いた session の list of views 内における view の view のオフセットとします。
- それ以外の場合
- index を、secondary views を除いた session の list of views 内における view の view のオフセットとします。
-
subimage の
imageIndexを次のように初期化します:- layer が
"texture-array"の textureType で作成されていた場合: - subimage の
imageIndexを index で初期化します。 - それ以外の場合
- subimage の
imageIndexを0に初期化します。
- layer が
-
subimage の
colorTextureを次のように初期化します:- view が、session の list of views からの secondary view である場合
- subimage の
colorTextureを、layer の colorTextures for secondary views のオフセット index にある要素で初期化します。 - それ以外の場合で、layer の
layoutが"default"であり、かつ layer が"texture"の textureType で作成されていた場合 - subimage の
colorTextureを、layer の colorTextures array のオフセット index にある要素で 初期化します。 - それ以外の場合
- subimage の
colorTextureを、layer の colorTextures array の最初の要素で 初期化します。
-
subimage の
depthStencilTextureを次のように初期化します:- layer の depthStencilTextures が空の array である場合
- subimage の
depthStencilTextureをnullで初期化します。 - それ以外の場合で、view が、session の list of views からの secondary view である場合
- subimage の
colorTextureを、layer の depthStencilTextures for secondary views のオフセット index にある要素で初期化します。 - それ以外の場合で、layer の
layoutが"default"であり、かつ layer が"texture"の textureType で作成されていた場合 - subimage の
depthStencilTextureを、layer の depthStencilTextures array のオフセット index にある要素で 初期化します。 - それ以外の場合
- subimage の
depthStencilTextureを、layer の depthStencilTextures array の最初の要素で 初期化します。
-
subimage の
motionVectorTextureを次のように初期化します:- layer の motionVectorTextures が空の array であるか、または view が session の list of views からの secondary view である場合
- subimage の
motionVectorTextureをnullで初期化します。 - それ以外の場合で、layer が
"texture"の textureType で作成されていた場合 - subimage の
motionVectorTextureを、layer の motionVectorTextures array のオフセット index にある要素で 初期化します。 - それ以外の場合
- subimage の
motionVectorTextureを、layer の motionVectorTextures array の最初の要素で初期化します。
-
subimage の
colorTextureWidthを、subimage のcolorTextureのピクセル幅に設定します。 -
subimage の
colorTextureHeightを、subimage のcolorTextureのピクセル高さに設定します。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureWidthを、depthStencilTexturearray 内の最初の texture のピクセル幅に設定します。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureHeightを、depthStencilTexturearray 内の最初の texture のピクセル高さに設定します。 -
subimage の
motionVectorTextureがnullでない場合、subimage のmotionVectorTextureWidthを、motionVectorTexturearray 内の最初の texture のピクセル幅に設定します。 -
subimage の
motionVectorTextureがnullでない場合、subimage のmotionVectorTextureHeightを、motionVectorTexturearray 内の最初の texture のピクセル高さに設定します。 -
subimage の
viewportに対して、subimage のcolorTexture、 layer のlayout、 index および session の list of views の数を指定して、initialize the viewport を実行します。 -
needsRedrawをfalseに設定します。 -
subimage を返します
注: session は、getSubImage()
および getViewSubImage()
の呼び出しを、体験が WebGL を用いて描画を開始する時点まで遅延させるよう試みるべきです。
典型的には、それはゲームロジックの実行後になります。一部のユーザーエージェントでは、CPU 依存コードと
GPU 依存コードに個別の段階を持たせることで、システムリソースを動的に最適化できます。
foveateBoundTexture(GLenum target, float fixed_foveation)
は、現在バインドされている texture または texture array に foveation を適用します。
このメソッドが XRWebGLBinding
binding 上で呼び出されたとき、次の手順を実行しなければなりません:
-
target が
TEXTURE_2DまたはTEXTURE_2D_ARRAY型でない場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
ユーザーエージェントまたはデバイスが foveation をサポートしない場合、これらの手順を中止します。
-
fixed_foveation が
0未満である場合、それを0に設定します。 -
fixed_foveation が
1より大きい場合、それを1に設定します。 -
binding の context 内で target に texture がバインドされていない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
binding の context を使用して、
fixedFoveationと同じアルゴリズムを用い、fixed_foveation を target に適用します。 -
binding の context を使用して target にバインドされた texture を、foveatedTextures に追加します。
注: foveation の効果は 直ちに反映されます。
XRLayer
が layers
array のメンバーである場合、前回の XR animation
frame 以降に次の少なくとも 1 つが発生している場合に限り、XR animation
frame が完了した直後に、それを immersive XR
device に提示しなければなりません:
-
XRLayerが、前回の XR animation frame 以降にlayersに追加された。 -
XRLayerがXRWebGLLayerであり、かつclear、drawArrays、drawElements、 または framebuffer の color values に同様に影響するその他の rendering operation が、XRWebGLLayerに関連付けられたWebGLRenderingContextの現在バインドされている framebuffer として opaque framebuffer が存在する間に呼び出された。 -
XRLayerがXRCompositionLayerであり、かつgetSubImage()またはgetViewSubImage()が呼び出され、colorTexturetexture の color value に影響する rendering operation が呼び出された。
opaque framebuffer または colorTexture
texture が immersive XR device に提示される前に、ユーザーエージェントはすべての rendering
operations が flush されていることを保証しなければなりません。
7. Video layer の作成
7.1. XRMediaLayerInit
XRMediaLayerInit
dictionary は、video を含む XRCompositionLayer
がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary {XRMediaLayerInit required XRSpace space ;XRLayerLayout layout = "mono";boolean invertStereo =false ; };
space 属性は、ユーザーの物理環境との空間的関係を
定義します。
layout 属性は、XRCompositionLayer
内の video のレイアウトを定義します。
invertStereo 属性は、video 内の各 view の
自然な位置を反転すべきかどうかを定義します。
7.2. XRMediaQuadLayerInit
XRMediaQuadLayerInit
dictionary は、video を含む XRQuadLayer
がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary :XRMediaQuadLayerInit XRMediaLayerInit {XRRigidTransform ?;transform float ?;width float ?; };height
7.3. XRMediaCylinderLayerInit
XRMediaCylinderLayerInit
dictionary は、video を含む XRCylinderLayer
がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary :XRMediaCylinderLayerInit XRMediaLayerInit {XRRigidTransform ?;transform float = 2.0;radius float = 0.78539;centralAngle float ?; };aspectRatio
7.4. XRMediaEquirectLayerInit
XRMediaEquirectLayerInit
dictionary は、video を含む 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
のコンテンツを表示する layer を作成するために使用されます。
[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 dictionaries は optional であるべきではありません。これは bikeshed issue 1566 です。
各 XRMediaBinding
は、関連付けられた session を持ち、これはそれが作成されたときの
XRSession
です。
注: 複数の XRMediaBinding
を作成することは可能です。layer の存続期間は、それを作成した XRMediaBinding
の存続期間に結び付いていません。
XRMediaBinding
を通じて作成された各 layer は、内部 HTMLVideoElement
media
を持ちます。layer が session の renderState
の一部である場合、video の現在の frame を表示します。layer は、XR device または video の
native framerate のうち小さい方で更新されます。
注: layer には video frames のみが表示されます。 Video controls は作者が実装すべきであり、別の layer に描画されなければなりません。
video が layers に どのように blit されるかについて、より多くの明確化が必要です。
XRCompositionLayer
layer が、HTMLVideoElement
media とともにレンダリングされる必要がある場合、ユーザーエージェントは次の手順を
実行しなければなりません:
-
usability を、media の usability を確認した結果とします。
-
usability が
badである場合、layer を transparent black で塗りつぶし、これらの手順を中止します。 -
layer を media 要素のコンテンツで塗りつぶします。
XRMediaBinding(XRSession session)
コンストラクターは、呼び出されたときに次の手順を実行しなければなりません:
-
session の
ended値がtrueである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
session が immersive session でない場合、
InvalidStateErrorを投げ、これらの手順を中止します。 -
binding を、session の relevant realm 内の new
XRMediaBindingとします。 -
binding の session を session に初期化します。
-
binding を返します。
HTMLVideoElement
video と XRLayerLayout
layout の calculate the
aspect ratio を実行するには、次の手順を実行します:
-
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 の relevant realm 内の new
XRQuadLayerとします。 -
layer に対して、session を指定して initialize a composition layer を実行します。
-
layer の media を video に初期化します。
-
layer の
needsRedrawをfalseに初期化します。 -
aspectRatio を、video および init の
layoutを指定して calculate the aspect ratio した結果とします。 -
init の
heightがundefinedである場合、heightをwidthを aspectRatio で割った値に設定します。 -
init の
widthがundefinedである場合、widthをheightに aspectRatio を掛けた値に設定します。 -
layer および init を指定して initialize a quad layer を実行します。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
createCylinderLayer(HTMLVideoElement video, XRMediaCylinderLayerInit init)
メソッドは、新しい XRCylinderLayer
layer を作成します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
-
session が "layers" を有効にして作成されていなかった場合、
NotSupportedErrorを投げ、これらの手順を中止します。 -
session の
ended値がtrueである場合、InvalidStateErrorを投げ、これらの手順を中止します。 -
layer を、this の relevant realm 内の new
XRCylinderLayerとします。 -
layer に対して、session を指定して initialize a composition layer を実行します。
-
layer の media を video に初期化します。
-
layer の
needsRedrawをfalseに初期化します。 -
aspectRatio を、video および init の
layoutを指定して calculate the aspect ratio した結果とします。 -
init の
aspectRatioがundefinedである場合、aspectRatioを aspectRatio に設定します。 -
layer および init を指定して initialize a cylinder layer を実行します。
-
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 の relevant realm 内の new
XREquirectLayerとします。 -
layer に対して、session を指定して initialize a composition layer を実行します。
-
layer の media を video に初期化します。
-
layer の
needsRedrawをfalseに初期化します。 -
layer および init を指定して initialize a equirect layer を実行します。
-
XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、
OperationErrorを投げ、これらの手順を中止します。 -
layer を返します。
XREquirectLayer
のパラメーターが video 表示にどのように影響するかを定義する。
8. Events
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 属性は、event を生成した XRLayer
を示します。
8.2. Event Types
ユーザーエージェントは、次の新しい events を提供しなければなりません。events の登録と発火は、 DOM4 Events の通常の挙動に従わなければなりません。
ユーザーエージェントは、layer の underlying resources が失われた場合、または
XR
Compositor がその layer を再投影できなくなった場合、XRLayer
オブジェクト上で redraw event を発火してもよいです。
作者は、次の XR animation
frame で layer のコンテンツを再描画すべきです。event は XRLayerEvent
型でなければなりません。
9. Layers 間の depth sorting
既定では、layers
array が layers の composition の順序を定義し、各 layer は前の layer の上に描画されます。
アプリケーションが depth で sorted される layers を持ちたい場合、"depth-sorted-layers" feature
descriptor を指定して session を要求しなければなりません。
XRSession
が "depth-sorted-layers" feature
descriptor で作成された場合、XRProjectionLayer、
XRQuadLayer
および XRCylinderLayer
layers は、layers
array 内の位置ではなく、それらの depth に基づいて表示されなければなりません。
その他の layer types は、以前と同様に sorted され続けなければなりません。
XRQuadLayer
および XRCylinderLayer
layers は、それらの dimensions(たとえば width
または centralAngle)、
transform および space によって sorted されなければなりません。
XRProjectionLayer
layers は、それらの depthStencilTexture
内の値に従って sorted されなければなりません。これは、"depth-sorted-layers" が有効な場合、XR Compositor は depth values を使用しなければならず、ignoreDepthValues
および usesDepthValues
は `true` に設定されなければならないことも意味します。
10. Space warp
Space warp は、
XR Compositor の reprojection を改善する技術です。
motionVectorTexture
を depthStencilTexture
とともに送信することで、XR Compositor は高品質な frame extrapolation と
reprojection を行うことができ、ユーザーエージェントは低い framerate で動作しつつも、ユーザーに滑らかな
experience を提供できます。
space warp を有効にするには、
XRSession
は "space-warp" feature
descriptor で作成されなければなりません。
"space-warp" が有効な場合、XR Compositor
は depth values を使用しなければならず、ignoreDepthValues
は `false` に設定されなければならず、usesDepthValues
は `true` に設定されなければなりません。
motionVectorTexture
は RGBA16F
format でなければなりません。作者は、この texture の RGB components に、その領域の meters per second
単位の速度を埋めるべきです。red pixel は x axis、green は y axis、blue は z axis に対応します。
11. WebXR Device API 統合
11.1. XRRenderState の変更
このモジュールは、XRRenderStateInit
および XRRenderState
interfaces を、layers
という、XRLayer
の instances を含む新しい optional array で拡張します。
[SecureContext ,Exposed =Window ]partial interface XRRenderState {readonly attribute FrozenArray <XRLayer >layers ; };
layers 属性は、XR Compositor
によって表示される XRLayer
の instances を含む array を返します。
既定では、layers
array が layers の composition の順序を定義します。XR Compositor は、
source-over blending を用いて、array 内の位置の順に
各 layer を描画しなければなりません。"depth-sorted-layers" feature
descriptor が有効でない限り、XR Compositor は layers にいかなる depth sorting も適用してはなりません。
注: これは、各 layer が、以前の layers が視聴者に 仮想的により近いかどうかにかかわらず、以前の layers を上書きする可能性があることを意味します。
XRRenderState
オブジェクト state が XRSession
session のために作成されるとき、ユーザーエージェントは次の手順を実行することによって
initialize the render state しなければなりません:
-
initialize the render state するための元の手順を 実行することにより、state を初期化します。
-
state の
layersを、session の relevant realm 内の new empty array で初期化します。
11.2. updateRenderState の変更
このモジュールは、WebXR 仕様の "update the pending layers state" によって与えられる手順を
置き換えます。代わりに、ユーザーエージェントが XRSession
session および XRRenderStateInit
newState を用いて
update the pending layers state するとき、次の手順を
実行しなければなりません:
-
newState の
baseLayerと newState のlayersの両方が設定されている場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
activeState を、session の active render state とします。
-
newState の
baseLayerが設定されている場合:-
session の pending render state が
nullである場合、 それを activeState のコピーに設定します。 -
session の pending render state の
layersをnullに設定します。
-
-
newState の
layersが設定されている場合:-
session が "layers" を有効にして作成されておらず、かつ newState の
layersが1個を超える instance を含む場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
newState の
layersがmaxRenderLayersentries を超えて含む場合、NotSupportedErrorを投げ、これらの手順を中止します。 -
session の pending render state が
nullである場合、 それを activeState のコピーに設定します。 -
newState の
layersが重複する instances を含む場合、TypeErrorを投げ、これらの手順を中止します。 -
newState の
layers内の各 layer について:-
layer が
XRCompositionLayerであり、かつ layer の session が session と異なる場合、TypeErrorを投げ、これらの手順を中止します。 -
layer が
XRWebGLLayerであり、かつ layer の session が session と異なる場合、TypeErrorを投げ、これらの手順を中止します。
-
-
session の pending render state の
baseLayerをnullに設定します。 -
session の pending render state の
layersを newState のlayersに設定します。
-
11.3. XRCompositor の変更
XR Compositor は、layers
array からのすべての XRLayer
instances が同時に合成されるように拡張されなければなりません。WebXR に対する他のすべての
要件は、引き続き適用されなければなりません。
XR
Compositor が、XREye
が "none"
である view に
レンダリングしており、かつ XRCompositionLayer
を描画していて、それが XRProjectionLayer
ではなく、かつ layout
が "mono"
でない場合、XR Compositor は、その view
が XREye
の "left"
を持つかのように、その layer をレンダリングしなければなりません。
注: これは、layer の右眼側が無視されることを 意味します。これにより、作者は stereoscopic および monoscopic devices に同じ assets を使用できます。
11.4. XRView の変更
各 view は、view を 収めるのに十分な大きさの WebGL texture resolution の最良推定値を表す recommended WebGL color texture resolution を 定義しなければなりません。XRSession
が "space-warp" feature
descriptor で作成された場合、各 view は、recommended WebGL color texture
resolution に基づく recommended motion vector texture resolution
を定義しなければなりません。
各 view は、 recommended WebGL color texture resolution および recommended motion vector texture resolution に基づく recommended WebGL depth texture resolution も 定義しなければなりません。ユーザーエージェントは、"space-warp" が有効な場合、 recommended WebGL depth texture resolution を削減することを決定してもよいです。
"depth-sorted-layers" feature descriptor が有効な場合、recommended WebGL depth texture resolution は recommended WebGL color texture resolution と等しくなければなりません。
11.5. Animation frames の変更
renderState
state を用いて check the layers
state するには、ユーザーエージェントは次の手順を実行しなければなりません:
11.6. XRSession の変更
このモジュールは、XRSession interface に対して次を拡張および追加します:[SecureContext ,Exposed =Window ]partial interface XRSession {readonly attribute unsigned long maxRenderLayers ; };
maxRenderLayers は、compositor が処理しなければ
ならない layers の最大数、したがって任意の XRRenderStateInit
の
layers
array の最大サイズを表します。ある時点でこの数を超える layers を作成できるべきです。
注: このガイダンスは、Allocation
of layers で説明されているような、ユーザーエージェントが割り当て可能な
layers 数の制限を提供することを意図していません。User Agents は、たとえば 20 個の layers を作成できるようにしつつ、
updateRenderState()
を通じて一度に設定できるのは 10 個だけにすることができます。また、異なる layers は異なる量の backend power
または objects を必要とする可能性があるため、ユーザーエージェントには、少なくともその数の layers をレンダリング
できることを保証するために `maxRenderLayers` 値を設定する裁量があることにも注意してください。ただし、ユーザーエージェントは、
より多くの layers が渡された場合は常に拒否する必要があり、より少ない layers が updateRenderState に渡された場合は
拒否できません。
各 XRSession
は、その session で作成された各 XRWebGLBinding
への弱参照を保持する内部 WeakSet bindings を持ちます。
このモジュールは、WebXR 仕様の "shut down the session" に手順を追加します。 次をリストに追加します:
-
session| の bindings 内の各 binding について:
-
binding の foveatedTextures 内の各 texture について:
-
texture から foveation を削除します。
-
12. セキュリティおよびプライバシーに関する考慮事項
12.1. Composition のタイミング
Composition timing は、レンダリングされるコンテンツから独立していなければなりません。 さらに、ある layer 内のコンテンツは、他の layers で観測可能であってはなりません。
可能であれば、layers の composition は、timing attacks やその他のセキュリティ脆弱性のリスクを低減するために、 ブラウザー外で行われるべきです。
12.2. Layers の割り当て
ユーザーエージェントは、GPU hardware の識別可能性を低減するため、最大 pixel size や layers 数などの 任意の resource allocation に制限を設けてもよいです。
変更点
First Public Working Draft 3 December 2020 からの変更点
新機能:
-
XRCompositionLayer への opacity サポートを追加(GitHub #284
-
Layers 間の depth testing サポートを追加(GitHub #271)
-
XRWebGLBinding への usesDepthValues サポートを追加(GitHub #269)
-
context で depth support が有効でない場合でも projection layers の作成を許可(GitHub #250)
-
作成された mip levels 数を返すサポートを追加(GitHub #245)
-
mipmapping のサポートを追加(GitHub #243)
-
Texture size attributes(GitHub #241)
変更:
-
layout algo および opaque textures の clearing における小さな issue を修正(GitHub #257)
-
aspectratio を明確化(GitHub #256)
-
layer memory allocation に関する文言を追加(GitHub #255)
-
layer creation における synchronous GPU allocation を削除 + getsubimage/getviewsubimage に validation を追加(GitHub #254)
-
getSubImage および getViewSubImage におけるいくつかの修正(GitHub #253)
-
side-by-side textures の欠落した処理に対する修正(GitHub #251)
-
optional dictionary arguments に既定値 {} を追加(GitHub #248)
-
foveation を projection layer に移動(GitHub #247)
-
textureLayers を textureArrayLength に改名(GitHub #242)
-
opaque textures は frame の開始時に常に初期化されることを明確化(GitHub #234)