WebXR レイヤー API レベル 1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webxrlayers-1-20260601/
最新公開バージョン:
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 について、the underlying resources of a layer are lost 場合、 ユーザーエージェントは次の手順を実行しなければなりません:
  1. layerneedsRedrawtrue に設定します。

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

destroy() は、基礎となるアタッチメントを削除します。アタッチメントが存在しない場合、この関数は何もしません。

XRSession session および任意の WebGLRenderingContext または WebGL2RenderingContext context のインスタンスで initialize a composition layer するには、 ユーザーエージェントは次の手順を実行しなければなりません:

  1. thissessionsession に設定します。

  2. context が定義されている場合、thiscontextcontext に設定します。

  3. thisblendTextureSourceAlphatrue に設定します。

  4. thisopacity1.0 に設定します。

destroy() を呼び出すとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. thiscolorTextures 配列を空の配列に設定します。

  2. thisdepthStencilTextures 配列を空の配列に設定します。

  3. 基礎となる GL アタッチメントを破棄します。

XRCompositionLayer は、null または WebGLRenderingContext もしくは WebGL2RenderingContext のインスタンスである context オブジェクトと、null または HTMLVideoElement のインスタンスである media オブジェクトを持ちます。

XRCompositionLayer は、作成時に使用された XRSession である、関連付けられた session を持ちます。

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

  1. spacenull の場合、TypeError を投げ、これらの手順を中止します。

  2. spacesessionlayersession と等しくない場合、TypeError を投げ、これらの手順を中止します。

XRCompositionLayer は、作者がこのレイヤーへ描画できるのが needsRedrawtrue のときのみであることを示す、内部 boolean isStatic を持ちます。

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

書き込み可能な属性が XRCompositionLayer またはその派生クラスのいずれかに設定された場合、 その属性を読み取ると、その値を返さなければなりません。 requestAnimationFrame() callback の終了時に、その値は underlying XR Compositor に送信されなければなりません。XR Compositor は、 XRFrame を次に提示するとき、その値を適用しなければなりません。この XRFrame は requestAnimationFrame() callback に渡されたものです。

注: これは、 XR Compositor が新しい XRFrame を使用して scene を再描画するときに、値が適用されなければならないことを意味します。 これは、colorTexture に変更がなかった場合でも同様です。この colorTexture は XRCompositionLayer に関連付けられています。また、media layer に関連付けられた videoframe に変更がなかった場合も同様です。 XR Compositor が前の XRFrame の state で scene を再描画する場合、新しい値を使用してはなりません。

3.5. XRProjectionLayer

XRProjectionLayer は、観察者のビュー全体を満たすレイヤーです。 Projection レイヤーは、デバイスのネイティブフレームレートに近い頻度で更新されるべきです。

projection layer の表現

