Name String
XR_ANDROID_light_estimation
Extension Type
Instance extension
Registered Extension Number
701
Revision
1
Extension and Version Dependencies
Last Modified Date
2025-01-17
IP Status
No known IP claims.
Contributors
Jared Finder, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Nihav Jain, Google
Salar Khan, Google
Scott Chung, Google
Overview
This extension allows the application to request data representing the lighting of the real-world environment around the headset. This information can be used when rendering virtual objects to light them under the same conditions as the scene they're placed in.
Inspect system capability
An application can inspect whether the system supports light estimation by chaining an XrSystemLightEstimationPropertiesANDROID structure to the XrSystemProperties when calling xrGetSystemProperties.
typedef struct XrSystemLightEstimationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsLightEstimation;
} XrSystemLightEstimationPropertiesANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
- supportsLightEstimationis an- XrBool32, indicating if the current system supports light estimation.
An application can inspect whether the system is capable of supporting light estimation by extending the XrSystemProperties with XrSystemLightEstimationPropertiesANDROID structure when calling xrGetSystemProperties.
If the system is not capable of supporting light estimation, then it will return
XR_FALSE for supportsLightEstimation, and XR_ERROR_FEATURE_UNSUPPORTED
from xrCreateLightEstimatorANDROID.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimation extension must be enabled prior to using XrSystemLightEstimationPropertiesANDROID
- typemust be- XR_TYPE_SYSTEM_LIGHT_ESTIMATION_PROPERTIES_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
Create a light estimator handle
XR_DEFINE_HANDLE(XrLightEstimatorANDROID)
The XrLightEstimatorANDROID handle represents a light estimator. This handle can be used to access light estimation information using other functions in this extension.
The xrCreateLightEstimatorANDROID function is defined as:
XrResult xrCreateLightEstimatorANDROID(
    XrSession                                   session,
    XrLightEstimatorCreateInfoANDROID*          createInfo,
    XrLightEstimatorANDROID*                    outHandle);
Parameter Descriptions
- sessionis the XrSession that creates the light estimator.
- createInfois a pointer to an XrLightEstimatorCreateInfoANDROID structure containing parameters to be used to create the light estimator.
- outHandleis a pointer to a handle in which the created XrLightEstimatorANDROID is returned.
The application can use xrCreateLightEstimatorANDROID function to create a light estimator.
- xrCreateLightEstimatorANDROID will return XR_ERROR_FEATURE_UNSUPPORTEDif the system does not support light estimation.
- xrCreateLightEstimatorANDROID will return
XR_ERROR_PERMISSION_INSUFFICIENTif the required permissions have not been granted to the calling application.
The returned light estimator handle may be subsequently used in API calls. If an application wants to indicate to the runtime that it is done accessing light estimation data it must destroy the handle using xrDestroyLightEstimatorANDROID.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to calling xrCreateLightEstimatorANDROID
- sessionmust be a valid XrSession handle
- createInfomust be a pointer to an XrLightEstimatorCreateInfoANDROID structure
- outHandlemust be a pointer to an XrLightEstimatorANDROID handle
Return Codes
- XR_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_LIMIT_REACHED
The XrLightEstimatorCreateInfoANDROID structure describes the information to create an XrLightEstimatorANDROID handle.
typedef struct XrLightEstimatorCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrLightEstimatorCreateInfoANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrLightEstimatorCreateInfoANDROID
- typemust be- XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
xrDestroyLightEstimatorANDROID function releases the estimator and any
underlying resources. 
XrResult xrDestroyLightEstimatorANDROID(
    XrLightEstimatorANDROID                     estimator);
Parameter Descriptions
- estimatoris an XrLightEstimatorANDROID previously created by xrCreateLightEstimatorANDROID.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to calling xrDestroyLightEstimatorANDROID
- estimatormust be a valid XrLightEstimatorANDROID handle
Thread Safety
- Access to estimator, and any child handles, must be externally synchronized
Return Codes
- XR_SUCCESS
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_HANDLE_INVALID
Access light estimation data
The xrGetLightEstimateANDROID function is defined as:
XrResult xrGetLightEstimateANDROID(
    XrLightEstimatorANDROID                     estimator,
    const XrLightEstimateGetInfoANDROID*        input,
    XrLightEstimateANDROID*                     output);
