WebXR 照明推定 API レベル 1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-webxr-lighting-estimation-1-20251211/
最新公開バージョン:
https://www.w3.org/TR/webxr-lighting-estimation-1/
編集者草案:
https://immersive-web.github.io/lighting-estimation/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webxr-lighting-estimation-1/
フィードバック:
GitHub
編集者:
(Google)
元編集者:
([Mozilla 2020年まで])
参加:
課題を提出 (未解決の課題)
メーリングリストのアーカイブ
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 Lighting Estimation モジュールは、WebXR Device APIWebXR Augmented Reality Module、および WebXR Layers モジュールを拡張し、 ユーザー環境の照明条件の推定値を公開する機能を追加する。

2. 光プリミティブ

2.1. XRLightProbe

XRLightProbe は、ユーザー環境内の所定の点における推定照明情報を収集する。

[SecureContext, Exposed=Window]
interface XRLightProbe : EventTarget {
  readonly attribute XRSpace probeSpace;
  attribute EventHandler onreflectionchange;
};

probeSpace 属性は、XRSpace であり、XRLightProbe の 照明推定がそれに対して相対的に生成される位置および向きを追跡する native origin を持つ。

onreflectionchange 属性は、reflectionchange イベント型用の イベントハンドラー IDL 属性である。

2.2. XRReflectionFormat

enum XRReflectionFormat {
  "srgba8",
  "rgba16f",
};

反射キューブマップは、テクスチャデータがどのように表現されるかを示す内部反射形式を持ち、 アプリケーションがテクスチャをどのように使用するかに影響を与える場合がある。 キューブマップは、"srgba8" 形式、またはライトプローブの preferredReflectionFormat で要求してもよい。

XRReflectionFormat WebGL 形式 WebGL 内部形式 WebGPU 形式 HDR
"srgba8" RGBA SRGB8_ALPHA8 "rgba8unorm-srgb"
"rgba16f" RGBA RGBA16F "rgba16float"

2.3. XRLightEstimate

XRLightEstimate は、XRFrame によって表される時点における、XRLightProbe の推定照明値を提供する。XRLightEstimate は、 XRLightProbeXRFramegetLightEstimate() メソッドに渡すことで照会される。

[SecureContext, Exposed=Window]
interface XRLightEstimate {
  readonly attribute Float32Array sphericalHarmonicsCoefficients;
  readonly attribute DOMPointReadOnly primaryLightDirection;
  readonly attribute DOMPointReadOnly primaryLightIntensity;
};

sphericalHarmonicsCoefficients 属性は、9 個の球面調和関数係数を含む Float32Array を返す。この配列の長さは 27 要素でなければならず、各 3 要素が単一の係数の赤、緑、青成分を それぞれ定義する。sphericalHarmonicsCoefficients の最初の項、すなわち配列の最初の 3 要素は、有効な照明推定を表すものでなければならない。 その他すべての項は任意であり、ユーザーのプライバシー設定またはプラットフォームの能力により 対応する照明推定が利用できない場合、0 であってもよい。

sphericalHarmonicsCoefficients における係数の順序は、[C00, C1-1, C10, C11, C2-2, C2-1, C20, C21, C22] であり、ここで Clm は 球面調和関数 Ylm の係数である。

primaryLightDirection は、 XRLightEstimate を生成した XRLightProbeprobeSpacenative origin から見た、主光源への方向を表す。 値は単位長の 3D ベクトルでなければならず、w 値は 0.0 でなければならない。ユーザー環境からの推定値が利用できない場合、primaryLightDirection{ x: 0.0, y: 1.0, z: 0.0, w: 0.0 } でなければならず、これは上方から真下に照らす光を表す。

primaryLightIntensity は、 主光源の色を表す。値は、xy、 および z 値にそれぞれマップされた RGB 値を表さなければならず、各成分は 0.0 以上であり、w 値は 1.0 でなければならない。ユーザー環境からの推定値が利用できない場合、primaryLightIntensity{x: 0.0, y: 0.0, z: 0.0, w: 1.0} でなければならず、これは照明なしを表す。

