WebXR レイヤー API レベル 1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webxrlayers-1-20260811/
最新公開バージョン:
https://www.w3.org/TR/webxrlayers-1/
編集者草案:
https://immersive-web.github.io/layers/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webxrlayers-1/
フィードバック:
GitHub
仕様内インライン
編集者:
(Meta)
参加方法:
課題を提出する (未解決の課題)
メーリングリストアーカイブ
W3C の #immersive-web IRC

概要

この仕様は、WebXR セッションで使用される各種レイヤー型のサポートについて説明します。

この文書の状態

この節では、公開時点におけるこの文書の状態を説明します。現在の W3C 公開物の一覧およびこの 技術報告書の最新改訂版は、W3C 標準および草案インデックスで確認できます。

Immersive Web Working Group は、グループがまだ対応していない すべてのバグ 報告の一覧を管理しています。この草案では、 作業グループでまだ議論されるべき未解決の課題の一部を強調しています。これらの課題の結論については、 それらが妥当かどうかを含め、まだ何も決定されていません。 未解決の課題に対する仕様テキスト案を含むプルリクエストを強く歓迎します。

この文書は、Immersive Web Working Group により、勧告 トラックを用いた作業草案として公開されました。この文書は、W3C 勧告になることを意図しています。

作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。これは草案文書であり、 いつでも他の文書によって更新、置換、または廃止される可能性があります。この文書を 作業中のもの以外として引用することは不適切です。

この文書は、 W3C 特許ポリシーの下で活動するグループにより作成されました。 W3C は、このグループの成果物に関連して行われた特許 開示の公開リストを維持しています。そのページには、 特許を開示するための手順も含まれています。ある個人が、その個人の考えでは 必須 クレームを含む特許を実際に知っている場合、その個人は W3C 特許ポリシー 第 6 節に従って情報を開示しなければなりません。

この文書は、2025年8月18日 W3C プロセス文書に準拠します。

1. はじめに

この仕様は、WebXR 仕様に `composition` レイヤーのサポートを追加します。レイヤーの利点は次のとおりです:

1.1. 用語

1.2. アプリケーションフロー

作者が GL レイヤーを使用したい場合、次の手順を踏む必要があります:

  1. XRProjectionLayer 以外の任意のレイヤー型について、requiredFeatures または optionalFeatures を通じて、requestSession() 内でサポートを要求します。

  2. XRWebGLBinding または XRMediaBinding を作成します。

  3. これらのオブジェクトでレイヤーを作成します。

  4. レイヤーを XRRenderStateInit に追加し、updateRenderState() を呼び出します。

  5. 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"
};

注: 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"
};

注: 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 に、 この XRCompositionLayerstereo 効果を取り除く信号を送らなければなりません。 これを mono レイヤー上で true に設定しても効果はありません。

注: この属性は、XRSession によって返される他の情報に対して、他の副作用を持ちません。 この設定によって影響を受けるのは XR Compositor の動作のみであり、体験は引き続き 両目に描画すべきです。

opacity 属性は、レイヤーのピクセルに適用される 不透明度を設定します。XR Compositor は、 各ピクセル(プリマルチプライド空間内)にこの値を乗算しなければなりません。 opacity は既定で 1.0 です。opacity0 未満の値に設定すると 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について、 ユーザーエージェントは、次の手順を実行しなければならない:
  1. layerneedsRedrawtrueに設定する。

  2. layerXRProjectionLayerでない場合、 タスクをキューに入れlayer上でXRLayerEvent を使用して、redrawという名前のイベントを発火する

XRCompositionLayer には、関連付けられた破棄済みブール値があり、初期値はfalseである。

destroy() は、レイヤーを直ちに破棄済みとしてマークし、そのグラフィックスリソースを今後の レンダリングで使用できなくする。 すでに破棄済みのレイヤーでdestroy() を呼び出しても何も行わない。 破棄済みのレイヤーは、保留中のレンダー状態更新が適用されている間に、そのレイヤーが依然としてlayers 配列に存在する場合でも、XR コンポジターによって提示されてはならない。

破棄済みのレイヤーについてXRSubImage を取得するためのメソッドが呼び出された場合、そのメソッドはInvalidStateErrorをスローしなければならない。

以前に返されたXRSubImage オブジェクト自体は、そのレイヤーが破棄されても破棄されない。それらの属性は引き続き同じ オブジェクトおよび値を返すが、それらのオブジェクトによって公開されるグラフィックスリソースは、今後の レンダリング操作のために無効化されなければならない。リソースが無効化される前にキューに入れられたGPU処理は完了してもよい。

XRCompositionLayer layerについてレイヤーのリソースを破棄するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. layercolorTexturesdepthStencilTextures、または motionVectorTextures配列のうち存在するものに含まれる各不透明 テクスチャについて、layerコンテキスト上でそのテクスチャを指定してdeleteTexture が呼び出されたかのように、そのテクスチャを削除対象としてマークする。これはユーザーエージェント内部の操作であり、INVALID_OPERATION エラーを生成してはならない。

  2. layerXRProjectionLayerである場合:

    1. layerセカンダリビュー用の colorTexturesnullでない場合、その 配列内の各不透明テクスチャについて、同じ 方法でそのテクスチャを削除対象としてマークする。

    2. layerセカンダリビュー用の depthStencilTexturesnullでない場合、その 配列内の各不透明テクスチャについて、同じ 方法でそのテクスチャを削除対象としてマークする。

  3. layercolorTextures配列がある場合、それを空の配列に設定する。

  4. layerdepthStencilTextures配列がある場合、それを空の配列に設定する。

  5. layermotionVectorTextures配列がある場合、それを空の配列に設定する。

  6. layerXRProjectionLayerである場合、 そのセカンダリビュー用の colorTexturesおよびセカンダリビュー用の depthStencilTexturesを空の配列に設定する。

  7. layerの各基礎となるリソースについて、そのリソースが 無効化される前にキューに入れられたすべてのGPU処理が完了し、XR コンポジターがそのリソースにアクセスしなくなった時点で、ユーザーエージェントはそのリソースを物理的に解放してもよい。

XRSession sessionと、オプションのWebGLRenderingContext またはWebGL2RenderingContext のインスタンスであるcontextを使用してコンポジションレイヤーを初期化するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. thisセッションsessionに設定する。

  2. contextが定義されている場合、thisコンテキストcontextに設定する。

  3. this破棄済みfalseに設定する。

  4. thisblendTextureSourceAlphatrueに設定する。

  5. thisopacity1.0に設定する。

destroy()XRCompositionLayer layer上で呼び出すとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. layer破棄済みtrueの場合、返る。

  2. layer破棄済みtrueに設定する。

  3. layerを使用してレイヤーのリソースを破棄するを実行する。

  4. sessionlayerセッションとする。

  5. session保留中のレンダー状態nullの場合:

    1. sessionアクティブなレンダー状態layerslayerを含まない場合、返る。

    2. session保留中のレンダー状態を、 sessionアクティブなレンダー状態のコピーに設定する。

  6. statesession保留中のレンダー状態とする。

  7. statelayersnullであるか、layerを含まない場合、返る。

  8. statelayers を、statelayers 内のlayer以外の各エントリーを順番に含む、新しい凍結配列に設定する。

XRCompositionLayer には、nullまたはWebGLRenderingContext またはWebGL2RenderingContext のインスタンスであるコンテキストオブジェクトと、nullまたはHTMLVideoElementのインスタンスであるメディア オブジェクトがある。

XRCompositionLayer には、関連付けられたセッションがあり、これはその作成時に使用された XRSession である。

XRSpace spaceXRCompositionLayer layerを使用してレイヤー上の 空間を設定するとき、ユーザーエージェントはspaceが 有効かどうかを検証するために次の手順を実行しなければならない:

  1. spacenullの場合、TypeError をスローし、これらの手順を中止する。

  2. spaceセッションlayerセッションと等しくない場合、TypeError をスローし、これらの手順を中止する。

XRCompositionLayer には、作者がneedsRedrawtrueである場合にのみこのレイヤーへ描画できることを示す、内部ブール値isStaticがある。

注: isStatictrueの場合、作者は作成後に一度、または redrawイベントの後に一度だけレイヤーへ描画できる。これにより、UAは単一のGPUバッファのみを割り当てることができる。

書き込み可能な属性がXRCompositionLayer またはその派生クラスのいずれかで設定された場合、 その属性を読み取ると、その値を返さなければならない。 requestAnimationFrame() コールバックの終了時に、その値は 基礎となるXRコンポジターへ送信されなければならない。XRコンポジターは、 requestAnimationFrame() コールバックに渡されたXRFrame を次に提示するとき、その値を適用しなければならない。

注: これは、 XRコンポジターが新しいXRFrameを使用してシーンを再描画するときには、 colorTextureに変更がなかった場合でも、 XRCompositionLayer に関連付けられたもの、またはメディアレイヤーに関連付けられたvideo frameに変更がなかった場合でも、新しい値を適用しなければならないことを意味する。 XR コンポジターが以前のXRFrameの 状態でシーンを再描画する場合、新しい 値を使用してはならない。

3.5. XRProjectionLayer

An XRProjectionLayer は、観察者のビュー全体を満たすレイヤーである。 プロジェクションレイヤーは、デバイスのネイティブフレームレートに近い頻度で更新されるべきである。

プロジェクションレイヤーの表現

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

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

textureWidth 属性は、このレイヤーの colorTextures テクスチャの ピクセル単位の幅を返す。

textureHeight 属性は、このレイヤーの colorTextures テクスチャの ピクセル単位の高さを返す。

textureArrayLength 属性は、 このレイヤーの colorTextures テクスチャのレイヤー数を、 XRProjectionLayertextureType"texture-array"を指定して初期化された場合に返す。 それ以外の場合は1を返す。

