Name String
XR_ANDROID_light_estimation
Extension Type
Instance extension
Registered Extension Number
701
Revision
1
Extension and Version Dependencies
Last Modified Date
2024-09-18
IP Status
No known IP claims.
Contributors
Jared Finder, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Nihav Jain, 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.supportsLightEstimation
is anXrBool32
, 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
type
must beXR_TYPE_SYSTEM_LIGHT_ESTIMATION_PROPERTIES_ANDROID
next
must beNULL
or 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
session
is the XrSession that creates the light estimator.createInfo
is a pointer to an XrLightEstimatorCreateInfoANDROID structure containing parameters to be used to create the light estimator.outHandle
is 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_UNSUPPORTED
if the system does not support light estimation. - xrCreateLightEstimatorANDROID will return
XR_ERROR_PERMISSION_INSUFFICIENT
if 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_estimation
extension must be enabled prior to calling xrCreateLightEstimatorANDROID session
must be a valid XrSession handlecreateInfo
must be a pointer to an XrLightEstimatorCreateInfoANDROID structureoutHandle
must 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
type
is the XrStructureType of this structure.next
isNULL
or 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_estimation
extension must be enabled prior to using XrLightEstimatorCreateInfoANDROID type
must beXR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
next
must beNULL
or 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
estimator
is an XrLightEstimatorANDROID previously created by xrCreateLightEstimatorANDROID.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to calling xrDestroyLightEstimatorANDROID estimator
must 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 withxrCreateLightEstimatorANDROID
.input
: Pointer to an XrLightEstimateGetInfoANDROID structure.output
: Pointer to an XrLightEstimateANDROID structure.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to calling xrGetLightEstimateANDROID estimator
must be a valid XrLightEstimatorANDROID handleinput
must be a pointer to a valid XrLightEstimateGetInfoANDROID structureoutput
must 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain.space
is the XrSpace defining the reference space in which the returned light direction and spherical harmonics are expressed in.time
is theXrTime
that describes the time at which the application wishes to query the light estimation.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to using XrLightEstimateGetInfoANDROID type
must beXR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID
next
must beNULL
or a valid pointer to the next structure in a structure chainspace
must 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID, XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID.state
is the XrLightEstimateStateANDROID representing the state of the light estimate.lastUpdatedTime
is theXrTime
that represents when the estimate was last calculated.
To obtain light estimate information for ambient light, spherical harmonics and the primary directional light, applications can chain instances of the following structures, XrAmbientLightANDROID, XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID respectively onto XrLightEstimateANDROID::next.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to using XrLightEstimateANDROID type
must beXR_TYPE_LIGHT_ESTIMATE_ANDROID
next
must beNULL
or a valid pointer to the next structure in a structure chain. See also: XrAmbientLightANDROID, XrDirectionalLightANDROID, XrSphericalHarmonicsANDROIDstate
must be a valid XrLightEstimateStateANDROID 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain. Valid structures are XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID.state
is the XrLightEstimateStateANDROID representing the state of the light estimate.intensity
is aXrVector3
representing the intensity of the ambient light. Each component of the vector corresponds to the red, green and blue channels.colorCorrection
is aXrVector3
with values in gamma space. Componentwise multiply the color of your gamma corrected render with these values.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to using XrAmbientLightANDROID type
must beXR_TYPE_AMBIENT_LIGHT_ANDROID
next
must beNULL
or a valid pointer to the next structure in a structure chainstate
must 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID and XrDirectionalLightANDROID.state
is the XrLightEstimateStateANDROID representing the state of the light estimate.kind
is the XrSphericalHarmonicsKindANDROID requested by the application.coefficients
is a two-dimensionalfloat
array 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_estimation
extension must be enabled prior to using XrSphericalHarmonicsANDROID type
must beXR_TYPE_SPHERICAL_HARMONICS_ANDROID
next
must beNULL
or a valid pointer to the next structure in a structure chainstate
must be a valid XrLightEstimateStateANDROID valuekind
must 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
type
is the XrStructureType of this structure.next
isNULL
or a pointer to the next structure in a structure chain. Valid structures are XrAmbientLightANDROID, XrSphericalHarmonicsANDROID and XrDirectionalLightANDROID.state
is the XrLightEstimateStateANDROID representing the state of the light estimate.intensity
is aXrVector3
representing the intensity of the directional light. Each component of the vector corresponds to the red, green and blue channels.direction
is aXrVector3
representing the light direction.
Valid Usage (Implicit)
- The
XR_ANDROID_light_estimation
extension must be enabled prior to using XrDirectionalLightANDROID type
must beXR_TYPE_DIRECTIONAL_LIGHT_ANDROID
next
must beNULL
or a valid pointer to the next structure in a structure chainstate
must 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, excluding the contribution from the main light. |
|
The spherical harmonic coefficients represent the environment light radiance function, including 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,
};
XrLightEstimateANDROID estimate = {
.type = XR_TYPE_LIGHT_ESTIMATE_ANDROID,
.next = &ambientLight,
};
XrResult result = xrGetLightEstimateANDROID(estimator, &info, &estimate);
if (result == XR_SUCCESS &&
estimate.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
// use directionalLight, totalSh, ambientSh, ambientLight 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
New Enums
New Structures
- XrLightEstimatorCreateInfoANDROID
- XrLightEstimateGetInfoANDROID
- XrLightEstimateANDROID
- XrDirectionalLightANDROID
- XrSphericalHarmonicsANDROID
- XrAmbientLightANDROID
- XrSystemLightEstimationPropertiesANDROID
New Functions
Issues
Version History
- Revision 1, 2024-09-16 (Cairn Overturf)
- Initial extension description