3. WebXR Device API との統合

WebXR Device APIXRSession および XRFrame インターフェイスは、どちらもこのモジュールによって拡張される。

3.1. セッションの初期化

文字列 "light-estimation" は、このモジュールによって新しい有効な 機能記述子として導入される。照明推定機能を使用したいアプリケーションは、 "light-estimation" 機能 記述子を用いて要求されなければならない。

3.2. XRSession

XRSession インターフェイスは、新しい XRLightProbe インスタンスを作成する機能で拡張される。XRLightProbe インスタンスは、session オブジェクトを持つ。これは、この XRLightProbe を作成した XRSession である。また、reflection format オブジェクトを持つ。これは、ライトプローブが取得し得る XRReflectionFormat である。

XRSession インターフェイスはさらに、preferredReflectionFormat 属性で拡張され、これは基盤となる XR device によって最も近くサポートされる XRReflectionFormat を示す。

dictionary XRLightProbeInit {
  XRReflectionFormat reflectionFormat = "srgba8";
};

partial interface XRSession {
  Promise<XRLightProbe> requestLightProbe(optional XRLightProbeInit options = {});
  readonly attribute XRReflectionFormat preferredReflectionFormat;
};
requestLightProbe(options) メソッドが XRSession session 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. promise新しい Promise とする。

  2. light-estimation 機能記述子が session有効化された機能のリスト含まれていない場合、promiseNotSupportedError却下し、これらの手順を中止する。

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

    optionsreflectionFormat"srgba8" であるか、sessionpreferredReflectionFormat と一致する場合:
    1. probe を新しい XRLightProbe とする。

    2. probesessionsession に設定する。

    3. probereflection formatoptionsreflectionFormat に設定する。

    4. promiseprobe解決する。

    それ以外の場合
    1. promise を "NotSupportedError" DOMException却下する。

3.3. XRFrame

XRFrame インターフェイスは、所定の XRLightProbe について XRLightEstimate を照会する機能で拡張される。

partial interface XRFrame {
  XRLightEstimate? getLightEstimate(XRLightProbe lightProbe);
};
getLightEstimate(lightProbe) メソッドが XRFrame frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. frameactive ブール値が `false` の場合、InvalidStateError を投げ、これらの手順を中止する。

  2. sessionframesession オブジェクトとする。

  3. lightProbesessionsession と等しくない場合、 InvalidStateError を投げ、これらの手順を中止する。

  4. devicesessionXR device とする。

  5. device がこのフレームの照明を推定できない場合、null を返す。

  6. estimate を新しい XRLightEstimate とする。

  7. estimatesphericalHarmonicsCoefficients に、device によって提供される係数を設定する。

    device が光源の推定方向を持つ場合
    1. estimateprimaryLightDirection を光源の推定方向に設定する。

    それ以外の場合
    1. estimateprimaryLightDirection{ x: 0.0, y: 1.0, z: 0.0, w: 0.0 } に設定する。

    device が光源の推定強度を持つ場合
    1. estimateprimaryLightIntensity を光源の推定強度に設定する。

    それ以外の場合
    1. estimateprimaryLightIntensity{x: 0.0, y: 0.0, z: 0.0, w: 1.0} に設定する。

  8. estimate を返す。

4. WebXR Layers との統合

WebXR Layers モジュールXRWebGLBinding インターフェイスは、このモジュールによって拡張される。

4.1. XRWebGLBinding

XRWebGLBinding インターフェイスは、所定の XRLightProbe について反射キューブマップを照会する機能で拡張される。

partial interface XRWebGLBinding {
  WebGLTexture? getReflectionCubeMap(XRLightProbe lightProbe);
};
getReflectionCubeMap(lightProbe) メソッドが XRWebGLBinding binding 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. bindingcontext が失われている場合、InvalidStateError を投げ、これらの手順を中止する。

  2. sessionbindingsession とする。

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

  4. sessionlightProbesession と一致しない場合、InvalidStateError を投げ、これらの手順を中止する。

  5. devicesessionXR Device とする。

  6. device から利用可能な反射キューブマップがない場合、null を返す。

  7. lightProbereflection format によって指定された形式で、 device からのデータが設定された、新しい WebGLTexture cubemap を返す。