[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 属性は、 XRProjectionLayertextureType として "texture-array" で初期化された場合、このレイヤーの colorTextures テクスチャの レイヤー数を返します。そうでない場合は 1 を返します。

fixedFoveation 属性は、 XR Compositor によって使用される foveation の量を制御します。ユーザーエージェントまたはデバイスがこの属性をサポートしない場合、 取得時には null を返すべきであり、設定は no-op であるべきです。 fixedFoveation0 未満の値に設定すると 0 に設定され、 1 より大きい値に設定すると 1 に設定されます。0 は foveation の最小量を設定し、1 は最大量を設定します。XR Compositor がこれらの値をどのように解釈するかはユーザーエージェントに委ねられます。 fixedFoveation レベルが変更された場合、それは次の XRFrame で有効になります。

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

The deltaPose 属性は、前のフレーム以降にビューに影響する、 アプリケーションが適用した増分変換がある場合、それを記述する。 ユーザーエージェントまたはデバイスがこの属性をサポートしていない場合、または "space-warp" 機能記述子 が要求されていなかった場合、ユーザーエージェントは取得時に null を返すべきであり、設定は no-op であるべきである。 null 値は、アプリケーションが適用した変換が供給されていないことを示す。 deltaPose の値は、作者が変更するまで持続する。ユーザーエージェントは requestAnimationFrame() コールバックの終了時にそれをリセットしない。 人工的な移動がフレーム間で世界をあるアプリケーションポーズから別のアプリケーションポーズへ変換する場合、 deltaPose をそれらのポーズの差分に設定すると、XR Compositor が欠落フレームを合成する助けとなる。 作者は、その変換が変化したときに deltaPose を更新し、アプリケーションが適用した変換が発生しなかったフレームでは null または恒等変換に設定するべきである。

3.6. XRQuadLayer

XRQuadLayer は、仮想環境内の平坦な矩形空間を占めるレイヤーをレンダリングします。 レイヤーの前面のみが可視でなければならず、背面は XR Compositor によって 描画されてはなりません。

XRQuadLayer には厚みがありません。これは 3D 空間内に配置および方向付けされた 2 次元オブジェクトです。 quad の位置は quad の中心を指します。

quad layer の表現

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

  attribute float width;
  attribute float height;

  // Events
  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

XRCylinderLayer は、仮想環境内の曲面の矩形空間を占めるレイヤーをレンダリングします。 レイヤーの前面のみが可視でなければならず、背面は XR Compositor によって 描画されてはなりません。

cylinder layer の表現

XRCylinderLayer には厚みがありません。これは 3D 空間内に配置および方向付けされた 2 次元オブジェクトです。 cylinder の位置は quad の中心を指します。

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

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

  // Events
  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

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

equirect layer の表現

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

[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;
};

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 Compositor が cubemap から直接レンダリングするレイヤーを レンダリングします。

cube layer の表現

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

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

  // Events
  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 の領域を記述するものではない。

The depthStencilTexture 属性は、 XRCompositionLayer 用の深度/ステンシル 不透明 テクスチャ を返す。 レイヤーが深度/ステンシルなしで作成された場合、この属性は null を返す。

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

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

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

The 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. 不透明テクスチャ

WebXR GPU レイヤーを使用するとき、XRWebGLBinding オブジェクトは、color および depth/stencil アタッチメントに対して opaque texture のインスタンスを返します。

opaque texture は、 次の変更を伴って、標準の WebGLTexture と同一に機能します:

opaque texture にアタッチされたバッファは、clearOnAccesstrue のとき、各 XR animation frame における getViewSubImage() または getSubImage() の最初の呼び出しの処理中に、下の表の値にクリアされなければなりません。 clearOnAccessfalse の場合、opaque texture にアタッチされたバッファは、それらが初めてアクセスされたときに クリアされなければなりません。 後のフレームにおける以後のアクセスでは、バッファをクリアしなくてもよいです。

バッファ クリア値
Color (0, 0, 0, 0)
Depth 1.0
Stencil 0

opaque texture2 以上の mipLevels で作成された場合、作者はすべての mip levels を設定すべきです。ユーザーエージェントは mip levels を作成すべきであると仮定してはなりません。

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

注: opaque textures の 寸法または形式の変更は許可されません。GL コマンドは texel 値およびテクスチャパラメーターのみを変更できます。WebGLTexture に対して次の コマンドのいずれかを使用すると、寸法または形式に影響しない場合でも INVALID_OPERATION エラーが 生成されます: TexImage*, CompressedTexImage*, CopyTexImage* および TexStorage*。 OpenGL ES 3.0 仕様の "Immutable-Format Texture Images" 節では、これらの制限がより詳しく定義されています。

レイヤーのリソース(メモリなど)の割り当ては、WebGL と同じ仕組みを通じて行われなければなりません。

XRLayerRGBA または RGB colorFormat で割り当てられる場合、その colorTextures は、 RGBA または RGB として WebGLRenderingContext context に公開されなければなりません。 ただし、XR Compositor は、colorTextures のピクセルを、 SRGB8_ALPHA8 または SRGB8 colorFormat 内にあるかのように扱わなければなりません。

注: これは、XR CompositorcolorTextures を処理するとき、linear RGBA または RGB からのガンマ変換を行ってはならないことを意味します。そうでない場合、最終レンダリングのピクセルは 明るすぎて見え、通常の 2D WebGLRenderingContext context 上のレンダリングと一致しなくなります。

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 属性は、 color texture data のデータ型を定義します。

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

WebGL2 context では、次の追加形式がサポートされます:

depthFormat 属性は、 depth texture data のデータ型を定義します。 depthFormat0 の場合、レイヤーは depth/stencil texture を提供しません。

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

'WEBGL_depth_texture' extension が有効化された WebGLRenderingContext context または WebGL2 context について:

extension が有効化されていない場合、depth texture の要求は無視されます。

注: 作者が depth texture を期待している可能性があるため、 これは作者を混乱させる可能性があります。可能であれば、テクスチャが作成されなかった理由とともに警告を 提供してください。

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

scaleFactor 属性は、 レイヤーのアタッチメントの解像度を決定する際に、sessionrecommended WebGL framebuffer resolution に 乗算されなければならない値を定義します。

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

注: XRProjectionLayerInit 辞書は、XRLayerInit のように mipLevels を構成するサポートを持ちません。 ユーザーエージェントが projection レイヤーで mipmapping をサポートしたい場合、mips 付きでテクスチャを 割り当てることは自由です。 その場合、すべての mip levels を生成する責任はユーザーエージェント(作者ではなく)にあります。

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 辞書は optional であるべきではありません。これは bikeshed issue 1566 です。

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

XRWebGLBinding は、作成時に使用された XRSession である、関連付けられた session を持ちます。

XRWebGLBinding は、foveateBoundTexture を呼び出すときに指定された target にバインドされていたテクスチャへの弱参照を保持する、内部 WeakSet foveatedTextures を持ちます。

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

XRWebGLBinding を通じて作成された各 XRCompositionLayer は、color textures 用の WebGLTexturesarray である内部 colorTextures 配列、 depth/stencil textures 用の opaque texturesarray である内部 depthStencilTextures、 および motion textures 用の opaque texturesarray である内部 motionVectorTextures を持ちます。

XRWebGLBinding を通じて作成された各 XRProjectionLayer は、color textures 用の opaque texturesarray である内部 colorTextures for secondary views 配列と、secondary views をレンダリングするために使用される depth/stencil textures 用の opaque texturesarray である内部 depthStencilTextures for secondary views 配列を持ちます。

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

  1. binding を、sessionrelevant realm 内の new XRWebGLBinding とします。

  2. sessionended 値が true の場合、InvalidStateError を投げ、これらの手順を中止します。

  3. context が lost である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. sessionimmersive session でない場合、InvalidStateError を投げ、これらの手順を中止します。

  5. contextXR compatible boolean が false の場合、InvalidStateError を投げ、これらの手順を中止します。

  6. bindingcontextcontext に初期化します。

  7. bindingsessionsession に初期化します。

  8. bindingsessionbindings に追加します。

  9. binding を返します。

nativeProjectionScaleFactor 関数は、sessionnative WebGL framebuffer resolution を得るために、 sessionrecommended WebGL framebuffer resolution に乗算されなければならない値を返します。

サイズがレイアウト変更を 引き起こす場合の UA の挙動を特別扱いする(例: 要求された幅が "stereo-left-right" で制限を超える場合)

usesDepthValues 属性は、 false の場合、depth buffer attachment が存在しても XR Compositor が値を使用してはならないことを示します。属性が true の場合、depth buffer attachment の内容が XR Compositor によって使用され、レイヤー内にレンダリングされたシーンを表すことが期待されることを示します。

XRTextureType textureTypeXRWebGLRenderingContext context、および XRLayerLayout layout を用いて determine the layout attribute するには、ユーザーエージェントは 次の手順を実行しなければなりません:

  1. contextWebGL2RenderingContext でなく、かつ textureType"texture-array" である場合、TypeError を投げ、これらの手順を中止します。

  2. textureType"texture-array" であり、かつセッションの list of views 内のすべての views が同じ recommended WebGL color texture resolution を持たない場合、NotSupportedError を投げ、これらの手順を中止します。

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

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

    1. list of views のサイズが 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 を用いて determine the maximum scalefactor するには、ユーザーエージェントは 次の手順を実行しなければなりません:

  1. largest width を、secondary views を除く、sessionlist of views からの recommended WebGL color texture resolution の最大幅とします。

  2. largest height を、secondary views を除く、sessionlist of views からの recommended WebGL color texture resolution の最大高さとします。

  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 を用いて allocate color textures for projection layers するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. array を、contextrelevant realm 内の new array とします。

  2. contextlayercontext とします。

  3. sessionlayersession とします。

  4. numViews を、secondary views を除く、sessionlist of views の数とします。

  5. view を、sessionlist of views 内の、secondary views でない最初のエントリーとします。

  6. width を、viewrecommended WebGL color texture resolution の幅に scaleFactor を掛けたものとします。

  7. height を、viewrecommended WebGL color texture resolution の高さに scaleFactor を掛けたものとします。

  8. textureFormatlist of color formats for projection layers に含まれない場合、NotSupportedError を投げ、これらの手順を中止します。

  9. layerlayout"mono" または "default" である場合:

    textureType"texture-array" である場合:
    セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended WebGL color texture resolution を持たない場合、NotSupportedError を投げ、これらの手順を中止します。
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、contexttextureFormatwidth、および height を使用して、numViews レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
    opaque texture を何らかの理由で作成できなかった場合、OperationError を投げ、これらの手順を中止します。
    array を返し、これらの手順を中止します。
    それ以外の場合
    sessionlist of views 内の各 view について:
    1. viewsecondary view である場合、継続します。

    2. width を、viewrecommended WebGL color texture resolution の幅に scaleFactor を掛けたものとします。

    3. height を、viewrecommended WebGL color texture resolution の高さに scaleFactor を掛けたものとします。

    4. texture を、contextrelevant realm 内の new opaque texture のインスタンスとします。これは、 contexttextureFormatwidth および height を使用して、TEXTURE_2D texture として作成されます。

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

    6. texturearray に追加します。

    array を返し、これらの手順を中止します。
  10. セッションの list of views 内の views が、secondary views を除いて、すべて同じ recommended WebGL color texture resolution を持たない場合、NotSupportedError を投げ、これらの手順を中止します。

  11. layerlayoutstereo-left-right である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、contexttextureFormatnumViews multiplied by width および height を使用して、 textureType texture として作成されます。

  12. layerlayoutstereo-top-bottom である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、contexttextureFormatwidth および numViews multiplied by height を使用して、 textureType texture として作成されます。

  13. opaque texture を何らかの理由で作成できなかった場合、OperationError を投げ、これらの手順を中止します。

  14. array を返します。

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

  1. contextlayerコンテキストとする。

  2. arraycontext関連するレルム内の 新しい配列とする。

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

  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 個で初期化する。このインスタンスは、contexttextureFormatstencilwidth、および height を使用し、 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関連するレルム内にある 新しい 不透明テクスチャのインスタンスとする。 このインスタンスは、contexttextureFormatstencilwidth、および height を使用し、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 個で初期化する。このインスタンスは、contexttextureFormatstencilnumViewswidth を掛けたもの、および height を使用する textureType テクスチャとして作成される。

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

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

  19. array を返す。

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

  1. contextlayerコンテキストとする。

  2. arraycontext関連するレルム内の 新しい配列とする。

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

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

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

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

  7. view を、セカンダリビューではない、sessionビューのリスト内の最初の項目とする。

  8. widthview推奨モーションベクターテクスチャ 解像度の幅に scaleFactor を掛けたものとする。

  9. heightview推奨モーションベクターテクスチャ 解像度の高さに scaleFactor を掛けたものとする。

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

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

    2. widthview推奨 モーションベクターテクスチャ解像度の幅に scaleFactor を掛けたものとする。

    3. heightview推奨 モーションベクターテクスチャ解像度の高さに scaleFactor を掛けたものとする。

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

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

    6. texturearray に追加する。

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

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

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

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

  15. array を返す。

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

  1. contextlayerコンテキストとする。

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

  3. arraycontext関連するレルム内の 新しい配列とする。

  4. textureFormat投影レイヤー用の色フォーマットのリスト内にない場合、NotSupportedError を投げ、これらの手順を中止する。

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

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

    2. widthview推奨 WebGL 色 テクスチャ解像度の幅に scaleFactor を掛けたものとする。

    3. heightview推奨 WebGL 色 テクスチャ解像度の高さに scaleFactor を掛けたものとする。

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

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

    6. texturearray に追加する。

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

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

  1. contextlayerコンテキストとする。

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

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

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

  5. textureFormat投影レイヤー用の深度フォーマットのリスト内にない場合、NotSupportedError を投げ、これらの手順を中止する。

  6. arraycontext関連するレルム内の 新しい配列とする。

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

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

    2. widthview推奨 WebGL 深度 テクスチャ解像度の幅に scaleFactor を掛けたものとする。

    3. heightview推奨 WebGL 深度 テクスチャ解像度の高さに scaleFactor を掛けたものとする。

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

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

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

scaleFactor は secondary views 用に再計算される必要があります。

XRCompositionLayer layerXRTextureType textureType、および XRLayerInit init を用いて allocate color textures するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. array を、contextnew array とします。

  2. contextlayercontext とします。

  3. initcolorFormatlist of color formats for non-projection layers に含まれない場合、NotSupportedError を投げ、これらの手順を中止します。

  4. initmipLevels1 より小さい場合、InvalidStateError を投げ、これらの手順を中止します。

  5. initmipLevels1 より大きく、かつ viewPixelWidth および viewPixelHeight2 の累乗でない場合、InvalidStateError を投げ、これらの手順を中止します

  6. layerlayout"mono" である場合:

    textureType"texture-array" である場合:
    array を、この contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、1 つの内部 texture を持つ TEXTURE_2D_ARRAY texture として作成されます。
    それ以外の場合
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_2D texture として作成されます。
  7. layerlayout"stereo" である場合:

    textureType"texture-array" である場合:
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、2 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
    array を返し、これらの手順を中止します。
    それ以外の場合
    array を、contextrelevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_2D texture として作成されます。
    array を返し、これらの手順を中止します。
  8. layerlayoutstereo-left-right である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth の 2 倍および viewPixelHeight 値を使用して、textureType texture として作成されます。

  9. layerlayoutstereo-top-bottom である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight の 2 倍の値を使用して、textureType texture として作成されます。

  10. array を返します。

XRCompositionLayer layerXRTextureType textureType、および XRLayerInit init を用いて allocate depth textures するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. array を、contextnew array とします。

  2. contextlayercontext とします。

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

  4. initdepthFormatlist of depth formats for non-projection layers に含まれない場合、NotSupportedError を投げ、これらの手順を中止します。

  5. initmipLevels1 より小さい場合、InvalidStateError を投げ、これらの手順を中止します。

  6. initmipLevels1 より大きく、かつ viewPixelWidth および viewPixelHeight2 の累乗でない場合、InvalidStateError を投げ、これらの手順を中止します。

  7. layerlayout"mono" である場合:

    textureType"texture-array" である場合:
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、1 つの内部 texture を持つ TEXTURE_2D_ARRAY texture として作成されます。
    それ以外の場合
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_2D texture として作成されます。
  8. layerlayout"stereo" である場合:

    textureType"texture-array" である場合:
    array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、2 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
    array を返し、これらの手順を中止します。
    それ以外の場合
    array を、contextrelevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_2D texture として作成されます。
    array を返し、これらの手順を中止します。
  9. layerlayoutstereo-left-right である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth の 2 倍および viewPixelHeight 値を使用して、textureType texture として作成されます。

  10. layerlayoutstereo-top-bottom である場合、array を、contextrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight の 2 倍の値を使用して、textureType texture として作成されます。

  11. array を返します。

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

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

  1. session を、thissession とする。

  2. context を、thiscontext とする。

  3. layer を、new された XRProjectionLayer とし、関連するレルムthis のものとする。

  4. sessionended 値が true の場合、InvalidStateError を投げ、これらの手順を中止する。

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

  6. layer に対して、session および context を用いて、合成レイヤーを初期化する を実行する。

  7. layerisStaticfalse に初期化する。

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

    session が "space-warp" 機能記述子 で作成されていた場合
    layerignoreDepthValuesfalse に初期化する
    initdepthFormatfalse であり、かつ XR Compositor が深度値を利用する場合
    layerignoreDepthValuesfalse に初期化する
    それ以外の場合
    layerignoreDepthValuestrue に初期化する
  9. layerfixedFoveation0 に初期化する。

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

  11. maximum scalefactor を、sessioncontext および layout を用いて、最大 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 Compositor が、何らかの理由で 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 を用いて quad レイヤーを初期化するを実行する。

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

  11. layerlayoutlayout に初期化する。

  12. layerneedsRedrawtrue に初期化する。

  13. layercolorTextures を、layerinittextureType および init を用いて 色テクスチャを 割り当てる結果とする。

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

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

  16. XR Compositor が、何らかの理由で 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 を用いて cylinder レイヤーを初期化するを実行する。

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

  11. layerlayoutlayout に初期化する。

  12. layerneedsRedrawtrue に初期化する。

  13. layercolorTextures を、layerinittextureType および init を用いて 色テクスチャを 割り当てる結果とする。

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

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

  16. XR Compositor が、何らかの理由で 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. initspace"viewer"type を持つ場合、TypeError を投げ、これらの手順を中止する。

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

  10. layer に対して、session および context を用いて 合成レイヤーを初期化するを実行する。

  11. layer および init を用いて equirect レイヤーを初期化するを実行する。

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

  13. layerlayoutlayout に初期化する。

  14. layerneedsRedrawtrue に初期化する。

  15. layercolorTextures を、layerinittextureType および init を用いて 色テクスチャを 割り当てる結果とする。

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

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

  18. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止する。

  19. layer を返す。

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

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

  1. session を、thissession とします。

  2. session が "layers" を有効にして作成されていなかった場合、NotSupportedError を投げ、これらの手順を中止します。

  3. context を、thiscontext とします。

  4. sessionended 値が true の場合、InvalidStateError を投げ、これらの手順を中止します。

  5. contextWebGL2RenderingContext context でない場合、InvalidStateError を投げ、これらの手順を中止します。

  6. context が lost である場合、InvalidStateError を投げ、これらの手順を中止します。

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

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

  9. layer を、thisrelevant realm 内の new XRCubeLayer とします。

  10. layer に対して、session および context を指定して initialize a composition layer を実行します。

  11. layerspaceinitspace とします。

  12. layerisStaticinitisStatic に初期化します

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

    initorientation が設定されている場合
    layerorientation を、initorientation を指定して fromPoint を実行した結果とします。
    それ以外の場合
    layerorientation を、thisrelevant realm 内の new DOMPointReadOnly とします。
  14. layoutinitlayout とします。

  15. textureTypeinittextureType とします。

  16. layerneedsRedrawtrue に初期化します。

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

  18. layercolorTextures を、この XRCubeLayerrelevant realm 内の new array とします。

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

    1. layerlayout"mono" である場合:

      textureType"texture-array" である場合:
      colorTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、6 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      colorTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および initcolorFormatviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_CUBE_MAP texture として作成されます。
    2. それ以外の場合で、layerlayout"stereo" である場合:

      textureType"texture-array" である場合:
      colorTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、 context および initcolorFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、12 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      colorTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、 context および initcolorFormatviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_CUBE_MAP texture として作成されます。
  20. layerdepthStencilTextures を、この XRCubeLayerrelevant realm 内の new array とします。

  21. layermotionVectorTextures を、この XRCubeLayerrelevant realm 内の new array とします。

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

    1. contextWebGL2RenderingContext でなく、かつ WEBGL_depth_texture extensioncontext 内で有効化されていない場合、 TypeError を投げ、これらの手順を中止します。

    2. layerlayout"mono" である場合:

      textureType"texture-array" である場合:
      depthStencilTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、6 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      depthStencilTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_CUBE_MAP texture として作成されます。
    3. それ以外の場合で、layerlayout"stereo" である場合:

      textureType"texture-array" である場合:
      depthStencilTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 1 個で初期化します。これは、context および initdepthFormatmipLevelsviewPixelWidth および viewPixelHeight 値を使用して、12 レイヤーを持つ TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      depthStencilTextures を、この XRCubeLayerrelevant realm 内の new opaque texture インスタンス 2 個で初期化します。これは、context および initdepthFormatviewPixelWidth および viewPixelHeight 値を使用して、TEXTURE_CUBE_MAP texture として作成されます。
  23. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止します。

  24. layer を返します。

textureType"texture-array" を使用する場合、XRCubeLayer は、 cube map の面を格納するために、次の順序で 6 個の texture layer を使用しなければなりません: [TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z]

textureType"texture-array" を使用し、かつ layout"stereo" を使用する場合、左眼のコンテンツは layer index 0 から格納しなければならず、右眼のコンテンツは layer index 6 から格納しなければなりません。

cubemap サイズが どのように決定されるかを定義する。

space はどのように 扱うべきか。cubemap の端まで歩いて行けるのか?

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

XRCompositionLayer layer および XRFrame frame のパラメーターを持つ XRWebGLBinding bindingvalidate the state of the XRWebGLSubImage creation function を実行するには、ユーザーエージェントは次の手順を 実行しなければなりません:

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

  2. frameactive boolean が false の場合、 false を返し、これらの手順を中止します。

  3. frameanimationFrame boolean が false の場合、 false を返し、これらの手順を中止します。

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

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

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

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

  8. true を返します。

opaque texture textureXRLayerLayout layout、integer offset および integer num を用いて、XRViewport viewportinitialize the 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 を、new された XRWebGLSubImage とし、関連するレルムthis のものとする。
    subimageviewport を、new された XRViewport とし、関連するレルムthis のものとする。
  2. session を、thissession とする。

  3. layersessionlayers 配列内にない場合、TypeError を投げ、これらの手順を中止する。

  4. layer の型が XRProjectionLayer である場合、TypeError を投げ、これらの手順を中止する。

  5. layerlayout 属性が "default" である場合、TypeError を投げ、これらの手順を中止する。

  6. index0 とする。

  7. layerlayout 属性が "stereo" である場合:

    1. eye"none" である場合、TypeError を投げ、これらの手順を中止する。

    2. eye"right" である場合:

      layerXRCubeLayer 型である場合
      index6 に設定する
      それ以外の場合
      index1 に設定する
  8. layer および frame を用いて XRWebGLSubImage 作成関数の状態を検証するfalse である場合、InvalidStateError を投げ、これらの手順を中止する。

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

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

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

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

  13. subimagecolorTextureWidth を、subimagecolorTexture のピクセル幅に設定する。

  14. subimagecolorTextureHeight を、subimagecolorTexture のピクセル高さに設定する。

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

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

  17. viewsPerTexture1 とする。

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

  19. subimageviewport に対して、subimagecolorTexturelayerlayoutindex および viewsPerTexture を用いて、viewport を初期化する を実行する。

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

  21. subimage を返す。

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

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

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

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

  3. session を、thissession とする。

  4. layer および frame を用いて XRWebGLSubImage 作成関数の状態を検証するfalse である場合、InvalidStateError を投げ、これらの手順を中止する。

  5. layersessionlayers 配列内にない場合、TypeError を投げ、これらの手順を中止する。

  6. viewactive フラグが false である場合、InvalidStateError を投げ、これらの手順を中止する。

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

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

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

    view が、sessionビューのリスト に含まれる セカンダリビュー である場合
    subimagecolorTexture を、layerセカンダリビュー用の colorTextures のオフセット index の要素で初期化する。
    そうではなく、layerlayout"default" であり、かつ layer が textureType "texture" で作成されていた場合
    subimagecolorTexture を、layercolorTextures 配列のオフセット index の要素で初期化する。
    それ以外の場合
    subimagecolorTexture を、layercolorTextures 配列の最初の要素で初期化する。
  10. subimagedepthStencilTexture を次のように初期化する:

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

    layermotionVectorTextures が空の配列である、または viewsessionビューのリスト に含まれる セカンダリビュー である場合
    subimagemotionVectorTexturenull で初期化する。
    そうではなく layer が textureType "texture" で作成されていた場合
    subimagemotionVectorTexture を、layermotionVectorTextures 配列のオフセット index の要素で初期化する。
    それ以外の場合
    subimagemotionVectorTexture を、layermotionVectorTextures 配列の最初の要素で初期化する。
  12. subimagecolorTextureWidth を、subimagecolorTexture のピクセル幅に設定する。

  13. subimagecolorTextureHeight を、subimagecolorTexture のピクセル高さに設定する。

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

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

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

  17. subimageviewport に対して、subimagecolorTexturelayerlayoutindex および sessionビューのリスト の数を用いて、viewport を初期化する を実行する。

  18. needsRedrawfalse に設定する。

  19. subimage を返す

注: session は、getSubImage() および getViewSubImage() の呼び出しを、体験が WebGL を用いて描画を開始する時点まで遅延させるよう試みるべきです。 典型的には、それはゲームロジックの実行後になります。一部のユーザーエージェントでは、CPU 依存コードと GPU 依存コードに個別の段階を持たせることで、システムリソースを動的に最適化できます。

foveateBoundTexture(GLenum target, float fixed_foveation) は、現在バインドされている texture または texture array に foveation を適用します。

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

  1. targetTEXTURE_2D または TEXTURE_2D_ARRAY 型でない場合、InvalidStateError を投げ、これらの手順を中止します。

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

  3. fixed_foveation0 未満である場合、それを 0 に設定します。

  4. fixed_foveation1 より大きい場合、それを 1 に設定します。

  5. bindingcontext 内で target に texture がバインドされていない場合、InvalidStateError を投げ、これらの手順を中止します。

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

  7. bindingcontext を使用して target にバインドされた texture を、foveatedTextures に追加します。

注: foveation の効果は 直ちに反映されます。

XRLayerlayers array のメンバーである場合、前回の XR animation frame 以降に次の少なくとも 1 つが発生している場合に限り、XR animation frame が完了した直後に、それを immersive XR device に提示しなければなりません:

opaque framebuffer または colorTexture texture が immersive XR device に提示される前に、ユーザーエージェントはすべての rendering operations が flush されていることを保証しなければなりません。

7. Video layer の作成

7.1. XRMediaLayerInit

XRMediaLayerInit dictionary は、video を含む XRCompositionLayer がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary XRMediaLayerInit {
  required XRSpace space;
  XRLayerLayout layout = "mono";
  boolean invertStereo = false;
};

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

layout 属性は、XRCompositionLayer 内の video のレイアウトを定義します。

invertStereo 属性は、video 内の各 view の 自然な位置を反転すべきかどうかを定義します。

7.2. XRMediaQuadLayerInit

XRMediaQuadLayerInit dictionary は、video を含む XRQuadLayer がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary XRMediaQuadLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float? width;
  float? height;
};

