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について、
ユーザーエージェントは、次の手順を実行しなければならない:
-
layerの
needsRedrawをtrueに設定する。 -
layerが
XRProjectionLayerでない場合、 タスクをキューに入れ、layer上でXRLayerEventを使用して、redrawという名前のイベントを発火する。
各XRCompositionLayer
には、関連付けられた破棄済みブール値があり、初期値は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を使用してコンポジションレイヤーを初期化するには、ユーザーエージェントは次の手順を実行しなければならない:
destroy()
をXRCompositionLayer
layer上で呼び出すとき、ユーザーエージェントは次の手順を実行しなければならない:
-
layerの破棄済みが
trueの場合、返る。 -
layerの破棄済みを
trueに設定する。 -
layerを使用してレイヤーのリソースを破棄するを実行する。
-
sessionをlayerのセッションとする。
-
sessionの保留中のレンダー状態が
nullの場合:-
sessionのアクティブなレンダー状態の
layersがlayerを含まない場合、返る。 -
sessionの保留中のレンダー状態を、 sessionのアクティブなレンダー状態のコピーに設定する。
-
-
stateをsessionの保留中のレンダー状態とする。
-
stateの
layersがnullであるか、layerを含まない場合、返る。 -
stateの
layersを、stateのlayers内のlayer以外の各エントリーを順番に含む、新しい凍結配列に設定する。
各XRCompositionLayer
には、nullまたはWebGLRenderingContext
またはWebGL2RenderingContext
のインスタンスであるコンテキストオブジェクトと、nullまたはHTMLVideoElementのインスタンスであるメディア
オブジェクトがある。
各XRCompositionLayer
には、関連付けられたセッションがあり、これはその作成時に使用された
XRSession
である。
XRSpace
spaceとXRCompositionLayer
layerを使用してレイヤー上の
空間を設定するとき、ユーザーエージェントはspaceが
有効かどうかを検証するために次の手順を実行しなければならない:
XRCompositionLayer
には、作者がneedsRedraw
がtrueである場合にのみこのレイヤーへ描画できることを示す、内部ブール値isStaticがある。
注: isStaticが
trueの場合、作者は作成後に一度、または
redrawイベントの後に一度だけレイヤーへ描画できる。これにより、UAは単一のGPUバッファのみを割り当てることができる。
書き込み可能な属性がXRCompositionLayer
またはその派生クラスのいずれかで設定された場合、
その属性を読み取ると、その値を返さなければならない。
requestAnimationFrame()
コールバックの終了時に、その値は
基礎となるXRコンポジターへ送信されなければならない。XRコンポジターは、
requestAnimationFrame()
コールバックに渡されたXRFrame
を次に提示するとき、その値を適用しなければならない。
注: これは、
XRコンポジターが新しいXRFrameを使用してシーンを再描画するときには、
colorTextureに変更がなかった場合でも、
XRCompositionLayer
に関連付けられたもの、またはメディアレイヤーに関連付けられたvideo frameに変更がなかった場合でも、新しい値を適用しなければならないことを意味する。
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空間内に配置され、方向付けされた2次元オブジェクトである。クワッドの 位置 はクワッドの中心を指す。