fixedFoveation 属性は、 XR コンポジターが使用するフォービエーションの量を制御する。ユーザーエージェントまたはデバイスがこの属性をサポートしていない場合、 取得時にはnullを返すべきであり、設定はno-opであるべきである。 fixedFoveation0未満の値に設定すると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

An XRQuadLayer は、仮想環境内の平坦な矩形空間を占めるレイヤーをレンダリングする。 レイヤーの前面のみが可視でなければならず、背面は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 layerXRQuadLayerInit initinitializing an XRQuadLayer するとき、ユーザーエージェントは次の手順を実行しなければなりません:
  1. layerwidthinitwidth に初期化します。

  2. layerheightinitheight に初期化します。

  3. layerspaceinitspace とします。

  4. layertransform を次のように初期化します:

    inittransform が設定されている場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とし、inittransformposition および orientation で初期化します。
    それ以外の場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とし、{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }DOMPointInit position で初期化します。
  5. layerisStaticinitisStatic に初期化します。

onredraw 属性は、redraw イベント型に対するイベントハンドラー IDL 属性です。

3.7. XRCylinderLayer

An XRCylinderLayer は、仮想環境内の湾曲した矩形空間を占めるレイヤーをレンダリングする。 レイヤーの前面のみが可視でなければならず、背面は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 の可視部分の幅をその高さで割った比率です。幅は、radiuscentralAngle を掛けて計算されます。

cylinder layer のパラメーターの説明

XRCylinderLayer layerXRCylinderLayerInit initinitializing an XRCylinderLayer するとき、ユーザーエージェントは次の手順を実行しなければなりません:
  1. layerradiusinitradius に初期化します。

  2. layercentralAngleinitcentralAngle に初期化します。

  3. layeraspectRatioinitaspectRatio に初期化します。

  4. layerspaceinitspace とします。

  5. layertransform を次のように初期化します:

    inittransform が設定されている場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とし、inittransformposition および orientation で初期化します。
    それ以外の場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とし、{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }DOMPointInit position で初期化します。
  6. layerisStaticinitisStatic に初期化します。

onredraw 属性は、redraw イベント型に対するイベントハンドラー IDL 属性です。

3.8. XREquirectLayer

An XREquirectLayer は、XRコンポジターが正距円筒図法で符号化されたデータを球の内側にマッピングしなければならないレイヤーを レンダリングする。

正距円筒レイヤーの表現

この節には 明確化が必要である

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

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

  // イベント
  attribute EventHandler onredraw;
};

transform 属性は、 space に対するオフセットおよび向きを設定し、返します。 transform 属性と space は、ユーザーの物理環境内におけるレイヤーの空間的関係を確立します。

radius 属性は、球の非負の半径をメートル単位で表します。 zero または infinity の値は無限球として扱われます。

radius0 未満の値に設定すると、0 に設定されます。

centralHorizontalAngleupperVerticalAngle および lowerVerticalAngle 属性は、テクスチャが 球へどのようにマッピングされるかを設定し、返します。

centralHorizontalAngle を 0 未満の値に設定すると 0 に設定され、2π より大きい値に設定すると 2π に設定されます。

upperVerticalAngle または lowerVerticalAngle を -π/2 未満の値に設定すると -π/2 に設定され、π/2 より大きい値に設定すると π/2 に設定されます。

equirect layer のパラメーターの説明

XRSpacespace 属性に割り当てるときは、まず次の手順を実行します。

XRSpace space および XREquirectLayer layersetting the space on an equirect layer するとき、ユーザーエージェントは space が有効かを検証するために次の手順を実行しなければなりません:

  1. initspaceXRReferenceSpace 型のインスタンスでない場合、TypeError を投げ、これらの手順を中止します。

  2. initspace"viewer"type を持つ場合、TypeError を投げ、これらの手順を中止します。

  3. space および layersetting the space on a layer を実行します。

XREquirectLayer layerXREquirectLayerInit initinitializing an XREquirectLayer するとき、ユーザーエージェントは次の手順を実行しなければなりません:
  1. layerradiusinitradius に初期化します。

  2. layercentralHorizontalAngleinitcentralHorizontalAngle に初期化します。

  3. layerupperVerticalAngleinitupperVerticalAngle に初期化します。

  4. layerlowerVerticalAngleinitlowerVerticalAngle に初期化します。

  5. layerspaceinitspace とします。

  6. layertransform を次のように初期化します:

    inittransform が設定されている場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とし、inittransformposition および orientation で初期化します。
    それ以外の場合
    layertransform を、layerrelevant realm 内の new XRRigidTransform とします。
  7. layerisStaticinitisStatic に初期化します。

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 レイヤーは常に、 視点を中心に置いてレンダリングされます。

XRSpacespace 属性に割り当てるときは、まず次の手順を実行します。

XRSpace space および XRCubeLayer layersetting the space on an cube layer するとき、ユーザーエージェントは space が有効かを検証するために次の手順を実行しなければなりません:

  1. initspaceXRReferenceSpace 型のインスタンスでない場合、TypeError を投げ、これらの手順を中止します。

  2. initspace"viewer"type を持つ場合、TypeError を投げ、これらの手順を中止します。

  3. space および layersetting 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 要素です。

以下は、レイヤー型とともに使用する空間のベストプラクティスです:

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のモーション不透明テクスチャ を返す。 XRSessionspace-warp 機能 記述子なしで作成された場合、またはレイヤーがXRProjectionLayerでない場合、 この属性はnullを返さなければならない。

imageIndex 属性は、テクスチャ配列内の オフセットを返す。texture-array を指定して要求されたレイヤーに対してのみ有効である。

colorTextureWidth およびcolorTextureHeight 属性は、 GLカラーアタッチメントのピクセル単位の幅と高さを返す。

depthStencilTextureWidth およびdepthStencilTextureHeight 属性は、 GL深度/ステンシルアタッチメントのピクセル単位の幅と高さを返す。レイヤーが 深度/ステンシルなしで作成された場合、これらの属性はnullを返す。

5.3. XRTextureType

XRTextureType enum は、割り当てられるテクスチャの型を定義します。
enum XRTextureType {
  "texture",
  "texture-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, the XRWebGLBinding オブジェクトは、カラーおよび深度/ステンシルアタッチメント用の不透明テクスチャのインスタンスを返す。

不透明テクスチャは、 次の変更点を除き、標準のWebGLTexture と同一に機能する:

不透明テクスチャにアタッチされたバッファは、clearOnAccesstrueの場合、各XRアニメーションフレームにおけるgetViewSubImage() またはgetSubImage() の最初の呼び出しの処理中に、下の表の値にクリアされなければならない。 clearOnAccessfalseの場合、不透明テクスチャにアタッチされたバッファは、最初にアクセスされたときにクリアされなければならない。 それ以降のフレームでの後続のアクセスでは、バッファをクリアしなくてもよい。

バッファ クリア値
カラー (0, 0, 0, 0)
深度 1.0
ステンシル 0

不透明テクスチャ2以上のmipLevelsで作成された場合、 作者はすべてのミップレベルを設定するべきである。ユーザーエージェントは、ミップ レベルを作成すべきであると仮定してはならない。

注: 不透明テクスチャは、レイヤーが構築されるときに カラーテクスチャを 割り当てるおよび深度テクスチャを割り当てるアルゴリズムを使用して割り当てられる。この 事前割り当ての副作用として、 getSubImage() およびgetViewSubImage() を同じパラメーターで呼び出すと、常に同じテクスチャオブジェクトが返される。

注: 不透明テクスチャの寸法またはフォーマットの変更は 許可されない。GLコマンドは、 テクセル値およびテクスチャパラメーターのみを変更できる。次のいずれかの コマンドをWebGLTextureに対して使用すると、寸法またはフォーマットに影響しない場合でも、INVALID_OPERATIONエラーが 生成される: TexImage*、CompressedTexImage*、 CopyTexImage*およびTexStorage*。 OpenGL ES 3.0仕様の「不変フォーマット テクスチャ画像」 の節では、これらの制限をより詳細に定義している。

レイヤー用のリソース(メモリなど)の割り当ては、WebGLと同じメカニズムを通じて行われなければならない。

XRLayerRGBA またはRGBcolorFormatで割り当てられた場合、 そのcolorTexturesは、 WebGLRenderingContext コンテキストに対してRGBA またはRGB として公開されなければならない。 ただし、XRコンポジターは、colorTexturesのピクセルを、 SRGB8_ALPHA8 またはSRGB8colorFormatであるかのように扱わなければならない。

注: これは、XRコンポジターが、 colorTexturesを処理するときに、線形RGBA またはRGB からいかなるガンマ変換も行ってはならないことを意味する。そうでない場合、最終レンダリングのピクセルが 明るすぎて見え、通常の2DWebGLRenderingContext コンテキスト上のレンダリングと一致しなくなる。

6.3. XRProjectionLayerInit

XRProjectionLayerInit 辞書は、XRProjectionLayer をどのように初期化するかを記述する、設定可能な値の集合を表す。
dictionary XRProjectionLayerInit {
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum depthFormat = 0x1902; // DEPTH_COMPONENT
  double scaleFactor = 1.0;
  boolean clearOnAccess = true;
};

textureType 属性は、 レイヤーが持つテクスチャの型を定義する。

colorFormat 属性は、 カラーテクスチャデータのデータ型を定義する。

これは、XRコンポジターがサポートしなければならないプロジェクションレイヤーのカラーフォーマットのリストである:

WebGL2コンテキストでは、次の追加フォーマットがサポートされる:

depthFormat 属性は、 深度テクスチャデータのデータ型を定義する。 depthFormat0の場合、レイヤーは深度/ステンシルテクスチャを提供しない。

これは、XRコンポジターがサポートしなければならないプロジェクションレイヤーの深度フォーマットのリストである:

WEBGL_depth_texture拡張が有効なWebGLRenderingContext コンテキスト、またはWebGL2コンテキストの場合:

拡張が有効になっていない場合、深度テクスチャの要求は無視される。

注: 作者は深度テクスチャを 期待する可能性があるため、これは作者を混乱させる可能性がある。可能であれば、テクスチャが 作成されなかった理由を示す警告を提供する。

WebGL2RenderingContext コンテキストでは、次の追加フォーマットがサポートされる:

scaleFactor 属性は、 レイヤーのアタッチメントの解像度を決定するときに、session推奨WebGLフレームバッファ解像度に乗算しなければならない値を定義する。

clearOnAccess 属性は、 このレイヤーに関連付けられたテクスチャを初期フレームでクリアするか、すべてのフレームでクリアするかを定義する。

注: XRProjectionLayerInit 辞書には、 XRLayerInit のようにmipLevels を構成するためのサポートがない。 ユーザーエージェントがプロジェクションレイヤーでミップマッピングをサポートしたい場合、ミップを含むテクスチャを自由に割り当てることができる。 その場合、すべてのミップレベルを生成する責任は作者ではなくユーザーエージェントにある。

6.4. XRLayerInit

XRLayerInit 辞書は、XRQuadLayerXRCylinderLayerXREquirectLayer および XRCubeLayer に共通する構成可能な値の集合を表します。
dictionary XRLayerInit {
  required XRSpace space;
  XRTextureType textureType = "texture";
  GLenum colorFormat = 0x1908; // RGBA
  GLenum? depthFormat;
  unsigned long mipLevels = 1;
  required unsigned long viewPixelWidth;
  required unsigned long viewPixelHeight;
  XRLayerLayout layout = "mono";
  boolean isStatic = false;
  boolean clearOnAccess = true;
};

space 属性は、ユーザーの物理環境との空間的関係を定義します。

textureType 属性は、レイヤーのテクスチャの型を定義します。 XR Compositor は次をサポートしなければなりません:

WebGL2RenderingContext では、次の追加型がサポートされます:

colorFormat 属性は、color texture data のデータ型を定義します。

これは、XR Compositor がサポートしなければならない list of color formats for non-projection layers です:

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 width = 1.0;
  float height = 1.0;
};