7.3. XRMediaCylinderLayerInit

XRMediaCylinderLayerInit dictionary は、video を含む XRCylinderLayer がどのように初期化されるかを記述する、設定可能な値の集合を表します。
dictionary XRMediaCylinderLayerInit : XRMediaLayerInit {
  XRRigidTransform? transform;
  float 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 layer が、HTMLVideoElement media とともにレンダリングされる必要がある場合、ユーザーエージェントは次の手順を 実行しなければなりません:
  1. usability を、mediausability を確認した結果とします。

  2. usabilitybad である場合、layer を transparent black で塗りつぶし、これらの手順を中止します。

  3. layermedia 要素のコンテンツで塗りつぶします。

描画を記述するよりよい アルゴリズムを追加する。

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

  1. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  2. sessionimmersive session でない場合、InvalidStateError を投げ、これらの手順を中止します。

  3. binding を、sessionrelevant realm 内の new XRMediaBinding とします。

  4. bindingsessionsession に初期化します。

  5. binding を返します。

HTMLVideoElement videoXRLayerLayout layoutcalculate the aspect ratio を実行するには、次の手順を実行します:
  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. session を、thissession とします。

  2. session が "layers" を有効にして作成されていなかった場合、NotSupportedError を投げ、これらの手順を中止します。

  3. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. initlayout"default" である場合、TypeError を投げ、これらの手順を中止します。

  5. layer を、thisrelevant realm 内の new XRQuadLayer とします。

  6. layer に対して、session を指定して initialize a composition layer を実行します。

  7. layermediavideo に初期化します。

  8. layerneedsRedrawfalse に初期化します。

  9. aspectRatio を、video および initlayout を指定して calculate the aspect ratio した結果とします。

  10. initwidth および heightundefined である場合、width1 に設定します。

  11. initheightundefined である場合、heightwidthaspectRatio で割った値に設定します。

  12. initwidthundefined である場合、widthheightaspectRatio を掛けた値に設定します。

  13. layer および init を指定して initialize a quad layer を実行します。

  14. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止します。

  15. layer を返します。

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

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

  1. session を、thissession とします。

  2. session が "layers" を有効にして作成されていなかった場合、NotSupportedError を投げ、これらの手順を中止します。

  3. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. initlayout"default" である場合、TypeError を投げ、これらの手順を中止します。

  5. layer を、thisrelevant realm 内の new XRCylinderLayer とします。

  6. layer に対して、session を指定して initialize a composition layer を実行します。

  7. layermediavideo に初期化します。

  8. layerneedsRedrawfalse に初期化します。

  9. aspectRatio を、video および initlayout を指定して calculate the aspect ratio した結果とします。

  10. initaspectRatioundefined である場合、aspectRatioaspectRatio に設定します。

  11. layer および init を指定して initialize a cylinder layer を実行します。

  12. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止します。

  13. layer を返します。

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

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

  1. session を、thissession とします。

  2. session が "layers" を有効にして作成されていなかった場合、NotSupportedError を投げ、これらの手順を中止します。

  3. sessionended 値が true である場合、InvalidStateError を投げ、これらの手順を中止します。

  4. initlayout"default" である場合、TypeError を投げ、これらの手順を中止します。

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

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

  7. layer を、thisrelevant realm 内の new XREquirectLayer とします。

  8. layer に対して、session を指定して initialize a composition layer を実行します。

  9. layermediavideo に初期化します。

  10. layerneedsRedrawfalse に初期化します。

  11. layer および init を指定して initialize a equirect layer を実行します。

  12. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止します。

  13. layer を返します。

XREquirectLayer のパラメーターが video 表示にどのように影響するかを定義する。

8. Events

8.1. XRLayerEvent

XRLayerEvent は、XRLayer の状態の変化を示すために発火されます。

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

dictionary XRLayerEventInit : EventInit {
  required XRLayer layer;
};

layer 属性は、event を生成した XRLayer を示します。

8.2. Event Types

ユーザーエージェントは、次の新しい events を提供しなければなりません。events の登録と発火は、 DOM4 Events の通常の挙動に従わなければなりません。

ユーザーエージェントは、layer の underlying resources が失われた場合、または XR Compositor がその layer を再投影できなくなった場合、XRLayer オブジェクト上で redraw event を発火してもよいです。

作者は、次の XR animation frame で layer のコンテンツを再描画すべきです。event は XRLayerEvent 型でなければなりません。

9. Layers 間の depth sorting

デフォルトでは、layers 配列はレイヤーの合成順序を定義し、各レイヤーは前の レイヤーの上に描画される。 アプリケーションが深度によってソートされるレイヤーを持たせたい場合、 "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 Compositor の再投影を改善する技術である。 motionVectorTexturedepthStencilTexture とともに送信することで、XR Compositor は高品質なフレーム外挿と再投影を行うことができ、 これによりユーザーエージェントは低いフレームレートで実行しながらも、ユーザーに滑らかな体験を提供できる。 requestAnimationFrame() コールバックが配信されるレートは、ディスプレイのネイティブリフレッシュレートより低くなることがある。XR Compositor は、 体験によって提供されるモーションベクトルと深度情報を使用して、不足しているフレームを合成する。

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

space-warp 機能 記述子 が有効な場合、体験は、送信する各 XRProjectionLayer について、代表的な深度値を depthStencilTexture にレンダリングすべきである。 depthStencilTexturemotionVectorTexture は同じ寸法を持つが、その寸法は colorTexture の寸法とは異なる場合がある。 著者は depthStencilTextureWidth および depthStencilTextureHeight を使用して、深度/ステンシル添付およびモーションベクトル添付の両方の寸法を決定できる。 著者は、深度/ステンシルおよびモーションベクトル情報を、viewport ではなく、それらの添付全体にレンダリングすべきである。

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

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

motionVectorTexture または depthStencilTextureXRFrame の処理中に送信されなかった場合、 XR Compositor は、スペースワープ が有効でなかったかのように XRFrame を処理しなければならない。

11. WebXR Device API 統合

11.1. XRRenderState の変更

このモジュールは、XRRenderStateInit および XRRenderState interfaces を、layers という、XRLayer の instances を含む新しい optional array で拡張します。
[SecureContext, Exposed=Window] partial interface XRRenderState {
  readonly attribute FrozenArray<XRLayer> layers;
};

The layers 属性は、 XRLayer のインスタンスを含む配列を返す。これらは XR Compositor によって表示される。

デフォルトでは、layers 配列がレイヤーの合成順序を定義する。XR Compositor は、 配列内の位置の順に各レイヤーを source-over ブレンディングを使用して描画しなければならない。"depth-sorted-layers" 機能 記述子が有効でない限り、XR Compositor はレイヤーに対して深度ソートを適用してはならない。

注: これは、前のレイヤーが視聴者に仮想的に より近いかどうかにかかわらず、各レイヤーが前のレイヤーを上書きする可能性があることを意味する。

このモジュールは、render state を初期化するで与えられた手順を置き換える。 代わりに、XRRenderState オブジェクト stateXRSession session のために作成されるとき、ユーザーエージェントは次の手順を実行して render state を初期化するしなければならない:
  1. render state を初期化するための元の手順を実行して state を初期化する。

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

11.2. updateRenderState の変更

このモジュールは、WebXR 仕様の "pending layers state を更新する" で与えられた手順を置き換える。 代わりに、ユーザーエージェントが XRSession session および XRRenderStateInit newState を用いて pending layers state を更新するときは、次の手順を実行しなければならない:

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

  2. activeStatesessionactive render state とする。

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

    1. sessionpending render statenull の場合、 それを activeState のコピーに設定する。

    2. sessionpending render statelayersnull に設定する。

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

    1. session が "layers" を有効にして作成されておらず、かつ newStatelayers1 個を超えるインスタンスを含む場合、NotSupportedError を投げ、これらの手順を中止する。

    2. newStatelayersmaxRenderLayers 個を超える項目を含む場合、NotSupportedError を投げ、これらの手順を中止する。

    3. sessionpending render statenull の場合、 それを activeState のコピーに設定する。

    4. newStatelayers が重複するインスタンスを含む場合、TypeError を投げ、これらの手順を中止する。

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

      1. layerXRCompositionLayer であり、かつ layersessionsession と異なる場合、TypeError を投げ、これらの手順を中止する。

      2. layerXRWebGLLayer であり、かつ layersessionsession と異なる場合、TypeError を投げ、これらの手順を中止する。

    6. sessionpending render statebaseLayernull に設定する。

    7. sessionpending render statelayersnewStatelayers に設定する。

11.3. XRCompositor の変更

XR Compositor は、XRLayer のすべてのインスタンスが、layers 配列から同時に合成されるように拡張されなければならない。 WebXR に対するその他すべての要件は、 引き続き適用されなければならない。

XR Compositor が、XREye"none" である view にレンダリングしており、 XRProjectionLayer ではなく、かつ layout"mono" でない XRCompositionLayer を描画している場合、XR Compositor は、そのレイヤーを viewXREye として "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 仕様の "check the layers state" によって与えられる手順を置き換えます。 代わりに、renderState state を用いて check the layers state するには、ユーザーエージェントは次の手順を実行しなければなりません:
  1. statebaseLayernull でない場合、true を返します。

  2. statelayers が空でない場合、true を返します。

  3. false を返します。

11.6. XRSession の変更

このモジュールは、XRSession interface に対して次を拡張および追加します:
[SecureContext, Exposed=Window] partial interface XRSession {
  readonly attribute unsigned long maxRenderLayers;
};

maxRenderLayers は、compositor が処理しなければ ならない layers の最大数、したがって任意の XRRenderStateInitlayers array の最大サイズを表します。ある時点でこの数を超える layers を作成できるべきです。

注: このガイダンスは、Allocation of layers で説明されているような、ユーザーエージェントが割り当て可能な layers 数の制限を提供することを意図していません。User Agents は、たとえば 20 個の layers を作成できるようにしつつ、 updateRenderState() を通じて一度に設定できるのは 10 個だけにすることができます。また、異なる layers は異なる量の backend power または objects を必要とする可能性があるため、ユーザーエージェントには、少なくともその数の layers をレンダリング できることを保証するために `maxRenderLayers` 値を設定する裁量があることにも注意してください。ただし、ユーザーエージェントは、 より多くの layers が渡された場合は常に拒否する必要があり、より少ない layers が updateRenderState に渡された場合は 拒否できません。

XRSession は、その session で作成された各 XRWebGLBinding への弱参照を保持する内部 WeakSet bindings を持ちます。

このモジュールは、WebXR 仕様の "shut down the session" に手順を追加します。 次をリストに追加します:

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

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

    2. texture から foveation を削除します。

12. セキュリティおよびプライバシーに関する考慮事項

12.1. Composition のタイミング

Composition timing は、レンダリングされるコンテンツから独立していなければなりません。 さらに、ある layer 内のコンテンツは、他の layers で観測可能であってはなりません。

可能であれば、layers の composition は、timing attacks やその他のセキュリティ脆弱性のリスクを低減するために、 ブラウザー外で行われるべきです。

12.2. Layers の割り当て

ユーザーエージェントは、GPU hardware の識別可能性を低減するため、最大 pixel size や layers 数などの 任意の resource allocation に制限を設けてもよいです。

変更点

First Public Working Draft 3 December 2020 からの変更点

新機能:

変更:

適合性

文書の 慣例

適合性要件は、 記述的な表明と 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. Compositing and Blending Level 1. 2024年3月21日. CRD. URL: https://www.w3.org/TR/compositing-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. Geometry Interfaces Module Level 1. 2025年12月4日. CRD. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Dean Jackson; Jeff Gilbert. WebGL 2.0 Specification. 2017年8月12日. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2026年3月16日. CRD. URL: https://www.w3.org/TR/webxr/
[WEBXR-AR-MODULE-1]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Augmented Reality Module - Level 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 にどのように影響するかを定義する。