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)
이전 편집자:
([2020년까지 Mozilla])
참여:
이슈 제출 (열려 있는 이슈)
메일링 리스트 아카이브
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 조명 추정 모듈은 WebXR Device API, WebXR 증강 현실 모듈, 그리고 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

XRLightEstimateXRFrame이 나타내는 시점의 XRLightProbe에 대한 추정 조명 값을 제공한다. XRLightEstimateXRLightProbeXRFramegetLightEstimate() 메서드에 전달하여 질의한다.

[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의 계수다.

primaryLightDirectionXRLightEstimate를 생성한 XRLightProbeprobeSpacenative origin에서 주 광원으로 향하는 방향을 나타낸다. 값은 단위 길이 3D 벡터여야 하며, w 값은 0.0이어야 한다. 사용자 환경에서 추정값을 사용할 수 없는 경우 primaryLightDirection{ x: 0.0, y: 1.0, z: 0.0, w: 0.0 }이어야 하며, 이는 위에서 곧장 아래로 비추는 빛을 나타낸다.

primaryLightIntensity는 주 광원의 색을 나타낸다. 값은 RGB 값을 각각 x, y, 그리고 z 값에 매핑한 것을 나타내야 하며, 각 성분은 0.0 이상이고 w 값은 1.0이어야 한다. 사용자 환경에서 추정값을 사용할 수 없는 경우 primaryLightIntensity{x: 0.0, y: 0.0, z: 0.0, w: 1.0}이어야 하며, 이는 조명이 없음을 나타낸다.

3. WebXR Device API 통합

WebXR Device APIXRSessionXRFrame 인터페이스는 이 모듈에 의해 확장된다.

3.1. 세션 초기화

문자열 "light-estimation"은 이 모듈에서 새로운 유효한 feature descriptor로 도입된다. 조명 추정 기능을 사용하려는 애플리케이션은 "light-estimation" feature descriptor와 함께 요청되어야 한다.

3.2. XRSession

XRSession 인터페이스는 새로운 XRLightProbe 인스턴스를 생성할 수 있는 기능으로 확장된다. XRLightProbe 인스턴스에는 이 XRLightProbe를 생성한 XRSessionsession 객체가 있다. 그리고 라이트 프로브가 가져올 수 있는 XRReflectionFormatreflection format 객체가 있다.

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 기능 기술자가 sessionlist of enabled features포함되어 있지 않으면, 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. device가 제공한 계수로 estimatesphericalHarmonicsCoefficients를 채운다.

    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을 생성할 때 feature descriptor로 선언되어야 하며, 이를 통해 사용자 에이전트는 웹사이트가 조명 추정 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]

이 사양의 예제는 “예를 들어”라는 말로 도입되거나 class="example"으로 규범 텍스트와 구분되어 표시된다. 다음과 같다:

이는 정보 제공용 예제의 예다.

정보 제공용 참고는 “참고”라는 말로 시작하며 class="note"로 규범 텍스트와 구분되어 표시된다. 다음과 같다:

참고, 이는 정보 제공용 참고다.

준수 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "선행 공백 문자를 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")은 알고리즘을 도입할 때 사용된 핵심어 ("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 Standard. 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 Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[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/

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?