WebXR レイヤー API レベル 1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webxrlayers-1-20260122/
最新公開バージョン:
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 で有効になります。

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

deltaPose 属性は、 XR Compositor によって使用される foveation の量を制御します。ユーザーエージェントまたはデバイスがこの属性をサポートしない場合、または "space-warp" feature descriptor が要求されていなかった場合、取得時には null を返すべきであり、設定は no-op であるべきです。この属性は、 view に影響する、前の frame 以降に application によって適用された増分 transform があれば、 それを記述します。人工的な locomotion が発生すると、experience は frames 間で world 全体を 1 つの application pose から別の pose へ transform し、deltaPose には scene の world position の差分が設定されなければなりません。 deltaPose は、前の frame と現在の XRFrame の間に transformation がない場合、identity であるべきです。

3.6. XRQuadLayer

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

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

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 テクスチャのどの viewport を使用するかを表します。
[Exposed=Window] interface XRSubImage {
  [SameObject] readonly attribute XRViewport viewport;
};

注: このクラスは将来の拡張に対応するよう 設計されています

viewport 属性は、sub image をレンダリングするときに使用する XRViewport を返します。

5.2. XRWebGLSubImage

XRWebGLSubImage オブジェクトは、レイヤーのレンダリング中に使用されます。
[Exposed=Window] interface XRWebGLSubImage : XRSubImage {
  [SameObject] readonly attribute WebGLTexture colorTexture;
  [SameObject] readonly attribute WebGLTexture? depthStencilTexture;
  [SameObject] readonly attribute WebGLTexture? motionVectorTexture;

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

colorTexture 属性は、XRCompositionLayer に対する色 opaque texture を返します。

depthStencilTexture 属性は、 XRCompositionLayer に対する depth/stencil opaque texture を返します。 レイヤーが depth/stencil なしで作成された場合、この属性は null を返します。

motionVectorTexture 属性は、XRProjectionLayer に対する motion opaque texture を返します。 XRSessionspace-warp feature descriptor なしで作成された場合、またはレイヤーが XRProjectionLayer でない場合、この属性は null を返さなければなりません。

imageIndex 属性は、texture array 内のオフセットを返します。 texture-array とともに要求されたレイヤーに対してのみ有効です。

colorTextureWidth および depthStencilTextureHeight 属性は、GL depth アタッチメントのピクセル単位の幅と高さを返します

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

motionVectorTextureWidth および motionVectorTextureHeight 属性は、GL motion vector アタッチメントのピクセル単位の幅と高さを返します。 XRSessionspace-warp feature descriptor なしで作成された場合、またはレイヤーが XRProjectionLayer でない場合、これらの属性は null を返さなければなりません。

5.3. XRTextureType

XRTextureType enum は、割り当てられるテクスチャの型を定義します。
enum XRTextureType {
  "texture",
  "texture-array"
};

6. GPU レイヤーおよびビューの作成

6.1. 概要

レイヤーが作成されると、それは GPU リソース、典型的には Web プラットフォームのグラフィックス API の 1 つによって提供されるテクスチャによって裏付けられます。どの API がレイヤーの GPU リソースを 提供しているかを指定するために、対象 API に対する XRWebGLBinding が作成されなければなりません。 各グラフィックス API は、レイヤー作成で context を使用できるようになる前に満たす必要のある 固有の要件を持つことがあります。たとえば、 WebGLRenderingContext は、XRWebGLBinding インスタンスのコンストラクターに渡される前に、その xrCompatible フラグが設定されていなければなりません。

テクスチャの割り当てや取得など、XRSession とグラフィックス API の間のあらゆる相互作用は、この XRWebGLBinding インスタンスを通じて行われ、その相互作用の正確な仕組みは通常 API 固有です。これにより、 WebXR API の残りの部分はグラフィックス API に依存せず、将来のレンダリング技術の進歩に より容易に適応できます。

XRWebGLBinding インスタンスが取得されると、それを使用してさまざまな XRCompositionLayer を作成できます。 そのインスタンスによって作成されたレイヤーは、各フレームで関連付けられた GPU リソースを照会できるようになり、 それは一般にネイティブ API のテクスチャインターフェイスであることが期待されます。

各種レイヤー型は、XRWebGLBinding インスタンス上の create____Layer 系メソッドで作成されます。必要なグラフィックスリソースに関する情報、 たとえば depth buffer や alpha channel を割り当てるかどうかは、レイヤー作成時に渡され、 レイヤーの存続期間中は不変です。 このメソッドは関連付けられた XRCompositionLayer 型を返します。

XRSession が "layers" feature descriptor とともに作成された場合、それはすべてのレイヤー型をサポートしなければなりません。 レイヤー型がサポートされていない場合、その作成メソッドは例外を投げなければなりません。XRProjectionLayer は、"layers" feature descriptor とともに作成されたかどうかにかかわらず、すべての XRSession でサポートされなければなりません。

6.2. 不透明テクスチャ

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

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

opaque texture にアタッチされたバッファは、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 を用いて allocate depth textures for projection layers するには、ユーザーエージェントは次の手順を実行しなければなりません:

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

  2. contextlayercontext とします。

  3. sessionlayersession とします。

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

  5. contextWebGLRenderingContext であり、かつ WEBGL_depth_texture extensioncontext 内で有効化されていない場合、 array を返し、これらの手順を中止します。

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

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

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

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

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

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

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

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

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

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

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

    6. texturearray に追加します。

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

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

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

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

  16. array を返します。

XRProjectionLayer layer を用いて allocate motion vector textures for projection layers するには、ユーザーエージェントは次の手順を実行しなければなりません:

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

  2. contextlayercontext とします。

  3. sessionlayersession とします。

  4. session が "space-warp" feature descriptor とともに作成されていなかった場合、 array を返し、これらの手順を中止します。

  5. contextWebGLRenderingContext であり、かつ WEBGL_depth_texture extensioncontext 内で有効化されていない場合、 array を返し、これらの手順を中止します。

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

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

  8. width を、viewrecommended motion vector texture resolution の幅に scaleFactor を掛けたものとします。

  9. height を、viewrecommended motion vector texture resolution の高さに scaleFactor を掛けたものとします。

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

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

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

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

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

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

    6. texturearray に追加します。

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

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

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

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

  15. array を返します。

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を用いて allocate the color textures for the secondary views するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. contextlayercontext とします。

  2. sessionlayersession とします。

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

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

  5. 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 を次のように初期化します:

      textureType"texture-array" である場合:
      texture を、contextrelevant realm 内の new opaque texture のインスタンスとします。これは、 contexttextureFormatwidth および height を使用して、TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      texture を、contextrelevant realm 内の new opaque texture のインスタンスとします。これは、 contexttextureFormatwidth および height を使用して、TEXTURE_2D texture として作成されます。
    5. texture を何らかの理由で作成できなかった場合、OperationError を投げ、これらの手順を中止します。

    6. texturearray に追加します。

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

XRProjectionLayer layerXRTextureType textureTypeGLenum textureFormat、および float scaleFactor を用いて allocate the depth textures for the secondary views するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. contextlayercontext とします。

  2. sessionlayersession とします。

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

  4. contextWebGLRenderingContext であり、かつ WEBGL_depth_texture extensioncontext 内で有効化されていない場合、 array を返し、これらの手順を中止します。

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

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

  7. sessionlist of views 内の各 view について:

    1. viewsecondary view でない場合、継続します。

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

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

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

      textureType"texture-array" である場合:
      texture を、contextrelevant realm 内の new opaque texture のインスタンスとします。これは、 contexttextureFormatstencilwidth および height を使用して、TEXTURE_2D_ARRAY texture として作成されます。
      それ以外の場合
      texture を、contextrelevant realm 内の new opaque texture のインスタンスとします。これは、 contexttextureFormatstencilwidth および height を使用して、TEXTURE_2D texture として作成されます。
    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 を、thisrelevant realm 内の new XRProjectionLayer とします。

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

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

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

  7. layerisStaticfalse に初期化します。

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

    initdepthFormatfalse であり、かつ XR Compositor が depth values を使用する場合
    layerignoreDepthValuesfalse に初期化します
    それ以外の場合
    layerignoreDepthValuestrue に初期化します
  9. layerfixedFoveation0 に初期化します。

  10. layout を、inittextureTypecontext および "default" を指定して determining the layout attribute した結果とします。

  11. maximum scalefactor を、sessioncontext および layout を指定して determining the maximum scalefactor した結果とします。

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

  13. layerlayoutlayout に初期化します。

  14. layerneedsRedrawtrue に初期化します。

  15. layercolorTextures を、layerinittextureTypeinitcolorFormat および initscaleFactor を指定して allocating color textures for projection layers した結果とします。

  16. layerdepthStencilTextures を、layerinittextureTypeinitdepthFormat および initscaleFactor を指定して allocating depth textures for projection layers した結果とします。

  17. layermotionVectorTextures を、layerinitdepthFormat および initscaleFactor を指定して allocating motion vector textures for projection layers した結果とします。

  18. colortextures for secondary views を次のように初期化します:

    session が "secondary-views" を有効にして作成された場合
    colortextures for secondary views を、layerinittextureTypeinitcolorFormat および initscaleFactor を指定して allocate the color textures for the secondary views した結果とします。
    それ以外の場合
    colortextures for secondary viewsnull とします。
  19. depthstenciltextures for secondary views を次のように初期化します:

    session が "secondary-views" を有効にして作成された場合
    depthstenciltextures for secondary views を、layerinittextureTypeinitdepthFormat および initscaleFactor を指定して allocate the depth textures for the secondary views した結果とします。
    それ以外の場合
    depthstenciltextures for secondary viewsnull とします。
  20. XR Compositor が、何らかの理由で layer 用の リソースを作成できないことを知っている場合、OperationError を投げ、これらの手順を中止します。

  21. layer を返します。

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

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

  1. session を、thissession とします。

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

  3. context を、thiscontext とします。

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

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

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

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

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

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

  10. layout を、inittextureTypecontext および initlayout を指定して determining the layout attribute した結果とします。

  11. layerlayoutlayout に初期化します。

  12. layerneedsRedrawtrue に初期化します。

  13. layercolorTextures を、layerinittextureType および init を指定して allocating color textures した結果とします。

  14. layerdepthStencilTextures を、layerinittextureType および init を指定して allocating depth textures した結果とします。

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

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

  17. layer を返します。

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

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

  1. session を、thissession とします。

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

  3. context を、thiscontext とします。

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

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

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

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

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

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

  10. layout を、inittextureTypecontext および initlayout を指定して determining the layout attribute した結果とします。

  11. layerlayoutlayout に初期化します。

  12. layerneedsRedrawtrue に初期化します。

  13. layercolorTextures を、layerinittextureType および init を指定して allocating color textures した結果とします。

  14. layerdepthStencilTextures を、layerinittextureType および init を指定して allocating depth textures した結果とします。

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

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

  17. layer を返します。

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

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

  1. session を、thissession とします。

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

  3. context を、thiscontext とします。

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

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

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

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

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

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

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

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

  12. layout を、inittextureTypecontext および initlayout を指定して determining the layout attribute した結果とします。

  13. layerlayoutlayout に初期化します。

  14. layerneedsRedrawtrue に初期化します。

  15. layercolorTextures を、layerinittextureType および init を指定して allocating color textures した結果とします。

  16. layerdepthStencilTextures を、layerinittextureType および init を指定して allocating depth textures した結果とします。

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

  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 を、thisrelevant realm 内の new XRWebGLSubImage とします。
    subimageviewport を、thisrelevant realm 内の new XRViewport とします。
  2. session を、thissession とします。

  3. layersessionlayers array 内にない場合、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 を指定して validate the state of the XRWebGLSubImage creation function した結果が false である場合、InvalidStateError を投げ、これらの手順を中止します。

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

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

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

    layerdepthStencilTextures が空の array である場合
    subimagedepthStencilTexturenull で初期化します。
    それ以外の場合で、layer"texture" の textureType で作成されていた場合
    subimagedepthStencilTexture を、layerdepthStencilTextures array のオフセット index にある要素で 初期化します。
    それ以外の場合
    subimagedepthStencilTexture を、layerdepthStencilTextures array の最初の要素で初期化します。
  12. subimagemotionVectorTexturemotionVectorTextureWidth および motionVectorTextureHeightnull で初期化します。

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

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

  15. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureWidth を、depthStencilTexture array 内の最初の texture のピクセル幅に設定します。

  16. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureHeight を、depthStencilTexture array 内の最初の texture のピクセル高さに設定します。

  17. viewsPerTexture1 とします。

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

  19. subimageviewport に対して、subimagecolorTexturelayerlayoutindex および viewsPerTexture を指定して initialize the viewport を実行します。

  20. needsRedrawfalse に設定するために、task をキューに入れます

  21. subimage を返します。

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

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

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

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

  3. session を、thissession とします。

  4. layer および frame を指定して validate the state of the XRWebGLSubImage creation function した結果が false である場合、InvalidStateError を投げ、これらの手順を中止します。

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

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

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

    view が、sessionlist of views からの secondary view である場合
    index を、primary views を除いた sessionlist of views 内における viewview のオフセットとします。
    それ以外の場合
    index を、secondary views を除いた sessionlist of views 内における viewview のオフセットとします。
  8. subimageimageIndex を次のように初期化します:

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

    view が、sessionlist of views からの secondary view である場合
    subimagecolorTexture を、layercolorTextures for secondary views のオフセット index にある要素で初期化します。
    それ以外の場合で、layerlayout"default" であり、かつ layer"texture" の textureType で作成されていた場合
    subimagecolorTexture を、layercolorTextures array のオフセット index にある要素で 初期化します。
    それ以外の場合
    subimagecolorTexture を、layercolorTextures array の最初の要素で 初期化します。
  10. subimagedepthStencilTexture を次のように初期化します:

    layerdepthStencilTextures が空の array である場合
    subimagedepthStencilTexturenull で初期化します。
    それ以外の場合で、view が、sessionlist of views からの secondary view である場合
    subimagecolorTexture を、layerdepthStencilTextures for secondary views のオフセット index にある要素で初期化します。
    それ以外の場合で、layerlayout"default" であり、かつ layer"texture" の textureType で作成されていた場合
    subimagedepthStencilTexture を、layerdepthStencilTextures array のオフセット index にある要素で 初期化します。
    それ以外の場合
    subimagedepthStencilTexture を、layerdepthStencilTextures array の最初の要素で 初期化します。
  11. subimagemotionVectorTexture を次のように初期化します:

    layermotionVectorTextures が空の array であるか、または viewsessionlist of views からの secondary view である場合
    subimagemotionVectorTexturenull で初期化します。
    それ以外の場合で、layer"texture" の textureType で作成されていた場合
    subimagemotionVectorTexture を、layermotionVectorTextures array のオフセット index にある要素で 初期化します。
    それ以外の場合
    subimagemotionVectorTexture を、layermotionVectorTextures array の最初の要素で初期化します。
  12. subimagecolorTextureWidth を、subimagecolorTexture のピクセル幅に設定します。

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

  14. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureWidth を、depthStencilTexture array 内の最初の texture のピクセル幅に設定します。

  15. subimagedepthStencilTexturenull でない場合、subimagedepthStencilTextureHeight を、depthStencilTexture array 内の最初の texture のピクセル高さに設定します。

  16. subimagemotionVectorTexturenull でない場合、subimagemotionVectorTextureWidth を、motionVectorTexture array 内の最初の texture のピクセル幅に設定します。

  17. subimagemotionVectorTexturenull でない場合、subimagemotionVectorTextureHeight を、motionVectorTexture array 内の最初の texture のピクセル高さに設定します。

  18. subimageviewport に対して、subimagecolorTexturelayerlayoutindex および sessionlist of views の数を指定して、initialize the viewport を実行します。

  19. needsRedrawfalse に設定します。

  20. 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 array が layers の composition の順序を定義し、各 layer は前の layer の上に描画されます。 アプリケーションが depth で sorted される layers を持ちたい場合、"depth-sorted-layers" feature descriptor を指定して session を要求しなければなりません。

XRSession が "depth-sorted-layers" feature descriptor で作成された場合、XRProjectionLayerXRQuadLayer および XRCylinderLayer layers は、layers array 内の位置ではなく、それらの depth に基づいて表示されなければなりません。 その他の layer types は、以前と同様に sorted され続けなければなりません。

XRQuadLayer および XRCylinderLayer layers は、それらの dimensions(たとえば width または centralAngle)、 transform および space によって sorted されなければなりません。

XRProjectionLayer layers は、それらの depthStencilTexture 内の値に従って sorted されなければなりません。これは、"depth-sorted-layers" が有効な場合、XR Compositor は depth values を使用しなければならず、ignoreDepthValues および usesDepthValues は `true` に設定されなければならないことも意味します。

10. Space warp

Space warp は、 XR Compositor の reprojection を改善する技術です。 motionVectorTexturedepthStencilTexture とともに送信することで、XR Compositor は高品質な frame extrapolation と reprojection を行うことができ、ユーザーエージェントは低い framerate で動作しつつも、ユーザーに滑らかな experience を提供できます。

space warp を有効にするには、 XRSession は "space-warp" feature descriptor で作成されなければなりません。 "space-warp" が有効な場合、XR Compositor は depth values を使用しなければならず、ignoreDepthValues は `false` に設定されなければならず、usesDepthValues は `true` に設定されなければなりません。

motionVectorTextureRGBA16F format でなければなりません。作者は、この texture の RGB components に、その領域の meters per second 単位の速度を埋めるべきです。red pixel は x axis、green は y axis、blue は z axis に対応します。

11. WebXR Device API 統合

11.1. XRRenderState の変更

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

layers 属性は、XR Compositor によって表示される XRLayer の instances を含む array を返します。

既定では、layers array が layers の composition の順序を定義します。XR Compositor は、 source-over blending を用いて、array 内の位置の順に 各 layer を描画しなければなりません。"depth-sorted-layers" feature descriptor が有効でない限り、XR Compositor は layers にいかなる depth sorting も適用してはなりません。

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

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

  2. statelayers を、sessionrelevant realm 内の new empty array で初期化します。

11.2. updateRenderState の変更

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

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

  2. activeState を、sessionactive render state とします。

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

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

    2. sessionpending render statelayersnull に設定します。

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

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

    2. newStatelayersmaxRenderLayers entries を超えて含む場合、NotSupportedError を投げ、これらの手順を中止します。

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

    4. newStatelayers が重複する instances を含む場合、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 は、layers array からのすべての XRLayer instances が同時に合成されるように拡張されなければなりません。WebXR に対する他のすべての 要件は、引き続き適用されなければなりません。

XR Compositor が、XREye"none" である view に レンダリングしており、かつ XRCompositionLayer を描画していて、それが XRProjectionLayer ではなく、かつ layout"mono" でない場合、XR Compositor は、その viewXREye"left" を持つかのように、その layer をレンダリングしなければなりません。

注: これは、layer の右眼側が無視されることを 意味します。これにより、作者は stereoscopic および monoscopic devices に同じ assets を使用できます。

11.4. XRView の変更

view は、view を 収めるのに十分な大きさの WebGL texture resolution の最良推定値を表す recommended WebGL color texture resolution を 定義しなければなりません。

XRSession が "space-warp" feature descriptor で作成された場合、各 view は、recommended WebGL color texture resolution に基づく recommended motion vector texture resolution を定義しなければなりません。

view は、 recommended WebGL color texture resolution および recommended motion vector texture resolution に基づく recommended WebGL depth texture resolution も 定義しなければなりません。ユーザーエージェントは、"space-warp" が有効な場合、 recommended WebGL depth texture resolution を削減することを決定してもよいです。

"depth-sorted-layers" feature descriptor が有効な場合、recommended WebGL depth texture resolutionrecommended WebGL color texture resolution と等しくなければなりません。

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. 2025年10月1日. 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;
  readonly attribute unsigned long? motionVectorTextureWidth;
  readonly attribute unsigned long? motionVectorTextureHeight;
};

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 にどのように影響するかを定義する。