[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
を設定するときは、まず 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
AnXRCylinderLayer
は、仮想環境内の湾曲した矩形空間を占めるレイヤーをレンダリングする。
レイヤーの前面のみが可視でなければならず、背面はXRコンポジターによって描画されてはならない。

XRCylinderLayerには厚みがない。これは3D空間内に配置され、方向付けされた2次元オブジェクトである。シリンダーの 位置 はクワッドの中心を指す。
[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
を設定するときは、まず 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
AnXREquirectLayer
は、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 で 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コンポジターがキューブマップから直接レンダリングするレイヤーを
レンダリングする。

[Exposed =Window ]interface :XRCubeLayer XRCompositionLayer {attribute XRSpace space ;attribute DOMPointReadOnly orientation ; // イベントattribute 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 テクスチャのどのビューポートを表すかを示す。
[Exposed =Window ]interface { [XRSubImage SameObject ]readonly attribute XRViewport viewport ; };
NOTE: このクラスは将来の 拡張に対応できるよう設計されている
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 ; };
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 は、割り当てられるテクスチャの型を定義します。
enum {XRTextureType "texture" ,"texture-array" };
-
textureのテクスチャ型は、XRWebGLSubImageのテクスチャがTEXTURE_2D型でなければならないことを示します -
texture-arrayのテクスチャ型は、XRWebGLSubImageのテクスチャがTEXTURE_2D_ARRAY型でなければならないことを示します
6. GPU レイヤーおよびビューの作成
6.1. 概要
レイヤーが作成されると、それは Web
プラットフォームのグラフィックス API の 1 つによって提供される GPU リソース、通常はテクスチャによって裏付けられる。
どの API がレイヤーの GPU リソースを提供しているかを
指定するために、対象の API 用の XRWebGLBinding
を作成しなければならない。
各グラフィックス API には、レイヤーの作成でコンテキストを使用できるようになる前に
満たされなければならない固有の要件がある場合がある。たとえば、
WebGLRenderingContext
は、XRWebGLBinding
インスタンスのコンストラクターに渡される前に、その xrCompatible フラグが設定されていなければならない。
XRSession
とグラフィックス API との間の、テクスチャの割り当てや取得などのあらゆる相互作用は、この XRWebGLBinding
インスタンスを通じて行われ、その相互作用の正確な仕組みは
通常 API 固有である。これにより、WebXR API の残りの部分は
グラフィックス API に依存せず、将来のレンダリング技術の進歩により容易に適応できる。
XRWebGLBinding
インスタンスが取得されると、それを使用してさまざまな XRCompositionLayer
を作成できる。
そのインスタンスによって作成されたレイヤーは、その後、各フレームで関連付けられた
GPU リソースを照会できるようになり、一般にネイティブ API のテクスチャ
インターフェイスであることが期待される。
さまざまなレイヤー型は、XRWebGLBinding
インスタンス上の create____Layer 系列のメソッドで作成される。必要なグラフィックスリソースに関する情報、
たとえば深度バッファまたはアルファチャンネルを割り当てるかどうかなどは、レイヤー作成時に渡され、
レイヤーの存続期間中は不変となる。
このメソッドは、関連付けられた XRCompositionLayer 型を返す。
XRSession
が "layers" 機能
記述子 付きで作成された場合、それはすべてのレイヤー型をサポートしなければならない。
レイヤー型がサポートされていない場合、その作成メソッドは例外を投げなければならない。XRProjectionLayer
は、"layers" 機能
記述子 付きで作成されたかどうかにかかわらず、すべての XRSession
によってサポートされなければならない。
6.2. 不透明テクスチャ
When using WebXR GPU layers, theXRWebGLBinding
オブジェクトは、カラーおよび深度/ステンシルアタッチメント用の不透明テクスチャのインスタンスを返す。
不透明テクスチャは、
次の変更点を除き、標準のWebGLTexture
と同一に機能する:
-
不透明テクスチャは、 そのセッションの
requestAnimationFrame()コールバックの外部では無効と見なされる。 -
不透明テクスチャは、
getSubImage()またはgetViewSubImage()の呼び出しによって返されるまで無効である。 -
XRコンポジターは、カラーアタッチメント用の不透明テクスチャが 乗算済みアルファを持つ色を含むものと仮定しなければならない。
-
requestAnimationFrame()コールバックの終了時に、テクスチャはバインドを解除され、すべてのWebGLShaderオブジェクトからデタッチされなければならない。 -
不透明テクスチャ は、WebGL 1.0コンテキストを使用している場合でも、適宜texStorage2DまたはtexStorage3Dで割り当てられたかのように振る舞わなければならない。
-
不透明 テクスチャを指定した
deleteTextureの呼び出しは、INVALID_OPERATIONエラーを生成しなければならない。
不透明テクスチャにアタッチされたバッファは、clearOnAccess
がtrueの場合、各XRアニメーションフレームにおけるgetViewSubImage()
またはgetSubImage()
の最初の呼び出しの処理中に、下の表の値にクリアされなければならない。
clearOnAccess
がfalseの場合、不透明テクスチャにアタッチされたバッファは、最初にアクセスされたときにクリアされなければならない。
それ以降のフレームでの後続のアクセスでは、バッファをクリアしなくてもよい。
| バッファ | クリア値 |
|---|---|
| カラー | (0, 0, 0, 0) |
| 深度 | 1.0 |
| ステンシル | 0 |
不透明テクスチャが
2以上のmipLevelsで作成された場合、
作者はすべてのミップレベルを設定するべきである。ユーザーエージェントは、ミップ
レベルを作成すべきであると仮定してはならない。
注: 不透明テクスチャは、レイヤーが構築されるときに
カラーテクスチャを
割り当てるおよび深度テクスチャを割り当てるアルゴリズムを使用して割り当てられる。この
事前割り当ての副作用として、
getSubImage()
およびgetViewSubImage()
を同じパラメーターで呼び出すと、常に同じテクスチャオブジェクトが返される。
注: 不透明テクスチャの寸法またはフォーマットの変更は 許可されない。GLコマンドは、 テクセル値およびテクスチャパラメーターのみを変更できる。次のいずれかの コマンドをWebGLTextureに対して使用すると、寸法またはフォーマットに影響しない場合でも、INVALID_OPERATIONエラーが 生成される: TexImage*、CompressedTexImage*、 CopyTexImage*およびTexStorage*。 OpenGL ES 3.0仕様の「不変フォーマット テクスチャ画像」 の節では、これらの制限をより詳細に定義している。
レイヤー用のリソース(メモリなど)の割り当ては、WebGLと同じメカニズムを通じて行われなければならない。
XRLayer
がRGBA
またはRGB
のcolorFormatで割り当てられた場合、
そのcolorTexturesは、
WebGLRenderingContext
コンテキストに対してRGBA
またはRGB
として公開されなければならない。
ただし、XRコンポジターは、colorTexturesのピクセルを、
SRGB8_ALPHA8
またはSRGB8
のcolorFormatであるかのように扱わなければならない。
注: これは、XRコンポジターが、
colorTexturesを処理するときに、線形RGBA
またはRGB
からいかなるガンマ変換も行ってはならないことを意味する。そうでない場合、最終レンダリングのピクセルが
明るすぎて見え、通常の2DWebGLRenderingContext
コンテキスト上のレンダリングと一致しなくなる。
6.3. XRProjectionLayerInit
XRProjectionLayerInit
辞書は、XRProjectionLayer
をどのように初期化するかを記述する、設定可能な値の集合を表す。
dictionary {XRProjectionLayerInit XRTextureType textureType = "texture";GLenum colorFormat = 0x1908; // RGBAGLenum depthFormat = 0x1902; // DEPTH_COMPONENTdouble scaleFactor = 1.0;boolean clearOnAccess =true ; };
textureType 属性は、
レイヤーが持つテクスチャの型を定義する。
colorFormat 属性は、
カラーテクスチャデータのデータ型を定義する。
これは、XRコンポジターがサポートしなければならないプロジェクションレイヤーのカラーフォーマットのリストである:
WebGL2コンテキストでは、次の追加フォーマットがサポートされる:
depthFormat 属性は、
深度テクスチャデータのデータ型を定義する。
depthFormat
が0の場合、レイヤーは深度/ステンシルテクスチャを提供しない。
これは、XRコンポジターがサポートしなければならないプロジェクションレイヤーの深度フォーマットのリストである:
「WEBGL_depth_texture」
拡張が有効なWebGLRenderingContext
コンテキスト、またはWebGL2コンテキストの場合:
拡張が有効になっていない場合、深度テクスチャの要求は無視される。
注: 作者は深度テクスチャを 期待する可能性があるため、これは作者を混乱させる可能性がある。可能であれば、テクスチャが 作成されなかった理由を示す警告を提供する。
WebGL2RenderingContext
コンテキストでは、次の追加フォーマットがサポートされる:
scaleFactor 属性は、
レイヤーのアタッチメントの解像度を決定するときに、sessionの
推奨WebGLフレームバッファ解像度に乗算しなければならない値を定義する。
clearOnAccess 属性は、
このレイヤーに関連付けられたテクスチャを初期フレームでクリアするか、すべてのフレームでクリアするかを定義する。
注: XRProjectionLayerInit
辞書には、
XRLayerInit
のようにmipLevels
を構成するためのサポートがない。
ユーザーエージェントがプロジェクションレイヤーでミップマッピングをサポートしたい場合、ミップを含むテクスチャを自由に割り当てることができる。
その場合、すべてのミップレベルを生成する責任は作者ではなくユーザーエージェントにある。
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 辞書は オプションであるべきではない。これは Bikeshed issue 1566 である。
各 XRWebGLBinding
は、型 XRWebGLRenderingContext
の context オブジェクトを持ち、これは
WebGLRenderingContext
または WebGL2RenderingContext
のいずれかのインスタンスである。
各 XRWebGLBinding
には関連付けられた session があり、これは作成時に使用された
XRSession
である。
各 XRWebGLBinding
は、foveateBoundTexture
を呼び出した際に指定されたターゲットへバインドされていたテクスチャへの弱参照を保持する、内部 WeakSet
foveatedTextures を持つ。
注: 複数の XRWebGLBinding
を作成することが可能である。XRWebGLBinding
のインスタンスで作成された任意のレイヤーは、
両方が同じ session
および同じ
context
で作成されている限り、
別の XRWebGLBinding
のインスタンスでも使用できる。レイヤーまたは XRWebGLSubImage
のインスタンスの存続期間は、それらを作成した XRWebGLBinding
の存続期間には結び付けられない。
XRWebGLBinding
を通じて作成された各 XRCompositionLayer
は、カラーテクスチャ用の WebGLTextures
の array である内部 colorTextures 配列、
深度/ステンシルテクスチャ用の 不透明テクスチャの
array である内部 depthStencilTextures、および
モーションテクスチャ用の 不透明テクスチャの
array である内部 motionVectorTextures を持つ。
XRWebGLBinding
を通じて作成された各 XRProjectionLayer
は、カラーテクスチャ用の 不透明テクスチャの
array である内部 セカンダリビュー用の colorTextures
配列と、セカンダリビューのレンダリングに使用される深度/ステンシルテクスチャ用の 不透明テクスチャの array である内部 セカンダリビュー用の depthStencilTextures
配列を持つ。
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 フレームバッファ解像度を得るための値を返す。
サイズによってレイアウトが変更される場合の
UA の特別な動作(たとえば "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をスローし、これらの手順を中止する。- array を、context の 関連レルムにある 不透明 テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context、textureFormat、width、height を使用し、 numViews 個のレイヤーを持つ
TEXTURE_2D_ARRAYテクスチャとして作成される。- 何らかの理由で 不透明 テクスチャを作成できなかった場合、
OperationErrorをスローし、これらの手順を中止する。- array を返し、これらの手順を中止する。
- array を、context の 関連レルムにある 不透明 テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは 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の場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context、textureFormat、 numViews を乗算した width、および height を使用して textureType テクスチャとして作成される。 -
layer の
layoutがstereo-top-bottomの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 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"の場合: - array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
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の場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context、textureFormat、 stencil、numViews を乗算した width、height を使用して textureType テクスチャとして作成される。 -
layer の
layoutがstereo-top-bottomの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 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"の場合: - array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
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の場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context、RGBA16F、 numViews を乗算した width、height を使用して textureType テクスチャとして作成される。 -
layer の
layoutがstereo-top-bottomの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 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 を返し、これらの手順を中止する。
scaleFactor は セカンダリビュー用に再計算する必要がある。
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"の場合: - array を、この context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
colorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、内部テクスチャを 1 個持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
colorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_2Dテクスチャとして作成される。
- textureType が
-
layer の
layoutが"stereo"の場合:- textureType が
"texture-array"の場合: - array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
colorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、2 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。- array を返し、これらの手順を中止する。
- それ以外の場合
- array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 2 個で初期化する。これらのインスタンスは、
context と init の
colorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_2Dテクスチャとして作成される。- array を返し、これらの手順を中止する。
- textureType が
-
layer の
layoutがstereo-left-rightの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context と init のcolorFormat、mipLevels、viewPixelWidthの 2 倍、およびviewPixelHeightの値を使用して textureType テクスチャとして作成される。 -
layer の
layoutがstereo-top-bottomの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context と init のcolorFormat、mipLevels、viewPixelWidthおよびviewPixelHeightの 2 倍の値を使用して 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"の場合: - array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
depthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、内部テクスチャを 1 個持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
depthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_2Dテクスチャとして作成される。
- textureType が
-
layer の
layoutが"stereo"の場合:- textureType が
"texture-array"の場合: - array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、
context と init の
depthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、2 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。- array を返し、これらの手順を中止する。
- それ以外の場合
- array を、context の 関連レルムにある 不透明
テクスチャの 新しいインスタンス 2 個で初期化する。これらのインスタンスは、
context と init の
depthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_2Dテクスチャとして作成される。- array を返し、これらの手順を中止する。
- textureType が
-
layer の
layoutがstereo-left-rightの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context と init のdepthFormat、mipLevels、viewPixelWidthの 2 倍、およびviewPixelHeightの値を使用して textureType テクスチャとして作成される。 -
layer の
layoutがstereo-top-bottomの場合、 array を、context の 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは、 context と init のdepthFormat、mipLevels、viewPixelWidthおよびviewPixelHeightの 2 倍の値を使用して textureType テクスチャとして作成される。 -
array を返す。
createProjectionLayer(optional XRProjectionLayerInit init)
メソッドは、新しい XRProjectionLayer
layer を作成する。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
layer を、this の 関連レルムにおける 新しい
XRProjectionLayerとする。 -
session の
ended値がtrueの場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
context が失われている場合、
InvalidStateErrorをスローし、これらの手順を中止する。 -
layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。
-
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 を、this の 関連レルムにおける 新しい
XRQuadLayerとする。 -
layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。
-
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 を、this の 関連レルムにおける 新しい
XRCylinderLayerとする。 -
layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。
-
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をスローし、これらの手順を中止する。 -
init の
spaceの type が"viewer"の場合、TypeErrorをスローし、これらの手順を中止する。 -
layer を、this の 関連レルムにおける 新しい
XREquirectLayerとする。 -
layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。
-
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をスローし、これらの手順を中止する。 -
init の
spaceの type が"viewer"の場合、TypeErrorをスローし、これらの手順を中止する。 -
layer を、this の 関連レルムにおける 新しい
XRCubeLayerとする。 -
layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。
-
layer の
orientationを次のように初期化する:- init の
orientationが設定されている場合 - layer の
orientationを、init のorientationを使用してfromPointを実行した結果とする。 - それ以外の場合
- layer の
orientationを、this の 関連レルムにおける 新しい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"の場合: - colorTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のcolorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、6 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- colorTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のcolorFormat、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_CUBE_MAPテクスチャとして作成される。
- textureType が
-
それ以外で、layer の
layoutが"stereo"の場合:- textureType が
"texture-array"の場合: - colorTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のcolorFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、12 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- colorTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 2 個で初期化する。これらのインスタンスは 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"の場合: - depthStencilTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のdepthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、6 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- depthStencilTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のdepthFormat、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_CUBE_MAPテクスチャとして作成される。
- textureType が
-
それ以外で、layer の
layoutが"stereo"の場合:- textureType が
"texture-array"の場合: - depthStencilTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 1 個で初期化する。このインスタンスは context と init のdepthFormat、mipLevels、viewPixelWidth、viewPixelHeightの値を使用し、12 レイヤーを持つTEXTURE_2D_ARRAYテクスチャとして作成される。 - それ以外の場合
- depthStencilTextures を、この
XRCubeLayerの 関連レルムにある 不透明テクスチャの 新しいインスタンス 2 個で初期化する。これらのインスタンスは context と init のdepthFormat、viewPixelWidth、viewPixelHeightの値を使用してTEXTURE_CUBE_MAPテクスチャとして作成される。
- textureType が
-
-
XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、
OperationErrorをスローし、これらの手順を中止する。 -
layer を返す。
textureType
に "texture-array"
を使用する場合、XRCubeLayer
は、
次の順序でキューブマップの面を格納するために 6 個のテクスチャレイヤーを使用しなければならない:
[TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z]
textureType
に "texture-array"
を使用し、layout
に "stereo"
を使用する場合、左目のコンテンツはレイヤーインデックス 0 から格納されなければならず、右目のコンテンツは
レイヤーインデックス 6 から格納されなければならない。
空間をどのように 扱うべきか。キューブマップの端まで歩くことはできるか?
orientation
の初期状態を決定する。
XRWebGLBinding
binding の XRCompositionLayer
layer および XRFrame
frame というパラメーターを持つ XRWebGLSubImage 作成関数の状態を
検証するには、ユーザーエージェントは次の手順を実行しなければならない:
-
frame の
sessionが layer の session と等しくない場合、falseを返し、 これらの手順を中止する。 -
frame の active ブール値が
falseの場合、falseを返し、これらの手順を中止する。 -
frame の animationFrame ブール値が
falseの場合、falseを返し、これらの手順を中止する。 -
binding の session が layer の session と等しくない場合、
falseを返し、 これらの手順を中止する。 -
binding の context が layer の context と等しくない場合、
falseを返し、 これらの手順を中止する。 -
layer の colorTextures 配列が空または存在しない場合、
falseを返し、これらの手順を中止する。 -
layer の isStatic が
trueであり、 layer のneedsRedrawがfalseの場合、falseを返し、これらの手順を中止する。 -
trueを返す。
不透明テクスチャ
texture、XRLayerLayout
layout、整数 offset、および整数 num を使用して、XRViewport
viewport のビューポートを
初期化するには、ユーザーエージェントは次の手順を実行しなければならない:
-
viewport の
xを0に設定する。 -
viewport の
yを0に設定する。 -
viewport の
widthを texture のピクセル幅に設定する。 -
viewport の
heightを texture のピクセル高さに設定する。 -
viewport を次のように更新する:
- layout が
"stereo-left-right"の場合 - viewport の
xを、texture のピクセル幅に offset を乗算し、 num で除算した値に設定する。- viewport の
widthを、subimage の texture のピクセル幅を num で除算した値に設定する。 - viewport の
- それ以外で layout が
"stereo-top-bottom"の場合 - viewport の
yを、texture のピクセル高さに offset を乗算し、 num で除算した値に設定する。- viewport の
heightを、subimage の texture のピクセル高さを num で除算した値に設定する。 - viewport の
- layout が
getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none")
メソッドは、新しい XRWebGLSubImage
を作成する。
このメソッドが XRWebGLBinding
binding 上で呼び出されたとき、次の手順を実行しなければならない:
-
subimage を次のように初期化する:
-
getSubImage()が以前に同じ binding、layer、および eye で呼び出されていた場合、 ユーザーエージェントは次のようにしてもよい - subimage を、同じ引数による以前の呼び出しで返されたものと同じ
XRWebGLSubImageオブジェクトとする。 - それ以外の場合
- subimage を、this の 関連レルムにおける 新しい
XRWebGLSubImageとする。- subimage の
viewportを、this の 関連レルムにおける 新しいXRViewportとする。 - subimage の
-
-
layer の destroyed が
trueの場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
layer が session の
layers配列に含まれていない場合、TypeErrorをスローし、これらの手順を中止する。 -
layer の型が
XRProjectionLayerの場合、TypeErrorをスローし、これらの手順を中止する。 -
layer の
layout属性が"default"の場合、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"で作成された場合 - subimage の
imageIndexを index で初期化する。 - それ以外の場合
- subimage の
imageIndexを0で初期化する。
- layer が textureType
-
subimage の
colorTextureを次のように初期化する:- layer が textureType
"texture"で作成された場合 - subimage の
colorTextureを、layer の colorTextures 配列のオフセット index にある要素で初期化する。 - それ以外の場合
- subimage の
colorTextureを、layer の colorTextures 配列の最初の要素で初期化する。
- layer が textureType
-
subimage の
depthStencilTextureを次のように初期化する:- layer の depthStencilTextures が空の配列である場合
- subimage の
depthStencilTextureをnullで初期化する。 - それ以外で layer が textureType
"texture"で作成された場合 - subimage の
depthStencilTextureを、layer の depthStencilTextures 配列のオフセット index にある要素で初期化する。 - それ以外の場合
- subimage の
depthStencilTextureを、layer の depthStencilTextures 配列の最初の要素で初期化する。
-
subimage の
depthStencilTextureWidth、depthStencilTextureHeight、 およびmotionVectorTextureをnullで初期化する。 -
subimage の
colorTextureWidthを subimage のcolorTextureのピクセル幅に設定する。 -
subimage の
colorTextureHeightを subimage のcolorTextureのピクセル高さに設定する。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureWidthをdepthStencilTexture配列内の最初のテクスチャのピクセル幅に設定する。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureHeightをdepthStencilTexture配列内の最初のテクスチャのピクセル高さに設定する。 -
viewsPerTexture を
1とする。 -
layer の
layout属性が"stereo-left-right"または"stereo-top-bottom"の場合、 viewsPerTexture を2に設定する。 -
subimage の
viewport上で、 subimage のcolorTexture、 layer のlayout、 index および viewsPerTexture を使用して ビューポートを初期化するを実行する。 -
needsRedrawをfalseに設定するための タスクをキューに入れる。 -
subimage を返す。
getViewSubImage(XRProjectionLayer layer, XRView view)
メソッドは、新しい XRWebGLSubImage
を作成する。
このメソッドが XRWebGLBinding
binding 上で呼び出されたとき、次の手順を実行しなければならない:
-
subimage を次のように初期化する:
-
getViewSubImage()が以前に同じ binding、layer、および view で呼び出されていた場合、ユーザーエージェントは次のようにしてもよい - subimage を、同じ引数による以前の呼び出しで返されたものと同じ
XRWebGLSubImageオブジェクトとする。 - それ以外の場合
- subimage を、this の 関連レルムにおける 新しい
XRWebGLSubImageとする。- subimage の
viewportを、this の 関連レルムにおける 新しいXRViewportとする。 - subimage の
-
-
frame を view の
frameとする。 -
layer の destroyed が
trueの場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
layer および frame を使用して XRWebGLSubImage 作成関数の状態を 検証するの結果が
falseの場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
layer が session の
layers配列に含まれていない場合、TypeErrorをスローし、これらの手順を中止する。 -
view の active フラグが
falseの場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
index を次のように初期化する:
-
subimage の
imageIndexを次のように初期化する:- layer が textureType
"texture-array"で作成された場合: - subimage の
imageIndexを index で初期化する。 - それ以外の場合
- subimage の
imageIndexを0に初期化する。
- layer が textureType
-
subimage の
colorTextureを次のように初期化する:- view が session の ビューのリストに由来する セカンダリビューである場合
- subimage の
colorTextureを、layer の セカンダリビュー用の colorTextures のオフセット index にある要素で初期化する。 - それ以外で、layer の
layoutが"default"であり、layer が textureType"texture"で作成された場合 - subimage の
colorTextureを、layer の colorTextures 配列のオフセット index にある要素で初期化する。 - それ以外の場合
- subimage の
colorTextureを、layer の colorTextures 配列の最初の要素で初期化する。
-
subimage の
depthStencilTextureを次のように初期化する:- layer の depthStencilTextures が空の配列である場合
- subimage の
depthStencilTextureをnullで初期化する。 - それ以外で、view が session の ビューのリストに由来する セカンダリビューである場合
- subimage の
colorTextureを、layer の セカンダリビュー用の depthStencilTextures のオフセット index にある要素で初期化する。 - それ以外で、layer の
layoutが"default"であり、layer が textureType"texture"で作成された場合 - subimage の
depthStencilTextureを、layer の depthStencilTextures 配列のオフセット index にある要素で初期化する。 - それ以外の場合
- subimage の
depthStencilTextureを、layer の depthStencilTextures 配列の最初の要素で初期化する。
-
subimage の
motionVectorTextureを次のように初期化する:- layer の motionVectorTextures が空の配列であるか、view が session の ビューのリストに由来する セカンダリビューである場合
- subimage の
motionVectorTextureをnullで初期化する。 - それ以外で layer が textureType
"texture"で作成された場合 - subimage の
motionVectorTextureを、layer の motionVectorTextures 配列のオフセット index にある要素で初期化する。 - それ以外の場合
- subimage の
motionVectorTextureを、layer の motionVectorTextures 配列の最初の要素で初期化する。
-
subimage の
colorTextureWidthを subimage のcolorTextureのピクセル幅に設定する。 -
subimage の
colorTextureHeightを subimage のcolorTextureのピクセル高さに設定する。 -
subimage の
depthStencilTextureWidthおよびdepthStencilTextureHeightをnullで初期化する。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureWidthをdepthStencilTexture配列内の最初のテクスチャのピクセル幅に設定する。 -
subimage の
depthStencilTextureがnullでない場合、subimage のdepthStencilTextureHeightをdepthStencilTexture配列内の最初のテクスチャのピクセル高さに設定する。 -
subimage の
viewport上で、 subimage のcolorTexture、 layer のlayout、 index、および session の ビューのリストの数を使用して ビューポートを初期化するを実行する。 -
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 アニメーション
フレーム以降に次の少なくとも 1 つが発生している場合に限る:
-
XRLayerが、前の XR アニメーションフレーム以降にlayersに追加された。 -
XRLayerがXRWebGLLayerであり、不透明フレームバッファがXRWebGLLayerに関連付けられたWebGLRenderingContextの現在バインドされているフレームバッファである間に、clear、drawArrays、drawElements、 または同様にフレームバッファのカラー値に影響するその他のレンダリング操作が 呼び出された。 -
XRLayerがXRCompositionLayerであり、getSubImage()またはgetViewSubImage()が呼び出され、かつcolorTextureテクスチャのカラー値に影響する何らかのレンダリング操作が呼び出された。
不透明フレームバッファまたは colorTexture
テクスチャが 没入型 XR デバイスへ提示される前に、ユーザーエージェントはすべてのレンダリング
操作がフラッシュされていることを保証しなければならない。
7. Video layer の作成
7.1. XRMediaLayerInit
XRMediaLayerInit
辞書は、動画を含む XRCompositionLayer
がどのように
初期化されるかを記述する設定可能な値の集合を表す。
dictionary {XRMediaLayerInit required XRSpace space ;XRLayerLayout layout = "mono";boolean invertStereo =false ; };
space 属性は、ユーザーの物理環境との空間的関係を
定義する。
layout 属性は、XRCompositionLayer
内の動画のレイアウトを定義する。
invertStereo 属性は、動画内の各ビューの自然な
位置を反転すべきかどうかを定義する。
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 が
badの場合、layer を透明な 黒で塗りつぶし、これらの手順を中止する。 -
layer を media 要素の内容で塗りつぶす。
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 を、this の 関連レルムにおける 新しい
XRQuadLayerとする。 -
layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。
-
layer の media を video に初期化する。
-
layer の
needsRedrawをfalseに初期化する。 -
aspectRatio を、video および init の
layoutを使用して アスペクト比を 計算した結果とする。 -
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 を、this の 関連レルムにおける 新しい
XRCylinderLayerとする。 -
layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。
-
layer の media を video に初期化する。
-
layer の
needsRedrawをfalseに初期化する。 -
aspectRatio を、video および init の
layoutを使用して アスペクト比を 計算した結果とする。 -
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の type が"viewer"の場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
layer を、this の 関連レルムにおける 新しい
XREquirectLayerとする。 -
layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。
-
layer の media を video に初期化する。
-
layer の
needsRedrawをfalseに初期化する。 -
layer および init を使用して 正距円筒レイヤーを初期化するを実行する。
-
XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、
OperationErrorをスローし、これらの手順を中止する。 -
layer を返す。
XREquirectLayer
の
パラメーターが動画表示にどのような影響を与えるかを定義する。
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
配列はレイヤーの合成順序を定義し、各レイヤーは前の
レイヤーの上に描画される。
アプリケーションが深度によってソートされるレイヤーを持たせたい場合、
"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. Space warp
スペースワープは、
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成分を、その領域の2Dスクリーン空間モーションベクトルで
埋めるべきであり、これは現在のフレームと前のフレームの間の正規化デバイス座標(NDC)における差分として表される。
モーションベクトルは`(currentClipPos / currentW) - (prevClipPos / prevW)`として計算され、ここで
`currentClipPos`と`prevClipPos`は、それぞれ現在のフレームと前のフレームにおけるフラグメントのクリップ空間位置である。
赤チャンネルはNDC X(水平方向)の差分に対応し、緑チャンネルはNDC Y(垂直方向)の差分に対応する。青チャンネルには
NDC Z(深度)の差分を含めてもよく、アルファチャンネル
は使用されない。
motionVectorTexture
またはdepthStencilTexture
がXRFrameの処理中に送信されなかった場合、
XRコンポジターは、スペースワープが有効でなかったかのようにXRFrame
を処理しなければならない。
11. WebXR Device API 統合
11.1. XRRenderState の変更
このモジュールは、XRRenderStateInit
および XRRenderState
インターフェイスを、XRLayer
の
インスタンスを含む新しいオプションの配列 layers
で拡張する。
[SecureContext ,Exposed =Window ]partial interface XRRenderState {readonly attribute FrozenArray <XRLayer >layers ; };
layers 属性は、
XRコンポジターによって表示される XRLayer
のインスタンスを含む配列を返す。
デフォルトでは、layers
配列がレイヤーの合成順序を定義する。XRコンポジターは、
source-over ブレンディングを使用して、配列内の位置の順序で各レイヤーを
描画しなければならない。「depth-sorted-layers」機能
記述子が有効でない限り、XRコンポジターはレイヤーに対していかなる深度ソートも適用してはならない。
注: これは、前のレイヤーが仮想的にビューアーに より近いかどうかにかかわらず、各レイヤーが前のレイヤーを上書きする可能性があることを意味する。
XRSession
session のために XRRenderState
オブジェクト state
が作成されたとき、ユーザーエージェントは次の手順を実行してレンダー状態を初期化しなければならない:
-
レンダー状態を初期化するための元の手順を実行して、state を初期化する。
11.2. updateRenderState の変更
このモジュールは、WebXR
仕様の「保留中のレイヤー状態を更新する」で示された手順を置き換える。
代わりに、ユーザーエージェントが
XRSession
session および XRRenderStateInit
newState を使用して保留中のレイヤー状態を更新するとき、次の手順を実行しなければならない:
-
newState の
baseLayerと newState のlayersの両方が設定されている場合、NotSupportedErrorをスローし、これらの手順を中止する。 -
activeState を session の アクティブなレンダー状態とする。
-
newState の
baseLayerが設定されている場合:-
session の 保留中のレンダー状態が
nullの場合、 それを activeState のコピーに設定する。 -
session の 保留中のレンダー状態の
layersをnullに設定する。
-
-
newState の
layersが設定されている場合:-
newState の
layersに、destroyed ブール値がtrueであるXRCompositionLayerが含まれている場合、InvalidStateErrorをスローし、これらの手順を中止する。 -
session が「layers」を有効にして作成されておらず、 newState の
layersに1個を超えるインスタンスが含まれている場合、NotSupportedErrorをスローし、これらの手順を中止する。 -
newState の
layersにmaxRenderLayersを超える数のエントリーが含まれている場合、NotSupportedErrorをスローし、これらの手順を中止する。 -
session の 保留中のレンダー状態が
nullの場合、 それを activeState のコピーに設定する。 -
newState の
layersに重複するインスタンスが含まれている場合、TypeErrorをスローし、これらの手順を中止する。 -
newState の
layers内の各 layer について:-
layer が
XRCompositionLayerであり、layer の session が session と異なる場合、TypeErrorをスローし、これらの手順を中止する。 -
layer が
XRWebGLLayerであり、layer の session が session と異なる場合、TypeErrorをスローし、これらの手順を中止する。
-
-
session の 保留中のレンダー状態の
baseLayerをnullに設定する。 -
session の 保留中のレンダー状態の
layersを newState のlayersに設定する。
-
11.3. XRCompositor の変更
XR コンポジターは、XRLayer
のすべてのインスタンスがlayers
配列から同時に合成されるように拡張されなければならない。
WebXRに対するその他すべての要件は、引き続き
適用されなければならない。
XRコンポジターが、XREye
が"none"
であるビューにレンダリングし、XRProjectionLayer
ではなく、かつlayout
が"mono"
でもないXRCompositionLayer
を描画する場合、XRコンポジターは、そのビューの
XREye
が"left"
であるかのように、そのレイヤーをレンダリングしなければならない。
注: これは、レイヤーの右目用の側が 無視されることを意味する。これにより、作者は立体視デバイスと 単眼デバイスで同じアセットを使用できる。
11.4. XRView の変更
各 view は、 view を含むのに十分な大きさの WebGL テクスチャ解像度の最良推定値を表す 推奨 WebGL 色テクスチャ解像度を定義しなければならない。XRSession
が "space-warp" 機能
記述子付きで作成された場合、各 view は、推奨 WebGL 色テクスチャ
解像度に基づく 推奨モーションベクターテクスチャ解像度
を定義しなければならない。
各 view は、
view を含むのに十分な大きさの WebGL 深度テクスチャ解像度の最良推定値を表す
推奨 WebGL 深度テクスチャ解像度も
定義しなければならない。
XRSession
が "space-warp" 機能
記述子付きで作成された場合、推奨 WebGL 深度テクスチャ解像度
は 推奨モーションベクターテクスチャ
解像度と等しくなければならない。
"depth-sorted-layers" 機能記述子が有効な場合、推奨 WebGL 深度テクスチャ 解像度は 推奨 WebGL 色テクスチャ 解像度と等しくなければならない。
11.5. Animation frames の変更
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
は、そのセッションを使用して作成された各 XRWebGLBinding
への弱参照を保持する内部 WeakSet bindings を持つ。
このモジュールは、WebXR 仕様の「セッションを シャットダウンする」に手順を追加する。 次をリストに追加する:
-
session| の bindings 内の各 binding について:
-
binding の foveatedTextures 内の各 texture について:
-
texture からフォービエーションを削除する。
-
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)