6.6. XRCylinderLayerInit

XRCylinderLayerInit 辞書は、XRCylinderLayer がどのように初期化されるかを説明する、構成可能な値の集合を表します。

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

centralAngle の既定値は π / 4 です。

6.7. XREquirectLayerInit

XREquirectLayerInit 辞書は、XREquirectLayer がどのように初期化されるかを説明する、構成可能な値の集合を表します。

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

centralHorizontalAngle の既定値は 2π です。 upperVerticalAngle の既定値は π/2 です。 lowerVerticalAngle の既定値は -π/2 です。

6.8. XRCubeLayerInit

XRCubeLayerInit 辞書は、XRCubeLayer がどのように初期化されるかを説明する、構成可能な値の集合を表します。

dictionary XRCubeLayerInit : XRLayerInit {
  DOMPointReadOnly? orientation;
};

6.9. XRWebGLBinding

XRWebGLBinding オブジェクトは、GPU バックエンドを持つレイヤーを作成するために使用されます。
[Exposed=Window] interface XRWebGLBinding {
  constructor(XRSession session, XRWebGLRenderingContext context);

  readonly attribute double nativeProjectionScaleFactor;
  readonly attribute boolean usesDepthValues;

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

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

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

init 辞書は オプションであるべきではない。これは Bikeshed issue 1566 である。

XRWebGLBinding は、型 XRWebGLRenderingContextcontext オブジェクトを持ち、これは WebGLRenderingContext または WebGL2RenderingContext のいずれかのインスタンスである。

XRWebGLBinding には関連付けられた session があり、これは作成時に使用された XRSession である。

XRWebGLBinding は、foveateBoundTexture を呼び出した際に指定されたターゲットへバインドされていたテクスチャへの弱参照を保持する、内部 WeakSet foveatedTextures を持つ。

注: 複数の XRWebGLBinding を作成することが可能である。XRWebGLBinding のインスタンスで作成された任意のレイヤーは、 両方が同じ session および同じ context で作成されている限り、 別の XRWebGLBinding のインスタンスでも使用できる。レイヤーまたは XRWebGLSubImage のインスタンスの存続期間は、それらを作成した XRWebGLBinding の存続期間には結び付けられない。

XRWebGLBinding を通じて作成された各 XRCompositionLayer は、カラーテクスチャ用の WebGLTexturesarray である内部 colorTextures 配列、 深度/ステンシルテクスチャ用の 不透明テクスチャarray である内部 depthStencilTextures、および モーションテクスチャ用の 不透明テクスチャarray である内部 motionVectorTextures を持つ。

XRWebGLBinding を通じて作成された各 XRProjectionLayer は、カラーテクスチャ用の 不透明テクスチャarray である内部 セカンダリビュー用の colorTextures 配列と、セカンダリビューのレンダリングに使用される深度/ステンシルテクスチャ用の 不透明テクスチャarray である内部 セカンダリビュー用の depthStencilTextures 配列を持つ。

XRWebGLBinding(session, context) コンストラクターは、 呼び出されたときに次の手順を実行しなければならない:

  1. binding を、session関連レルムにおける 新しい XRWebGLBinding とする。

  2. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  3. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  4. session没入型セッションでない場合、InvalidStateError をスローし、これらの手順を中止する。

  5. contextXR 互換ブール値が false の場合、InvalidStateError をスローし、これらの手順を中止する。

  6. bindingcontextcontext に初期化する。

  7. bindingsessionsession に初期化する。

  8. bindingsessionbindings に追加する。

  9. binding を返す。

nativeProjectionScaleFactor 関数は、session推奨 WebGL フレームバッファ解像度に乗算して、 sessionネイティブ WebGL フレームバッファ解像度を得るための値を返す。

サイズによってレイアウトが変更される場合の UA の特別な動作(たとえば "stereo-left-right" で要求された幅が制限を超える場合)

usesDepthValues 属性は、 false の場合、深度バッファアタッチメントが存在しても XR コンポジターがその値を使用してはならないことを示す。属性が true の場合、深度バッファアタッチメントの内容が XR コンポジターによって使用され、レイヤーにレンダリングされたシーンを表すものと期待されることを示す。

XRTextureType textureTypeXRWebGLRenderingContext context、および XRLayerLayout layout を使用してlayout 属性を決定するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. contextWebGL2RenderingContext ではなく、textureType"texture-array" の場合、 TypeError をスローし、これらの手順を中止する。

  2. textureType"texture-array" であり、ビューのリスト内のセッションのすべての ビューが同じ 推奨 WebGL カラーテクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. layout"mono" の場合、 layout を返し、これらの手順を中止する。

  4. layout"default" の場合、 次の手順を実行する:

    1. ビューのリストのサイズが 1 の場合、 "mono" を返し、これらの手順を中止する。

    2. textureType"texture-array" の場合、 layout を返し、これらの手順を中止する。

  5. layout"default" または "stereo" であり、textureType"texture" の場合、 次の手順を実行する:

    1. ユーザーエージェントが "stereo-left-right" レイアウトを優先する場合、"stereo-left-right" を返し、これらの手順を中止する。

    2. ユーザーエージェントが "stereo-top-bottom" レイアウトを優先する場合、"stereo-top-bottom" を返し、これらの手順を中止する。

  6. layout を返す。

XRSession sessionXRWebGLRenderingContext context、および XRLayerLayout layout を使用して最大 scaleFactor を決定するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. largest width を、sessionビューのリストからセカンダリビューを除いた 推奨 WebGL カラーテクスチャ 解像度の最大幅とする。

  2. largest height を、sessionビューのリストからセカンダリビューを除いた 推奨 WebGL カラーテクスチャ 解像度の最大高さとする。

  3. layout"stereo-left-right" レイアウトの場合、largest width2 を乗算する。

  4. layout"stereo-top-bottom" レイアウトの場合、largest height2 を乗算する。

  5. largest view dimension を、largest width または largest height のうち大きい方とする。

  6. largest texture dimension を、context によって作成される WebGLTexture の最大寸法とする。

  7. largest texture dimensionlargest view dimension で除算した値を返す。

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を使用してプロジェクションレイヤー用のカラーテクスチャを割り当てるには、ユーザーエージェントは次の 手順を実行しなければならない:

  1. array を、context関連レルム内の 新しい配列とする。

  2. contextlayercontext とする。

  3. sessionlayersession とする。

  4. numViews を、sessionビューのリストから セカンダリビューを除いた数とする。

  5. view を、sessionビューのリストにおける、セカンダリビューではない最初のエントリーとする。

  6. width を、view推奨 WebGL カラーテクスチャ 解像度の幅に scaleFactor を乗算した値とする。

  7. height を、view推奨 WebGL カラーテクスチャ 解像度の高さに scaleFactor を乗算した値とする。

  8. textureFormatプロジェクションレイヤーの カラーフォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  9. layerlayout"mono" または "default" の場合:

    textureType"texture-array" の場合:
    ビューのリスト内のセッションの ビューが、セカンダリビューを除いてすべて同じ 推奨 WebGL カラーテクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contexttextureFormatwidthheight を使用し、 numViews 個のレイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。
    array を返し、これらの手順を中止する。
    それ以外の場合
    sessionビューのリスト内の各 view について:
    1. viewセカンダリビューの場合、続行する。

    2. width を、view推奨 WebGL カラーテクスチャ解像度の幅に scaleFactor を乗算した値とする。

    3. height を、view推奨 WebGL カラーテクスチャ解像度の高さに scaleFactor を乗算した値とする。

    4. texture を、context関連レルムにある 不透明テクスチャ新しい インスタンスとする。このインスタンスは contexttextureFormatwidthheight を使用して TEXTURE_2D テクスチャとして作成される。

    5. 何らかの理由で texture を作成できなかった場合、OperationError をスローし、これらの手順を中止する。

    6. texturearray に追加する。

    array を返し、これらの手順を中止する。
  10. ビューのリスト内のセッションの ビューが、セカンダリ ビューを除いてすべて同じ 推奨 WebGL カラーテクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。

  11. layerlayoutstereo-left-right の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contexttextureFormatnumViews を乗算した width、および height を使用して textureType テクスチャとして作成される。

  12. layerlayoutstereo-top-bottom の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contexttextureFormatwidth、および numViews を乗算した height を使用して textureType テクスチャとして作成される。

  13. 何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。

  14. array を返す。

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を使用してプロジェクションレイヤー用の深度テクスチャを割り当てるには、ユーザーエージェントは次の 手順を実行しなければならない:

  1. contextlayercontext とする。

  2. array を、context関連レルム内の 新しい配列とする。

  3. sessionlayersession とする。

  4. textureFormat0 の場合、array を返し、これらの手順を中止する。

  5. contextWebGLRenderingContext であり、WEBGL_depth_texture 拡張context で有効になっていない場合、 array を返し、これらの手順を中止する。

  6. textureFormatプロジェクションレイヤーの 深度フォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  7. numViews を、sessionビューのリストから セカンダリビューを除いた数とする。

  8. view を、sessionビューのリストにおける、セカンダリビューではない最初のエントリーとする。

  9. recommendedDepthResolutionview推奨 WebGL 深度テクスチャ 解像度とする。

  10. session が「space-warp機能記述子を指定して作成された場合、 recommendedDepthResolutionview推奨モーションベクトルテクスチャ 解像度に設定する。

  11. widthrecommendedDepthResolution の幅に scaleFactor を乗算した値とする。

  12. heightrecommendedDepthResolution の高さに scaleFactor を乗算した値とする。

  13. layerlayout"mono" または "default" の場合:

    textureType"texture-array" の場合:
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contexttextureFormatstencilwidthheight を使用し、numViews 個のレイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。
    array を返し、これらの手順を中止する。
    それ以外の場合
    sessionビューのリスト内の各 view について:
    1. viewセカンダリビューの場合、続行する。

    2. recommendedDepthResolutionview推奨 WebGL 深度テクスチャ解像度とする。

    3. session が「space-warp機能記述子を指定して作成された場合、 recommendedDepthResolutionview推奨 モーションベクトルテクスチャ解像度に設定する。

    4. widthrecommendedDepthResolution の幅に scaleFactor を乗算した値とする。

    5. heightrecommendedDepthResolution の高さに scaleFactor を乗算した値とする。

    6. texture を、context関連レルムにある 不透明テクスチャ新しい インスタンスとする。このインスタンスは contexttextureFormatstencilwidthheight を使用して TEXTURE_2D テクスチャとして作成される。

    7. 何らかの理由で texture を作成できなかった場合、OperationError をスローし、これらの手順を中止する。

    8. texturearray に追加する。

    array を返し、これらの手順を中止する。
  14. session が「space-warp機能記述子を指定して作成されており、ビューのリスト内のセッションの ビュー が、セカンダリ ビューを除いてすべて同じ 推奨モーションベクトルテクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。

  15. session が「space-warp機能記述子を指定して作成されておらず、ビューのリスト内のセッションの ビュー が、セカンダリ ビューを除いてすべて同じ 推奨 WebGL 深度テクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。

  16. layerlayoutstereo-left-right の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contexttextureFormatstencilnumViews を乗算した widthheight を使用して textureType テクスチャとして作成される。

  17. layerlayoutstereo-top-bottom の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contexttextureFormatstencilwidth、および numViews を乗算した height を使用して textureType テクスチャとして作成される。

  18. 何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。

  19. array を返す。

XRProjectionLayer layerXRTextureType textureType、および float scaleFactor を使用してプロジェクションレイヤー用のモーションベクトルテクスチャを 割り当てるには、ユーザーエージェントは次の手順を実行しなければならない:

  1. contextlayercontext とする。

  2. array を、context関連レルム内の 新しい配列とする。

  3. sessionlayersession とする。

  4. session が「space-warp機能記述子を指定して作成されていない場合、array を返し、 これらの手順を中止する。

  5. contextWebGLRenderingContext であり、WEBGL_depth_texture 拡張context で有効になっていない場合、array を返し、 これらの手順を中止する。

  6. numViews を、sessionビューのリストから セカンダリビューを除いた数とする。

  7. view を、sessionビューのリストにおける、セカンダリビューではない最初のエントリーとする。

  8. width を、view推奨モーションベクトルテクスチャ 解像度の幅に scaleFactor を乗算した値とする。

  9. height を、view推奨モーションベクトルテクスチャ 解像度の高さに scaleFactor を乗算した値とする。

  10. layerlayout"mono" または "default" の場合:

    textureType"texture-array" の場合:
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextRGBA16Fwidthheight を使用し、numViews 個のレイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。
    array を返し、これらの手順を中止する。
    それ以外の場合
    sessionビューのリスト内の各 view について:
    1. viewセカンダリビューの場合、続行する。

    2. width を、view推奨 モーションベクトルテクスチャ解像度の幅に scaleFactor を乗算した値とする。

    3. height を、view推奨 モーションベクトルテクスチャ解像度の高さに scaleFactor を乗算した値とする。

    4. texture を、context関連レルムにある 不透明テクスチャ新しい インスタンスとする。このインスタンスは contextRGBA16Fwidthheight を使用して TEXTURE_2D テクスチャとして作成される。

    5. 何らかの理由で texture を作成できなかった場合、OperationError をスローし、これらの手順を中止する。

    6. texturearray に追加する。

    array を返し、これらの手順を中止する。
  11. ビューのリスト内のセッションの ビューが、セカンダリ ビューを除いてすべて同じ 推奨モーションベクトルテクスチャ 解像度を持たない場合、NotSupportedError をスローし、これらの手順を中止する。

  12. layerlayoutstereo-left-right の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextRGBA16FnumViews を乗算した widthheight を使用して textureType テクスチャとして作成される。

  13. layerlayoutstereo-top-bottom の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextRGBA16Fwidth、および numViews を乗算した height を使用して textureType テクスチャとして作成される。

  14. 何らかの理由で 不透明 テクスチャを作成できなかった場合、OperationError をスローし、これらの手順を中止する。

  15. array を返す。

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を使用してセカンダリビュー用のカラーテクスチャを 割り当てるには、ユーザーエージェントは次の手順を実行しなければならない:

  1. contextlayercontext とする。

  2. sessionlayersession とする。

  3. array を、context関連レルム内の 新しい配列とする。

  4. textureFormatプロジェクションレイヤーの カラーフォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  5. sessionビューのリスト内の各 view について:

    1. viewセカンダリビューでない場合、続行する。

    2. width を、view推奨 WebGL カラー テクスチャ解像度の幅に scaleFactor を乗算した値とする。

    3. height を、view推奨 WebGL カラー テクスチャ解像度の高さに scaleFactor を乗算した値とする。

    4. texture を次のように初期化する:

      textureType"texture-array" の場合:
      texture を、context関連レルムにある 不透明テクスチャ新しいインスタンス とする。このインスタンスは contexttextureFormatwidthheight を使用して TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      texture を、context関連レルムにある 不透明テクスチャ新しいインスタンス とする。このインスタンスは contexttextureFormatwidthheight を使用して TEXTURE_2D テクスチャとして作成される。
    5. 何らかの理由で texture を作成できなかった場合、OperationError をスローし、これらの手順を中止する。

    6. texturearray に追加する。

  6. array を返し、これらの手順を中止する。

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を使用してセカンダリビュー用の深度テクスチャを 割り当てるには、ユーザーエージェントは次の手順を実行しなければならない:

  1. contextlayercontext とする。

  2. sessionlayersession とする。

  3. textureFormat0 の場合、array を返し、これらの手順を中止する。

  4. contextWebGLRenderingContext であり、WEBGL_depth_texture 拡張context で有効になっていない場合、array を返し、 これらの手順を中止する。

  5. textureFormatプロジェクションレイヤーの 深度フォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  6. array を、context関連レルム内の 新しい配列とする。

  7. sessionビューのリスト内の各 view について:

    1. viewセカンダリビューでない場合、続行する。

    2. width を、view推奨 WebGL 深度 テクスチャ解像度の幅に scaleFactor を乗算した値とする。

    3. height を、view推奨 WebGL 深度 テクスチャ解像度の高さに scaleFactor を乗算した値とする。

    4. texture を次のように初期化する:

      textureType"texture-array" の場合:
      texture を、context関連レルムにある 不透明テクスチャ新しいインスタンス とする。このインスタンスは contexttextureFormatstencilwidthheight を使用して TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      texture を、context関連レルムにある 不透明テクスチャ新しいインスタンス とする。このインスタンスは contexttextureFormatstencilwidthheight を使用して TEXTURE_2D テクスチャとして作成される。
    5. texturearray に追加する。

  8. array を返し、これらの手順を中止する。

scaleFactor は セカンダリビュー用に再計算する必要がある。

XRCompositionLayer layerXRTextureType textureType、および XRLayerInit init を使用してカラーテクスチャを 割り当てるには、ユーザーエージェントは次の手順を実行しなければならない:

  1. array を、context関連レルム内の 新しい配列とする。

  2. contextlayercontext とする。

  3. initcolorFormat非プロジェクションレイヤーの カラーフォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  4. initmipLevels1 より小さい場合、InvalidStateError をスローし、これらの手順を中止する。

  5. initmipLevels1 より大きく、viewPixelWidth および viewPixelHeight2 のべき乗でない場合、InvalidStateError をスローし、これらの手順を中止する

  6. layerlayout"mono" の場合:

    textureType"texture-array" の場合:
    array を、この context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、内部テクスチャを 1 個持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    それ以外の場合
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用して TEXTURE_2D テクスチャとして作成される。
  7. layerlayout"stereo" の場合:

    textureType"texture-array" の場合:
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、2 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    array を返し、これらの手順を中止する。
    それ以外の場合
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 2 個で初期化する。これらのインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用して TEXTURE_2D テクスチャとして作成される。
    array を返し、これらの手順を中止する。
  8. layerlayoutstereo-left-right の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidth の 2 倍、および viewPixelHeight の値を使用して textureType テクスチャとして作成される。

  9. layerlayoutstereo-top-bottom の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitcolorFormatmipLevelsviewPixelWidth および viewPixelHeight の 2 倍の値を使用して textureType テクスチャとして作成される。

  10. array を返す。

XRCompositionLayer layerXRTextureType textureType、および XRLayerInit init を使用して深度テクスチャを 割り当てるには、ユーザーエージェントは次の手順を実行しなければならない:

  1. array を、context関連レルム内の 新しい配列とする。

  2. contextlayercontext とする。

  3. initdepthFormat が設定されていない場合、array を返し、これらの手順を中止する。

  4. initdepthFormat非プロジェクションレイヤーの 深度フォーマットのリストに含まれない場合、NotSupportedError をスローし、これらの手順を中止する。

  5. initmipLevels1 より小さい場合、InvalidStateError をスローし、これらの手順を中止する。

  6. initmipLevels1 より大きく、viewPixelWidth および viewPixelHeight2 のべき乗でない場合、InvalidStateError をスローし、これらの手順を中止する。

  7. layerlayout"mono" の場合:

    textureType"texture-array" の場合:
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、内部テクスチャを 1 個持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    それ以外の場合
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用して TEXTURE_2D テクスチャとして作成される。
  8. layerlayout"stereo" の場合:

    textureType"texture-array" の場合:
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、2 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
    array を返し、これらの手順を中止する。
    それ以外の場合
    array を、context関連レルムにある 不透明 テクスチャ新しいインスタンス 2 個で初期化する。これらのインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用して TEXTURE_2D テクスチャとして作成される。
    array を返し、これらの手順を中止する。
  9. layerlayoutstereo-left-right の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidth の 2 倍、および viewPixelHeight の値を使用して textureType テクスチャとして作成される。

  10. layerlayoutstereo-top-bottom の場合、 array を、context関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは、 contextinitdepthFormatmipLevelsviewPixelWidth および viewPixelHeight の 2 倍の値を使用して textureType テクスチャとして作成される。

  11. array を返す。

createProjectionLayer(optional XRProjectionLayerInit init) メソッドは、新しい XRProjectionLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. contextthiscontext とする。

  3. layer を、this関連レルムにおける 新しい XRProjectionLayer とする。

  4. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  6. layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。

  7. layerisStaticfalse に初期化する。

  8. layerignoreDepthValues を次のように初期化する:

    session が「space-warp機能記述子を指定して作成された場合
    layerignoreDepthValuesfalse に初期化する
    initdepthFormatfalse であり、XR コンポジターが深度値を使用する場合
    layerignoreDepthValuesfalse に初期化する
    それ以外の場合
    layerignoreDepthValuestrue に初期化する
  9. layerfixedFoveation0 に初期化する。

  10. layout を、inittextureTypecontext、および "default" を使用して layout 属性を決定した結果とする。

  11. maximum scalefactor を、sessioncontextlayout を使用して 最大 scaleFactor を決定した結果とする。

  12. scaleFactormaximum scalefactor より大きい場合、scaleFactormaximum scalefactor に設定する。

  13. layerlayoutlayout に初期化する。

  14. layerneedsRedrawtrue に初期化する。

  15. layercolorTextures を、layerinittextureTypeinitcolorFormat および initscaleFactor を使用して プロジェクションレイヤー用の カラーテクスチャを割り当てた結果とする。

  16. layerdepthStencilTextures を、layerinittextureTypeinitdepthFormat および initscaleFactor を使用して プロジェクションレイヤー用の 深度テクスチャを割り当てた結果とする。

  17. layermotionVectorTextures を、layerinittextureType および initscaleFactor を使用して プロジェクションレイヤー用のモーションベクトル テクスチャを割り当てた結果とする。

  18. セカンダリビュー用の colorTextures を次のように初期化する:

    session が「secondary-views」 を有効にして作成された場合
    セカンダリビュー用の colorTextures を、layerinittextureTypeinitcolorFormat および initscaleFactor を使用して セカンダリビュー用のカラー テクスチャを割り当てた結果とする。
    それ以外の場合
    セカンダリビュー用の colorTexturesnull とする。
  19. セカンダリビュー用の depthStencilTextures を次のように初期化する:

    session が「secondary-views」 を有効にして作成された場合
    セカンダリビュー用の depthStencilTextures を、layerinittextureTypeinitdepthFormat および initscaleFactor を使用して セカンダリビュー用の深度 テクスチャを割り当てた結果とする。
    それ以外の場合
    セカンダリビュー用の depthStencilTexturesnull とする。
  20. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  21. layer を返す。

createQuadLayer(XRQuadLayerInit init) メソッドは、新しい XRQuadLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. contextthiscontext とする。

  4. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  6. layout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  7. layer を、this関連レルムにおける 新しい XRQuadLayer とする。

  8. layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。

  9. layer および init を使用して クワッドレイヤーを初期化するを実行する。

  10. layout を、inittextureTypecontext、および initlayout を使用して layout 属性を決定した結果とする。

  11. layerlayoutlayout に初期化する。

  12. layerneedsRedrawtrue に初期化する。

  13. layercolorTextures を、layerinittextureType および init を使用して カラーテクスチャを 割り当てた結果とする。

  14. layerdepthStencilTextures を、layerinittextureType および init を使用して 深度テクスチャを割り当てた結果とする。

  15. layermotionVectorTextures を、context関連レルム内の 新しい配列とする。

  16. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  17. layer を返す。

createCylinderLayer(XRCylinderLayerInit init) メソッドは、新しい XRCylinderLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. contextthiscontext とする。

  4. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  6. layout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  7. layer を、this関連レルムにおける 新しい XRCylinderLayer とする。

  8. layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。

  9. layer および init を使用して シリンダーレイヤーを初期化するを実行する。

  10. layout を、inittextureTypecontext、および initlayout を使用して layout 属性を決定した結果とする。

  11. layerlayoutlayout に初期化する。

  12. layerneedsRedrawtrue に初期化する。

  13. layercolorTextures を、layerinittextureType および init を使用して カラーテクスチャを 割り当てた結果とする。

  14. layerdepthStencilTextures を、layerinittextureType および init を使用して 深度テクスチャを割り当てた結果とする。

  15. layermotionVectorTextures を、context関連レルム内の 新しい配列とする。

  16. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  17. layer を返す。

createEquirectLayer(XREquirectLayerLayerInit init) メソッドは、新しい XREquirectLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. contextthiscontext とする。

  4. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  6. layout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  7. initspace が型 XRReferenceSpace のインスタンスでない場合、TypeError をスローし、これらの手順を中止する。

  8. initspacetype"viewer" の場合、 TypeError をスローし、これらの手順を中止する。

  9. layer を、this関連レルムにおける 新しい XREquirectLayer とする。

  10. layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。

  11. layer および init を使用して 正距円筒レイヤーを初期化するを実行する。

  12. layout を、inittextureTypecontext、および initlayout を使用して layout 属性を決定した結果とする。

  13. layerlayoutlayout に初期化する。

  14. layerneedsRedrawtrue に初期化する。

  15. layercolorTextures を、layerinittextureType および init を使用して カラーテクスチャを 割り当てた結果とする。

  16. layerdepthStencilTextures を、layerinittextureType および init を使用して 深度テクスチャを割り当てた結果とする。

  17. layermotionVectorTextures を、context関連レルム内の 新しい配列とする。

  18. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  19. layer を返す。

createCubeLayer(XRCubeLayerInit init) メソッドは、新しい XRCubeLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. contextthiscontext とする。

  4. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. contextWebGL2RenderingContext コンテキストでない場合、InvalidStateError をスローし、これらの手順を中止する。

  6. context が失われている場合、InvalidStateError をスローし、これらの手順を中止する。

  7. initspace が型 XRReferenceSpace のインスタンスでない場合、TypeError をスローし、これらの手順を中止する。

  8. initspacetype"viewer" の場合、 TypeError をスローし、これらの手順を中止する。

  9. layer を、this関連レルムにおける 新しい XRCubeLayer とする。

  10. layer 上で session および context を使用して コンポジションレイヤーを初期化するを実行する。

  11. layerspaceinitspace とする。

  12. layerisStaticinitisStatic に初期化する

  13. layerorientation を次のように初期化する:

    initorientation が設定されている場合
    layerorientation を、initorientation を使用して fromPoint を実行した結果とする。
    それ以外の場合
    layerorientation を、this関連レルムにおける 新しい DOMPointReadOnly とする。
  14. layoutinitlayout とする。

  15. textureTypeinittextureType とする。

  16. layerneedsRedrawtrue に初期化する。

  17. layout"default" または "stereo-left-right" または "stereo-top-bottom" の場合、 TypeError をスローし、これらの手順を中止する。

  18. layercolorTextures を、この XRCubeLayer関連レルムにおける 新しい配列とする。

  19. layout の値に基づき、layercolorTextures を次のように初期化する:

    1. layerlayout"mono" の場合:

      textureType"texture-array" の場合:
      colorTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、6 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      colorTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitcolorFormatviewPixelWidthviewPixelHeight の値を使用して TEXTURE_CUBE_MAP テクスチャとして作成される。
    2. それ以外で、layerlayout"stereo" の場合:

      textureType"texture-array" の場合:
      colorTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitcolorFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、12 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      colorTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 2 個で初期化する。これらのインスタンスは contextinitcolorFormatviewPixelWidthviewPixelHeight の値を使用して TEXTURE_CUBE_MAP テクスチャとして作成される。
  20. layerdepthStencilTextures を、この XRCubeLayer関連レルムにおける 新しい配列とする。

  21. layermotionVectorTextures を、この XRCubeLayer関連レルムにおける 新しい配列とする。

  22. initdepthFormat が設定されている場合、layerdepthStencilTextures を次のように初期化する:

    1. contextWebGL2RenderingContext ではなく、WEBGL_depth_texture 拡張context で有効になっていない場合、 TypeError をスローし、これらの手順を中止する。

    2. layerlayout"mono" の場合:

      textureType"texture-array" の場合:
      depthStencilTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、6 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      depthStencilTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitdepthFormatviewPixelWidthviewPixelHeight の値を使用して TEXTURE_CUBE_MAP テクスチャとして作成される。
    3. それ以外で、layerlayout"stereo" の場合:

      textureType"texture-array" の場合:
      depthStencilTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 1 個で初期化する。このインスタンスは contextinitdepthFormatmipLevelsviewPixelWidthviewPixelHeight の値を使用し、12 レイヤーを持つ TEXTURE_2D_ARRAY テクスチャとして作成される。
      それ以外の場合
      depthStencilTextures を、この XRCubeLayer関連レルムにある 不透明テクスチャ新しいインスタンス 2 個で初期化する。これらのインスタンスは contextinitdepthFormatviewPixelWidthviewPixelHeight の値を使用して TEXTURE_CUBE_MAP テクスチャとして作成される。
  23. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  24. layer を返す。

textureType"texture-array" を使用する場合、XRCubeLayer は、 次の順序でキューブマップの面を格納するために 6 個のテクスチャレイヤーを使用しなければならない: [TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z]

textureType"texture-array" を使用し、layout"stereo" を使用する場合、左目のコンテンツはレイヤーインデックス 0 から格納されなければならず、右目のコンテンツは レイヤーインデックス 6 から格納されなければならない。

キューブマップのサイズを どのように決定するかを定義する。

空間をどのように 扱うべきか。キューブマップの端まで歩くことはできるか?

orientation の初期状態を決定する。

XRWebGLBinding bindingXRCompositionLayer layer および XRFrame frame というパラメーターを持つ XRWebGLSubImage 作成関数の状態を 検証するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. framesessionlayersession と等しくない場合、false を返し、 これらの手順を中止する。

  2. frameactive ブール値が false の場合、 false を返し、これらの手順を中止する。

  3. frameanimationFrame ブール値が false の場合、 false を返し、これらの手順を中止する。

  4. bindingsessionlayersession と等しくない場合、false を返し、 これらの手順を中止する。

  5. bindingcontextlayercontext と等しくない場合、false を返し、 これらの手順を中止する。

  6. layercolorTextures 配列が空または存在しない場合、 false を返し、これらの手順を中止する。

  7. layerisStatictrue であり、 layerneedsRedrawfalse の場合、false を返し、これらの手順を中止する。

  8. true を返す。

不透明テクスチャ textureXRLayerLayout layout、整数 offset、および整数 num を使用して、XRViewport viewportビューポートを 初期化するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. viewportx0 に設定する。

  2. viewporty0 に設定する。

  3. viewportwidthtexture のピクセル幅に設定する。

  4. viewportheighttexture のピクセル高さに設定する。

  5. viewport を次のように更新する:

    layout"stereo-left-right" の場合
    viewportx を、texture のピクセル幅に offset を乗算し、 num で除算した値に設定する。
    viewportwidth を、subimagetexture のピクセル幅を num で除算した値に設定する。
    それ以外で layout"stereo-top-bottom" の場合
    viewporty を、texture のピクセル高さに offset を乗算し、 num で除算した値に設定する。
    viewportheight を、subimagetexture のピクセル高さを num で除算した値に設定する。
getSubImage(XRCompositionLayer layer, XRFrame frame, optional XREye eye = "none") メソッドは、新しい XRWebGLSubImage を作成する。

このメソッドが XRWebGLBinding binding 上で呼び出されたとき、次の手順を実行しなければならない:

  1. subimage を次のように初期化する:

    getSubImage() が以前に同じ bindinglayer、および eye で呼び出されていた場合、 ユーザーエージェントは次のようにしてもよい
    subimage を、同じ引数による以前の呼び出しで返されたものと同じ XRWebGLSubImage オブジェクトとする。
    それ以外の場合
    subimage を、this関連レルムにおける 新しい XRWebGLSubImage とする。
    subimageviewport を、this関連レルムにおける 新しい XRViewport とする。
  2. sessionthissession とする。

  3. layerdestroyedtrue の場合、InvalidStateError をスローし、これらの手順を中止する。

  4. layersessionlayers 配列に含まれていない場合、TypeError をスローし、これらの手順を中止する。

  5. layer の型が XRProjectionLayer の場合、 TypeError をスローし、これらの手順を中止する。

  6. layerlayout 属性が "default" の場合、 TypeError をスローし、これらの手順を中止する。

  7. index0 とする。

  8. layerlayout 属性が "stereo" の場合:

    1. eye"none" の場合、 TypeError をスローし、これらの手順を中止する。

    2. eye"right" の場合:

      layer が型 XRCubeLayer である場合
      index6 に設定する
      それ以外の場合
      index1 に設定する
  9. layer および frame を使用して XRWebGLSubImage 作成関数の状態を 検証するの結果が false の場合、InvalidStateError をスローし、これらの手順を中止する。

  10. subimageimageIndex を次のように初期化する:

    layer が textureType "texture-array" で作成された場合
    subimageimageIndexindex で初期化する。
    それ以外の場合
    subimageimageIndex0 で初期化する。
  11. subimagecolorTexture を次のように初期化する:

    layer が textureType "texture" で作成された場合
    subimagecolorTexture を、layercolorTextures 配列のオフセット index にある要素で初期化する。
    それ以外の場合
    subimagecolorTexture を、layercolorTextures 配列の最初の要素で初期化する。
  12. subimagedepthStencilTexture を次のように初期化する:

    layerdepthStencilTextures が空の配列である場合
    subimagedepthStencilTexturenull で初期化する。
    それ以外で layer が textureType "texture" で作成された場合
    subimagedepthStencilTexture を、layerdepthStencilTextures 配列のオフセット index にある要素で初期化する。
    それ以外の場合
    subimagedepthStencilTexture を、layerdepthStencilTextures 配列の最初の要素で初期化する。
  13. subimagedepthStencilTextureWidthdepthStencilTextureHeight、 および motionVectorTexturenull で初期化する。

  14. subimagecolorTextureWidthsubimagecolorTexture のピクセル幅に設定する。

  15. subimagecolorTextureHeightsubimagecolorTexture のピクセル高さに設定する。

  16. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureWidthdepthStencilTexture 配列内の最初のテクスチャのピクセル幅に設定する。

  17. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureHeightdepthStencilTexture 配列内の最初のテクスチャのピクセル高さに設定する。

  18. viewsPerTexture1 とする。

  19. layerlayout 属性が "stereo-left-right" または "stereo-top-bottom" の場合、 viewsPerTexture2 に設定する。

  20. subimageviewport 上で、 subimagecolorTexturelayerlayoutindex および viewsPerTexture を使用して ビューポートを初期化するを実行する。

  21. needsRedrawfalse に設定するための タスクをキューに入れる

  22. subimage を返す。

getViewSubImage(XRProjectionLayer layer, XRView view) メソッドは、新しい XRWebGLSubImage を作成する。

このメソッドが XRWebGLBinding binding 上で呼び出されたとき、次の手順を実行しなければならない:

  1. subimage を次のように初期化する:

    getViewSubImage() が以前に同じ bindinglayer、および view で呼び出されていた場合、ユーザーエージェントは次のようにしてもよい
    subimage を、同じ引数による以前の呼び出しで返されたものと同じ XRWebGLSubImage オブジェクトとする。
    それ以外の場合
    subimage を、this関連レルムにおける 新しい XRWebGLSubImage とする。
    subimageviewport を、this関連レルムにおける 新しい XRViewport とする。
  2. frameviewframe とする。

  3. sessionthissession とする。

  4. layerdestroyedtrue の場合、InvalidStateError をスローし、これらの手順を中止する。

  5. layer および frame を使用して XRWebGLSubImage 作成関数の状態を 検証するの結果が false の場合、InvalidStateError をスローし、これらの手順を中止する。

  6. layersessionlayers 配列に含まれていない場合、TypeError をスローし、これらの手順を中止する。

  7. viewactive フラグが false の場合、InvalidStateError をスローし、これらの手順を中止する。

  8. index を次のように初期化する:

    viewsessionビューのリストに由来する セカンダリビューである場合
    index を、プライマリビューを除いた sessionビューのリスト内における viewview のオフセットとする。
    それ以外の場合
    index を、セカンダリビューを除いた sessionビューのリスト内における viewview のオフセットとする。
  9. subimageimageIndex を次のように初期化する:

    layer が textureType "texture-array" で作成された場合:
    subimageimageIndexindex で初期化する。
    それ以外の場合
    subimageimageIndex0 に初期化する。
  10. subimagecolorTexture を次のように初期化する:

    viewsessionビューのリストに由来する セカンダリビューである場合
    subimagecolorTexture を、layerセカンダリビュー用の colorTextures のオフセット index にある要素で初期化する。
    それ以外で、layerlayout"default" であり、layer が textureType "texture" で作成された場合
    subimagecolorTexture を、layercolorTextures 配列のオフセット index にある要素で初期化する。
    それ以外の場合
    subimagecolorTexture を、layercolorTextures 配列の最初の要素で初期化する。
  11. subimagedepthStencilTexture を次のように初期化する:

    layerdepthStencilTextures が空の配列である場合
    subimagedepthStencilTexturenull で初期化する。
    それ以外で、viewsessionビューのリストに由来する セカンダリビューである場合
    subimagecolorTexture を、layerセカンダリビュー用の depthStencilTextures のオフセット index にある要素で初期化する。
    それ以外で、layerlayout"default" であり、layer が textureType "texture" で作成された場合
    subimagedepthStencilTexture を、layerdepthStencilTextures 配列のオフセット index にある要素で初期化する。
    それ以外の場合
    subimagedepthStencilTexture を、layerdepthStencilTextures 配列の最初の要素で初期化する。
  12. subimagemotionVectorTexture を次のように初期化する:

    layermotionVectorTextures が空の配列であるか、viewsessionビューのリストに由来する セカンダリビューである場合
    subimagemotionVectorTexturenull で初期化する。
    それ以外で layer が textureType "texture" で作成された場合
    subimagemotionVectorTexture を、layermotionVectorTextures 配列のオフセット index にある要素で初期化する。
    それ以外の場合
    subimagemotionVectorTexture を、layermotionVectorTextures 配列の最初の要素で初期化する。
  13. subimagecolorTextureWidthsubimagecolorTexture のピクセル幅に設定する。

  14. subimagecolorTextureHeightsubimagecolorTexture のピクセル高さに設定する。

  15. subimagedepthStencilTextureWidth および depthStencilTextureHeightnull で初期化する。

  16. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureWidthdepthStencilTexture 配列内の最初のテクスチャのピクセル幅に設定する。

  17. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureHeightdepthStencilTexture 配列内の最初のテクスチャのピクセル高さに設定する。

  18. subimageviewport 上で、 subimagecolorTexturelayerlayoutindex、および sessionビューのリストの数を使用して ビューポートを初期化するを実行する。

  19. needsRedrawfalse に設定する。

  20. subimage を返す

注: セッションは getSubImage() および getViewSubImage() の呼び出しを、エクスペリエンスが WebGL を使用して描画を開始する時点まで遅延させるよう試みるべきである。 通常、それはゲームロジックの実行後になる。特定のユーザーエージェントでは、CPU 依存コードと GPU 依存コードに異なる段階を設けることで、システムリソースを動的に最適化できる。

foveateBoundTexture(GLenum target, float fixed_foveation) は、現在バインドされているテクスチャまたはテクスチャ配列にフォービエーションを適用する。

このメソッドが XRWebGLBinding binding 上で呼び出されたとき、次の手順を実行しなければならない:

  1. target が型 TEXTURE_2D または TEXTURE_2D_ARRAY でない場合、InvalidStateError をスローし、これらの手順を中止する。

  2. ユーザーエージェントまたはデバイスがフォービエーションをサポートしていない場合、これらの手順を中止する。

  3. fixed_foveation0 未満の場合、0 に設定する。

  4. fixed_foveation1 より大きい場合、1 に設定する。

  5. bindingcontext において target にテクスチャがバインドされていない場合、InvalidStateError をスローし、これらの手順を中止する。

  6. bindingcontext を使用し、fixedFoveation と同じアルゴリズムを使用して fixed_foveationtarget に適用する。

  7. bindingcontext を使用して target にバインドされているテクスチャを foveatedTextures に追加する。

注: フォービエーションの効果は 直ちに有効になる。

XRLayerlayers 配列のメンバーである場合、XR アニメーションフレームの完了直後に 没入型 XR デバイスへ提示されなければならない。ただし、前の XR アニメーション フレーム以降に次の少なくとも 1 つが発生している場合に限る:

不透明フレームバッファまたは 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 radius = 2.0;
  float centralAngle = 0.78539;
  float? aspectRatio;
};

