1. はじめに
WebXR Lighting Estimation モジュールは、WebXR Device API、 WebXR 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
は、
XRLightProbe
を XRFrame
の
getLightEstimate()
メソッドに渡すことで照会される。
[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
を生成した XRLightProbe
の probeSpace
の native
origin から見た、主光源への方向を表す。
値は単位長の 3D ベクトルでなければならず、w
値は 0.0 でなければならない。ユーザー環境からの推定値が利用できない場合、primaryLightDirection
は { x: 0.0, y: 1.0, z: 0.0, w: 0.0 } でなければならず、これは上方から真下に照らす光を表す。
primaryLightIntensity は、
主光源の色を表す。値は、x、
y、
および 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 API の XRSession
および 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 = "srgba8"; };reflectionFormat partial interface XRSession {Promise <XRLightProbe >requestLightProbe (optional XRLightProbeInit = {});options readonly attribute XRReflectionFormat ; };preferredReflectionFormat
requestLightProbe(options) メソッドが
XRSession
session 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
promise を新しい Promise とする。
-
light-estimation 機能記述子が session の 有効化された機能のリストに含まれていない場合、promise を
NotSupportedErrorで却下し、これらの手順を中止する。 -
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止する。- options の
reflectionFormatが"srgba8"であるか、session のpreferredReflectionFormatと一致する場合: -
-
probe を新しい
XRLightProbeとする。 -
probe の session を session に設定する。
-
probe の reflection format を options の
reflectionFormatに設定する。 -
promise を probe で解決する。
-
- それ以外の場合
-
-
promise を "
NotSupportedError"DOMExceptionで却下する。
-
- options の
3.3. XRFrame
XRFrame
インターフェイスは、所定の XRLightProbe
について XRLightEstimate
を照会する機能で拡張される。
partial interface XRFrame {XRLightEstimate ?getLightEstimate (XRLightProbe ); };lightProbe
getLightEstimate(lightProbe) メソッドが
XRFrame
frame 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
frame の active ブール値が `false` の場合、
InvalidStateErrorを投げ、これらの手順を中止する。 -
session を frame の
sessionオブジェクトとする。 -
lightProbe の session が session と等しくない場合、
InvalidStateErrorを投げ、これらの手順を中止する。 -
device を session の XR device とする。
-
device がこのフレームの照明を推定できない場合、null を返す。
-
estimate を新しい
XRLightEstimateとする。 -
estimate の
sphericalHarmonicsCoefficientsに、device によって提供される係数を設定する。- device が光源の推定方向を持つ場合
-
-
estimate の
primaryLightDirectionを光源の推定方向に設定する。
-
- それ以外の場合
-
-
estimate の
primaryLightDirectionを{ x: 0.0, y: 1.0, z: 0.0, w: 0.0 }に設定する。
-
- device が光源の推定強度を持つ場合
-
-
estimate の
primaryLightIntensityを光源の推定強度に設定する。
-
- それ以外の場合
-
-
estimate の
primaryLightIntensityを{x: 0.0, y: 0.0, z: 0.0, w: 1.0}に設定する。
-
-
estimate を返す。
4. WebXR Layers との統合
WebXR Layers モジュールの XRWebGLBinding
インターフェイスは、このモジュールによって拡張される。
4.1. XRWebGLBinding
XRWebGLBinding
インターフェイスは、所定の XRLightProbe
について反射キューブマップを照会する機能で拡張される。
partial interface XRWebGLBinding {WebGLTexture ?getReflectionCubeMap (XRLightProbe ); };lightProbe
getReflectionCubeMap(lightProbe)
メソッドが XRWebGLBinding
binding 上で呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
binding の context が失われている場合、
InvalidStateErrorを投げ、これらの手順を中止する。 -
session を binding の session とする。
-
session の
ended値がtrueの場合、InvalidStateErrorを投げ、これらの手順を中止する。 -
session が lightProbe の session と一致しない場合、
InvalidStateErrorを投げ、これらの手順を中止する。 -
device を session の XR Device とする。
-
device から利用可能な反射キューブマップがない場合、
nullを返す。 -
lightProbe の reflection format によって指定された形式で、 device からのデータが設定された、新しい
WebGLTexturecubemap を返す。
5. イベント
別途指定されない限り、この仕様でキューに入れられるタスクすべての タスクソースは、XR タスクソースである。
5.1. イベント型
ユーザーエージェントは、getReflectionCubeMap()
を呼び出すことによって返されたキューブマップの内容が変更されるたびに、XRLightProbe
オブジェクト上で、reflectionchange という名前のイベントを発火しなければならない。
6. プライバシーとセキュリティに関する考慮事項
照明推定 API は、Ambient Light Sensor API [AMBIENT-LIGHT] と多くの潜在的な プライバシーおよびセキュリティリスクを共有している。 これには以下が含まれる:
-
プロファイリング: Lighting Estimation は、ユーザーの使用パターンおよび周囲環境に関する情報を漏えいする可能性がある。 この情報は、ユーザープロファイリングおよび行動分析を強化するために使用され得る。
-
クロスデバイスリンク: 2 つのデバイスが、時間経過に伴う照明レベルを相関させる 同じサードパーティスクリプトを含むウェブサイトにアクセスできる。
-
クロスデバイス通信: 単純なブロードキャスト通信方法は、デバイス画面または カメラ LED の点滅を使用して、近くのデバイス上の照明推定で読み取られるメッセージを ブロードキャストできる。
これらに加えて、照明推定に固有のいくつかのベクトルを 考慮する必要がある。
-
WebXR API によって返される照明推定は、ユーザーの近傍にある現実世界環境を 明示的に記述する。
-
十分に高い解像度の反射キューブマップは、カメラアクセスと同じレベルに近づく。
照明推定は、XR Session を作成するときに機能 記述子として宣言されなければならず、これによりユーザーエージェントは、 ウェブサイトによる照明推定 API の使用を許可することの潜在的なプライバシー上の影響について ユーザーに通知できる。ユーザーエージェントは、照明推定 API のいかなる部分にも、 特に反射キューブマップには、リアルタイム更新を提供しないことが推奨される。 既定では、低空間周波数および低時間周波数の情報のみが WebXR API によって返されるべきである。 反射キューブマップは、ユーザーが特定のオリジンに対してカメラ権限にも同意していない限り、 低解像度に保たれるべきである。さらなる緩和策として、Spherical Harmonics および主光源方向は量子化してもよい。