Parameter Descriptions
- estimator: Handle to an XrLightEstimatorANDROID previously created with- xrCreateLightEstimatorANDROID.
- input: Pointer to an XrLightEstimateGetInfoANDROID structure.
- output: Pointer to an XrLightEstimateANDROID structure.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to calling xrGetLightEstimateANDROID
- estimatormust be a valid XrLightEstimatorANDROID handle
- inputmust be a pointer to a valid XrLightEstimateGetInfoANDROID structure
- outputmust be a pointer to an XrLightEstimateANDROID structure
Return Codes
- XR_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_VALIDATION_FAILURE
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_TIME_INVALID
A XrLightEstimateGetInfoANDROID describes the information required to get light estimation data.
typedef struct XrLightEstimateGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrSpace            space;
    XrTime             time;
} XrLightEstimateGetInfoANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain.
- spaceis the XrSpace defining the reference space in which the returned light direction and spherical harmonics and cubemap rotation are expressed.
- timeis the- XrTimethat describes the time at which the application wishes to query the light estimation.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrLightEstimateGetInfoANDROID
- typemust be- XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- spacemust be a valid XrSpace handle
XrLightEstimateANDROID structure contains light estimation data.
typedef struct XrLightEstimateANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrTime                         lastUpdatedTime;
} XrLightEstimateANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID, XrSphericalHarmonicsANDROID, XrEnvironmentLightingCubemapANDROID and XrDirectionalLightANDROID.
- stateis the XrLightEstimateStateANDROID representing the state of the light estimate.
- lastUpdatedTimeis the- XrTimethat represents when the estimate was last calculated.
To obtain light estimate information for the environment lighting cubemap, ambient light, spherical harmonics, and the primary directional light, applications can chain instances of the following structures, XrEnvironmentLightingCubemapANDROID, XrAmbientLightANDROID, XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID respectively onto XrLightEstimateANDROID::next.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrLightEstimateANDROID
- typemust be- XR_TYPE_LIGHT_ESTIMATE_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain. See also: XrAmbientLightANDROID, XrDirectionalLightANDROID, XrEnvironmentLightingCubemapANDROID, XrSphericalHarmonicsANDROID
- statemust be a valid XrLightEstimateStateANDROID value
The XrEnvironmentLightingCubemapANDROID structure contains light estimation data in a cubemap format about the environment lighting of the scene.
typedef struct XrEnvironmentLightingCubemapANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    const float*                   cubemapRightImage;
    const float*                   cubemapLeftImage;
    const float*                   cubemapTopImage;
    const float*                   cubemapBottomImage;
    const float*                   cubemapFrontImage;
    const float*                   cubemapBackImage;
    uint32_t                       resolution;
    XrQuaternionf                  rotation;
    XrTime                         centerExposureTime;
} XrEnvironmentLightingCubemapANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. Valid structures are XrSphericalHarmonicsANDROID, XrAmbientLightANDROID, and XrDirectionalLightANDROID.
- stateis the XrLightEstimateStateANDROID representing the state of the light estimate.
- cubemapRightImageis a- float*representing the R32G32B32_SFLOAT buffer of the right side of the cubemap. Note this is HDR so float values can be greater than 1.0.
- cubemapLeftImageis a- float*representing the R32G32B32_SFLOAT buffer of the left side of the cubemap. Note this is HDR so float values can be greater than 1.0.
- cubemapTopImageis a- float*representing the R32G32B32_SFLOAT buffer of the top side of the cubemap. Note this is HDR so float values can be greater than 1.0.
- cubemapBottomImageis a- float*representing the R32G32B32_SFLOAT buffer of the bottom side of the cubemap. Note this is HDR so float values can be greater than 1.0.
- cubemapFrontImageis a- float*representing the R32G32B32_SFLOAT buffer of the front side of the cubemap. Note this is HDR so float values can be greater than 1.0.
- resolutionis a- uint32_trepresenting the width and height of the image of each side of the cubemap.
- rotationis a XrQuaternionf representing the rotation of the cubemap.
- centerExposureTimeis a- XrTimerepresenting the time the cubemap was captured. Useful for interpolation between cubemaps.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrEnvironmentLightingCubemapANDROID
- typemust be- XR_TYPE_ENVIRONMENT_LIGHTING_CUBEMAP_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- statemust be a valid XrLightEstimateStateANDROID value
- cubemapRightImagemust be a pointer to a valid float value
- cubemapLeftImagemust be a pointer to a valid float value
- cubemapTopImagemust be a pointer to a valid float value
- cubemapBottomImagemust be a pointer to a valid float value
- cubemapFrontImagemust be a pointer to a valid float value
- cubemapBackImagemust be a pointer to a valid float value
XrAmbientLightANDROID structure contains light estimation data about the ambient light in the scene.
typedef struct XrAmbientLightANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrVector3f                     intensity;
    XrVector3f                     colorCorrection;
} XrAmbientLightANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. Valid structures are XrSphericalHarmonicsANDROID, XrEnvironmentLightingCubemapANDROID, and XrDirectionalLightANDROID.
- stateis the XrLightEstimateStateANDROID representing the state of the light estimate.
- intensityis a- XrVector3representing the intensity of the ambient light. Each component of the vector corresponds to the red, green and blue channels.
- colorCorrectionis a- XrVector3with values in gamma space. Componentwise multiply the color of your gamma corrected render with these values.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrAmbientLightANDROID
- typemust be- XR_TYPE_AMBIENT_LIGHT_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- statemust be a valid XrLightEstimateStateANDROID value
XrSphericalHarmonicsANDROID structure contains spherical harmonics representing the lighting of the scene.
typedef struct XrSphericalHarmonicsANDROID {
    XrStructureType                    type;
    void*                              next;
    XrLightEstimateStateANDROID        state;
    XrSphericalHarmonicsKindANDROID    kind;
    float                              coefficients[9][3];
} XrSphericalHarmonicsANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID, XrEnvironmentLightingCubemapANDROID, and XrDirectionalLightANDROID.
- stateis the XrLightEstimateStateANDROID representing the state of the light estimate.
- kindis the XrSphericalHarmonicsKindANDROID requested by the application.
- coefficientsis a two-dimensional- floatarray with dimensions 9 rows and 3 columns. The 3 columns corresponding to color channels red, green and blue respectively. Each channel has 9 spherical harmonic coefficients.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrSphericalHarmonicsANDROID
- typemust be- XR_TYPE_SPHERICAL_HARMONICS_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- statemust be a valid XrLightEstimateStateANDROID value
- kindmust be a valid XrSphericalHarmonicsKindANDROID value
XrDirectionalLightANDROID structure contains light estimation data.
typedef struct XrDirectionalLightANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrVector3f                     intensity;
    XrVector3f                     direction;
} XrDirectionalLightANDROID;
Member Descriptions
- typeis the XrStructureType of this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID, XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID.
- stateis the XrLightEstimateStateANDROID representing the state of the light estimate.
- intensityis a- XrVector3representing the intensity of the directional light. Each component of the vector corresponds to the red, green and blue channels.
- directionis a- XrVector3representing the light direction.
Valid Usage (Implicit)
- The XR_ANDROID_light_estimationextension must be enabled prior to using XrDirectionalLightANDROID
- typemust be- XR_TYPE_DIRECTIONAL_LIGHT_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- statemust be a valid XrLightEstimateStateANDROID value
The XrSphericalHarmonicsKindANDROID enumeration identifies to the runtime, what type of spherical harmonics the application is requesting.
typedef enum XrSphericalHarmonicsKindANDROID {
    XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID = 0,
    XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID = 1
} XrSphericalHarmonicsKindANDROID;
The enums have the following meanings:
| Enum | Description | 
| 
 | The spherical harmonic coefficients represent the environment light radiance function, including the contribution from the main light. | 