7.4. XRMediaEquirectLayerInit

XRMediaEquirectLayerInit dictionary は、video を含む XREquirectLayer がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary XRMediaEquirectLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float radius = 0.0;
  float centralHorizontalAngle = 6.28318;
  float upperVerticalAngle = 1.570795;
  float lowerVerticalAngle = -1.570795;
};

7.5. XRMediaBinding

XRMediaBinding オブジェクトは、HTMLVideoElement のコンテンツを表示する 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 layerHTMLVideoElement media とともにレンダリングされる必要がある場合、ユーザーエージェントは 次の手順を実行しなければならない:
  1. usability を、media使用可能性を確認した結果とする。

  2. usabilitybad の場合、layer を透明な 黒で塗りつぶし、これらの手順を中止する。

  3. layermedia 要素の内容で塗りつぶす。

描画を説明するための より優れたアルゴリズムを追加する。

XRMediaBinding(XRSession session) コンストラクターは、 呼び出されたときに次の手順を実行しなければならない:

  1. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  2. session没入型セッションでない場合、InvalidStateError をスローし、これらの手順を中止する。

  3. binding を、session関連レルムにおける 新しい XRMediaBinding とする。

  4. bindingsessionsession に初期化する。

  5. binding を返す。

HTMLVideoElement video および XRLayerLayout layoutアスペクト比を 計算するには、次の手順を実行する:
  1. width を、videovideoWidth とする。

  2. height を、videovideoHeight とする。

  3. layout"stereo-left-right" の場合、 width2 で除算する。

  4. layout"stereo-top-bottom" の場合、 height2 で除算する。

  5. widthheight で除算した値を返す。