5. イベント

別途指定されない限り、この仕様でキューに入れられるタスクすべての タスクソースは、XR タスクソースである。

5.1. イベント型

ユーザーエージェントは、getReflectionCubeMap() を呼び出すことによって返されたキューブマップの内容が変更されるたびに、XRLightProbe オブジェクト上で、reflectionchange という名前のイベントを発火しなければならない。

6. プライバシーとセキュリティに関する考慮事項

照明推定 API は、Ambient Light Sensor API [AMBIENT-LIGHT] と多くの潜在的な プライバシーおよびセキュリティリスクを共有している。 これには以下が含まれる:

これらに加えて、照明推定に固有のいくつかのベクトルを 考慮する必要がある。

照明推定は、XR Session を作成するときに機能 記述子として宣言されなければならず、これによりユーザーエージェントは、 ウェブサイトによる照明推定 API の使用を許可することの潜在的なプライバシー上の影響について ユーザーに通知できる。ユーザーエージェントは、照明推定 API のいかなる部分にも、 特に反射キューブマップには、リアルタイム更新を提供しないことが推奨される。 既定では、低空間周波数および低時間周波数の情報のみが WebXR API によって返されるべきである。 反射キューブマップは、ユーザーが特定のオリジンに対してカメラ権限にも同意していない限り、 低解像度に保たれるべきである。さらなる緩和策として、Spherical Harmonics および主光源方向は量子化してもよい。

変更点

2021年9月9日 最初の 公開作業草案からの変更点

適合性

文書の 慣例

適合要件は、 記述的な表明と 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" を用いて、 次のように示される:

Note, これは情報提供の注記である。

適合 アルゴリズム

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

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

索引

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

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

参考文献

規範的参考文献

[AMBIENT-LIGHT]
Anssi Kostiainen; Rijubrata Bhaumik. Ambient Light Sensor. 2025年2月12日. WD. URL: https://www.w3.org/TR/ambient-light/
[DOM]
Anne van Kesteren. DOM 標準. Living Standard. URL: https://dom.spec.whatwg.org/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; et al. HTML 標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC における要件レベルを 示すために用いるキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Dean Jackson; Jeff Gilbert. WebGL 2.0 仕様. 2017年8月12日. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 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/

IDL 索引

[SecureContext, Exposed=Window]
interface XRLightProbe : EventTarget {
  readonly attribute XRSpace probeSpace;
  attribute EventHandler onreflectionchange;
};

enum XRReflectionFormat {
  "srgba8",
  "rgba16f",
};

[SecureContext, Exposed=Window]
interface XRLightEstimate {
  readonly attribute Float32Array sphericalHarmonicsCoefficients;
  readonly attribute DOMPointReadOnly primaryLightDirection;
  readonly attribute DOMPointReadOnly primaryLightIntensity;
};

dictionary XRLightProbeInit {
  XRReflectionFormat reflectionFormat = "srgba8";
};

partial interface XRSession {
  Promise<XRLightProbe> requestLightProbe(optional XRLightProbeInit options = {});
  readonly attribute XRReflectionFormat preferredReflectionFormat;
};

partial interface XRFrame {
  XRLightEstimate? getLightEstimate(XRLightProbe lightProbe);
};

partial interface XRWebGLBinding {
  WebGLTexture? getReflectionCubeMap(XRLightProbe lightProbe);
};

MDN

XRFrame/getLightEstimate

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightEstimate/primaryLightDirection

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightEstimate/primaryLightIntensity

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightEstimate/sphericalHarmonicsCoefficients

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightEstimate

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightProbe/probeSpace

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightProbe/reflectionchange_event

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightProbe/reflectionchange_event

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRLightProbe

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRSession/preferredReflectionFormat

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRSession/requestLightProbe

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

XRWebGLBinding/getReflectionCubeMap

In only one current engine.

FirefoxNoneSafariNoneChrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?