| 
 | The spherical harmonic coefficients represent the environment light radiance function, excluding the contribution from the main light. | 
The XrLightEstimateStateANDROID enumeration identifies to the runtime, what type of spherical harmonics the application is requesting.
typedef enum XrLightEstimateStateANDROID {
    XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID = 0,
    XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID = 1
} XrLightEstimateStateANDROID;
The enums have the following meanings:
| Enum | Description | 
| 
 | The light estimate is valid | 
| 
 | The light estimate is invalid | 
Example code for light estimation
The following example code demonstrates how to get all possible light estimation quantities from the runtime.
XrSession session;  // Created at app startup
XrSpace appSpace;   // Created previously.
XrLightEstimatorANDROID estimator;
XrLightEstimatorCreateInfoANDROID createInfo = {
    .type = XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID};
CHK_XR(xrCreateLightEstimatorANDROID(session, &createInfo, &estimator));
// Every frame
XrTime updateTime;  // Time used for the current frame's simulation update.
XrLightEstimateGetInfoANDROID info = {
    .type = XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID,
    .space = appSpace,
    .time = updateTime,
};
XrDirectionalLightANDROID directionalLight = {
    .type = XR_TYPE_DIRECTIONAL_LIGHT_ANDROID,
};
XrSphericalHarmonicsANDROID totalSh = {
    .type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
    .kind = XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID,
    .next = &directionalLight,
};
XrSphericalHarmonicsANDROID ambientSh = {
    .type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
    .kind = XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID,
    .next = &totalSh,
};
XrAmbientLightANDROID ambientLight = {
    .type = XR_TYPE_AMBIENT_LIGHT_ANDROID,
    .next = &ambientSh,
};
XrEnvironmentLightingCubemapANDROID lightingCubemap {
    .type = XR_TYPE_ENVIRONMENT_LIGHTING_CUBEMAP_ANDROID,
    .next = &ambientLight,
}
XrLightEstimateANDROID estimate = {
    .type = XR_TYPE_LIGHT_ESTIMATE_ANDROID,
    .next = &lightingCubemap,
};
XrResult result = xrGetLightEstimateANDROID(estimator, &info, &estimate);
if (result == XR_SUCCESS &&
    estimate.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
  // use directionalLight, totalSh, ambientSh, ambientLight,
  // lightingCubemap, if each
  // struct has a valid state field
}
// When you want to disable light estimation
CHK_XR(xrDestroyLightEstimatorANDROID(estimator));
New Object Types
- XrLightEstimator
XrObjectType enumeration is extended with:
- XR_OBJECT_TYPE_LIGHT_ESTIMATOR_ANDROID
XrStructureType enumeration is extended with:
- XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
- XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID
- XR_TYPE_LIGHT_ESTIMATE_ANDROID
- XR_TYPE_DIRECTIONAL_LIGHT_ANDROID
- XR_TYPE_SPHERICAL_HARMONICS_ANDROID
- XR_TYPE_AMBIENT_LIGHT_ANDROID
- XR_TYPE_ENVIRONMENT_LIGHTING_CUBEMAP_ANDROID
New Enums
New Structures
- XrLightEstimatorCreateInfoANDROID
- XrLightEstimateGetInfoANDROID
- XrLightEstimateANDROID
- XrDirectionalLightANDROID
- XrSphericalHarmonicsANDROID
- XrAmbientLightANDROID
- XrSystemLightEstimationPropertiesANDROID
- XrEnvironmentLightingCubemapANDROID
New Functions
Issues
Version History
- Revision 2, 2025-01-17 (Salar Khan)
- Added environment lighting cubemap support
 
- Revision 1, 2024-09-16 (Cairn Overturf)
- Initial extension description
 
OpenXR™ and the OpenXR logo are trademarks owned by The Khronos Group Inc. and are registered as a trademark in China, the European Union, Japan and the United Kingdom.