createQuadLayer(HTMLVideoElement video, XRMediaQuadLayerInit init) メソッドは、新しい XRQuadLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  4. initlayout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  5. layer を、this関連レルムにおける 新しい XRQuadLayer とする。

  6. layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。

  7. layermediavideo に初期化する。

  8. layerneedsRedrawfalse に初期化する。

  9. aspectRatio を、video および initlayout を使用して アスペクト比を 計算した結果とする。

  10. initwidth および heightundefined の場合、width1 に設定する。

  11. initheightundefined の場合、heightwidthaspectRatio で除算した値に設定する。

  12. initwidthundefined の場合、widthheightaspectRatio を乗算した値に設定する。

  13. layer および init を使用して クワッドレイヤーを初期化するを実行する。

  14. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  15. layer を返す。

createCylinderLayer(HTMLVideoElement video, XRMediaCylinderLayerInit init) メソッドは、新しい XRCylinderLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  4. initlayout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  5. layer を、this関連レルムにおける 新しい XRCylinderLayer とする。

  6. layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。

  7. layermediavideo に初期化する。

  8. layerneedsRedrawfalse に初期化する。

  9. aspectRatio を、video および initlayout を使用して アスペクト比を 計算した結果とする。

  10. initaspectRatioundefined の場合、aspectRatioaspectRatio に設定する。

  11. layer および init を使用して シリンダーレイヤーを初期化するを実行する。

  12. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  13. layer を返す。

createEquirectLayer(HTMLVideoElement video, XRMediaEquirectLayerInit init) メソッドは、新しい XREquirectLayer layer を作成する。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. sessionthissession とする。

  2. session が「layers」 を有効にして作成されていない場合、NotSupportedError をスローし、これらの手順を中止する。

  3. sessionended 値が true の場合、InvalidStateError をスローし、これらの手順を中止する。

  4. initlayout"default" の場合、 TypeError をスローし、これらの手順を中止する。

  5. initspace が型 XRReferenceSpace のインスタンスでない場合、InvalidStateError をスローし、これらの手順を中止する。

  6. initspacetype"viewer" の場合、 InvalidStateError をスローし、これらの手順を中止する。

  7. layer を、this関連レルムにおける 新しい XREquirectLayer とする。

  8. layer 上で session を使用して コンポジションレイヤーを初期化するを実行する。

  9. layermediavideo に初期化する。

  10. layerneedsRedrawfalse に初期化する。

  11. layer および init を使用して 正距円筒レイヤーを初期化するを実行する。

  12. XR コンポジターが、何らかの理由で layer 用の リソースを作成できないことを認識している場合、OperationError をスローし、これらの手順を中止する。

  13. 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" 機能 記述子 で作成されている場合、XRProjectionLayerXRQuadLayer および XRCylinderLayer レイヤーは、layers 配列内の位置ではなく、その深度に基づいて表示されなければならない。 他のレイヤー型は、従来どおりソートされ続けなければならない。

XRQuadLayer および XRCylinderLayer レイヤーは、その寸法(たとえば width または centralAngle)、 変換および空間によってソートされなければならない。

XRProjectionLayer レイヤーは、その depthStencilTexture の値に従ってソートされなければならない。 これはまた、"depth-sorted-layers" が有効な場合、XR Compositor は深度値を使用しなければならず、ignoreDepthValues および usesDepthValues は `true` に設定されなければならないことも意味する。

10. Space warp

スペースワープは、 XRコンポジターの再投影を改善する技術である。 motionVectorTexturedepthStencilTexture とともに送信することで、XRコンポジターは高品質なフレーム外挿と再投影を行うことができ、 これによりユーザーエージェントは低いフレームレートで動作しながらも、ユーザーに滑らかな体験を提供できる。 requestAnimationFrame() コールバックが配信されるレートは、ディスプレイのネイティブリフレッシュレートより低い場合がある。XRコンポジターは、 エクスペリエンスによって提供されるモーションベクトルおよび深度情報を使用して、欠落したフレームを合成する。

スペースワープを有効にするには、XRSession は「space-warp機能 記述子を指定して作成されなければならない。 「space-warp」が有効な場合、XRコンポジターは 深度値を使用しなければならず、ignoreDepthValues は`false`に設定されなければならず、usesDepthValues は`true`に設定されなければならない。

space-warp 機能 記述子が有効な場合、エクスペリエンスは、送信する各XRProjectionLayerdepthStencilTexture に、シーンを表す深度値をレンダリングするべきである。 depthStencilTexturemotionVectorTexture は同じ寸法を持ち、その寸法はcolorTextureの寸法とは異なる場合がある。 作者はdepthStencilTextureWidth およびdepthStencilTextureHeight を使用して、深度/ステンシルアタッチメントとモーションベクトルアタッチメントの両方の寸法を決定できる。 作者は、viewport ではなく、それらのアタッチメント全体にわたって深度/ステンシルおよびモーションベクトル情報をレンダリングするべきである。

注: 深度/ステンシルおよびモーションベクトル アタッチメントはカラーアタッチメントとは異なる寸法を持つことがあるため、colorTexture へのレンダリングに使用されるフレームバッファにアタッチすることを意図していない。 作者は、深度/ステンシルおよびモーションベクトル情報を、それぞれのアタッチメントの寸法で個別にレンダリングするべきである。

motionVectorTextureRGBA16F フォーマットでなければならない。作者は、このテクスチャのRG成分を、その領域の2Dスクリーン空間モーションベクトルで 埋めるべきであり、これは現在のフレームと前のフレームの間の正規化デバイス座標NDC)における差分として表される。 モーションベクトルは`(currentClipPos / currentW) - (prevClipPos / prevW)`として計算され、ここで `currentClipPos`と`prevClipPos`は、それぞれ現在のフレームと前のフレームにおけるフラグメントのクリップ空間位置である。 赤チャンネルはNDC X(水平方向)の差分に対応し、緑チャンネルはNDC Y(垂直方向)の差分に対応する。青チャンネルには NDC Z(深度)の差分を含めてもよく、アルファチャンネル は使用されない。

motionVectorTexture またはdepthStencilTextureXRFrameの処理中に送信されなかった場合、 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 が作成されたとき、ユーザーエージェントは次の手順を実行してレンダー状態を初期化しなければならない:
  1. レンダー状態を初期化するための元の手順を実行して、state を初期化する。

  2. statelayers を、session関連レルムにある 新しい空の配列で初期化する。

11.2. updateRenderState の変更

このモジュールは、WebXR 仕様の「保留中のレイヤー状態を更新する」で示された手順を置き換える。 代わりに、ユーザーエージェントが XRSession session および XRRenderStateInit newState を使用して保留中のレイヤー状態を更新するとき、次の手順を実行しなければならない:

  1. newStatebaseLayernewStatelayers の両方が設定されている場合、NotSupportedError をスローし、これらの手順を中止する。

  2. activeStatesessionアクティブなレンダー状態とする。

  3. newStatebaseLayer が設定されている場合:

    1. session保留中のレンダー状態null の場合、 それを activeState のコピーに設定する。

    2. session保留中のレンダー状態layersnull に設定する。

  4. newStatelayers が設定されている場合:

    1. newStatelayers に、destroyed ブール値が true である XRCompositionLayer が含まれている場合、InvalidStateError をスローし、これらの手順を中止する。

    2. session が「layers」を有効にして作成されておらず、 newStatelayers1 個を超えるインスタンスが含まれている場合、NotSupportedError をスローし、これらの手順を中止する。

    3. newStatelayersmaxRenderLayers を超える数のエントリーが含まれている場合、NotSupportedError をスローし、これらの手順を中止する。

    4. session保留中のレンダー状態null の場合、 それを activeState のコピーに設定する。

    5. newStatelayers に重複するインスタンスが含まれている場合、TypeError をスローし、これらの手順を中止する。

    6. newStatelayers 内の各 layer について:

      1. layerXRCompositionLayer であり、layersessionsession と異なる場合、TypeError をスローし、これらの手順を中止する。

      2. layerXRWebGLLayer であり、layersessionsession と異なる場合、TypeError をスローし、これらの手順を中止する。

    7. session保留中のレンダー状態baseLayernull に設定する。

    8. session保留中のレンダー状態layersnewStatelayers に設定する。

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 の変更

このモジュールは、WebXR 仕様の「レイヤー状態を確認する」で示された手順を置き換える。代わりに、 renderState state を使用してレイヤー 状態を確認するには、ユーザーエージェントは次の手順を実行しなければならない:
  1. statebaseLayernull でない場合、true を返す。

  2. statelayers 内の各 layer について:

    1. layerXRCompositionLayer でないか、または layerdestroyed ブール値が false の場合、true を返す。

  3. false を返す。

11.6. XRSession の変更

このモジュールは、XRSession インターフェイスを拡張し、次のものを追加する:
[SecureContext, Exposed=Window] partial interface XRSession {
  readonly attribute unsigned long maxRenderLayers;
};

maxRenderLayers は、コンポジターが処理しなければならない レイヤーの最大数、したがって任意の XRRenderStateInitlayers 配列の最大サイズを表す。ある時点で、この数を超えるレイヤーを作成できるべきである。

注: このガイダンスは、レイヤーの割り当てで説明されているように、ユーザーエージェントが割り当て可能な レイヤー数に制限を設けることを意図したものではない。たとえば、ユーザーエージェントは 20 個のレイヤーの 作成を許可しつつ、一度に updateRenderState() を介して設定できるのは 10 個までとすることができる。 また、異なるレイヤーは異なる量のバックエンド処理能力や オブジェクトを必要とする場合があるため、ユーザーエージェントには、少なくとも その数のレイヤーをレンダリングできることを保証するために `maxRenderLayers` 値を設定する際の一定の裁量がある点にも留意する必要がある。 ただし、ユーザーエージェントは、より多くのレイヤーが渡された場合には引き続き拒否する必要があり、 updateRenderState に渡されるレイヤーがより少ない場合は拒否できない。

XRSession は、そのセッションを使用して作成された各 XRWebGLBinding への弱参照を保持する内部 WeakSet bindings を持つ。

このモジュールは、WebXR 仕様の「セッションを シャットダウンする」に手順を追加する。 次をリストに追加する:

  1. session|bindings 内の各 binding について:

    1. bindingfoveatedTextures 内の各 texture について:

    2. 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 からの変更点

新機能:

変更:

適合性

文書の 慣例

適合性要件は、 記述的な表明と RFC 2119 の用語の組み合わせによって表現されます。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されているように解釈されるものとします。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のすべてのテキストは、 明示的に非規範的とマークされた節、例、および注を除き、規範的です。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 または規範的テキストから class="example" によって分離されます。次のようになります:

これは参考例の一例です。

参考注は “Note” という語で始まり、 規範的テキストから class="note" によって分離されます。次のようになります:

注、これは参考注です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現される要件 (たとえば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など) の意味で解釈されるものとします。

アルゴリズムまたは特定の手順として表現される適合性要件は、 最終結果が等価である限り、 どのような方法でも実装できます。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図したものであり、 性能が高いことを意図したものではありません。 実装者には最適化が推奨されます。

索引

この仕様で定義される用語

参照により定義される用語

参考文献

規範的参考文献

[COMPOSITING-1]
Chris Harrelson. 合成とブレンディング レベル 1. 2024年3月21日. CRD. URL: https://www.w3.org/TR/compositing-1/
[DOM]
Anne van Kesteren. DOM 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. Geometry Interfaces Module レベル 1. 2025年12月4日. CRD. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC で要件レベルを 示すために使用するキーワード. 1997年3月. 現行最良慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Kelsey Gilbert. WebGL 2.0 仕様. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2026年6月9日. CRD. URL: https://www.w3.org/TR/webxr/
[WEBXR-AR-MODULE-1]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR 拡張現実モジュール - レベル 1. 2025年4月25日. CRD. URL: https://www.w3.org/TR/webxr-ar-module-1/

参考参考文献

[PERMISSIONS-REQUEST]
Requesting Permissions. Draft Community Group Report. URL: https://wicg.github.io/permissions-request/

IDL 索引

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

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

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

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

  readonly attribute boolean needsRedraw;

  undefined destroy();
};

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

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

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

  attribute float width;
  attribute float height;

  // Events
  attribute EventHandler onredraw;
};

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

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

  // Events
  attribute EventHandler onredraw;
};

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

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

  // Events
  attribute EventHandler onredraw;
};

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

  // Events
  attribute EventHandler onredraw;
};

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

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

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

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

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

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

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

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

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

dictionary XRCubeLayerInit : XRLayerInit {
  DOMPointReadOnly? orientation;
};

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

  readonly attribute double nativeProjectionScaleFactor;
  readonly attribute boolean usesDepthValues;

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

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

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

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

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

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

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

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

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

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

dictionary XRLayerEventInit : EventInit {
  required XRLayer layer;
};

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

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

課題索引

この節には明確化が必要です
この節には明確化が必要です
init dictionaries は optional であるべきではありません。これは bikeshed issue 1566 です。
size が layout を変更させる場合の UA behavior を特別扱いする(たとえば、要求された width が "stereo-left-right" で制限を超える場合)
scaleFactor は secondary views 用に再計算される必要があります。
cubemap sizes がどのように決定されるかを定義する。
space はどのように扱うべきか。cubemap の端まで歩いて行けるのか?
orientation の初期状態を決定する。
init dictionaries は optional であるべきではありません。これは bikeshed issue 1566 です。
video が layers にどのように blit されるかについて、より多くの明確化が必要です。
drawing を記述する、よりよい algorithm を追加する。
XREquirectLayer の parameters が video display にどのように影響するかを定義する。