名称字符串
XR_ANDROID_light_estimation
扩展类型
实例扩展程序
已注册的扩展程序编号
701
修订版本
1
扩展程序和版本依赖项
上次修改日期
2025-01-17
IP 状态
没有已知的 IP 权利主张。
创作贡献者
Jared Finder,Google
Cairn Overturf,Google
Spencer Quin,Google
Levana Chen,Google
Nihav Jain,Google
Salar Khan,Google
Scott Chung,Google
概览
此扩展程序允许应用请求表示头戴式耳机周围真实世界环境光照的数据。在渲染虚拟对象时,可以使用此信息在与放置虚拟对象的场景相同的条件下照亮虚拟对象。
检查系统功能
应用可以通过在调用 xrGetSystemProperties 时将 XrSystemLightEstimationPropertiesANDROID 结构体链接到 XrSystemProperties 来检查系统是否支持光照估计。
typedef struct XrSystemLightEstimationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsLightEstimation;
} XrSystemLightEstimationPropertiesANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。
- supportsLightEstimation是一个- XrBool32,用于指示当前系统是否支持光估测。
应用可以通过在调用 xrGetSystemProperties 时使用 XrSystemLightEstimationPropertiesANDROID 结构体扩展 XrSystemProperties 来检查系统是否能够支持光照估计。
如果系统无法支持光照估计,则会针对 supportsLightEstimation 返回 XR_FALSE,并针对 xrCreateLightEstimatorANDROID 返回 XR_ERROR_FEATURE_UNSUPPORTED。
有效使用情况(隐式)
- 在调用 XrSystemLightEstimationPropertiesANDROID 之前,必须启用 XR_ANDROID_light_estimation 扩展 。
- type必须为- XR_TYPE_SYSTEM_LIGHT_ESTIMATION_PROPERTIES_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
创建光照估算器句柄
XR_DEFINE_HANDLE(XrLightEstimatorANDROID)
XrLightEstimatorANDROID 句柄表示光照估算器。此句柄 可用于通过此扩展程序中的其他函数访问光照估计信息。
xrCreateLightEstimatorANDROID 函数的定义如下:
XrResult xrCreateLightEstimatorANDROID(
    XrSession                                   session,
    XrLightEstimatorCreateInfoANDROID*          createInfo,
    XrLightEstimatorANDROID*                    outHandle);
参数说明
- session是创建光照估算器的 XrSession。
- createInfo是一个指向 XrLightEstimatorCreateInfoANDROID 结构的指针,该结构包含用于创建光照估算器的参数。
- outHandle是一个指针,指向将返回创建的 XrLightEstimatorANDROID 的句柄。
应用可以使用 xrCreateLightEstimatorANDROID 函数创建光照估算器。
- 如果系统不支持光照估计,xrCreateLightEstimatorANDROID 将返回 XR_ERROR_FEATURE_UNSUPPORTED。
- 如果未向调用应用授予所需权限,xrCreateLightEstimatorANDROID 将返回 XR_ERROR_PERMISSION_INSUFFICIENT。
返回的光照估算器句柄 可能随后会在 API 调用中使用。如果应用想要向运行时表明其已完成对光照估计数据的访问,则必须使用 xrDestroyLightEstimatorANDROID 销毁句柄。
有效使用情况(隐式)
- 在调用 xrCreateLightEstimatorANDROID 之前,XR_ANDROID_light_estimation扩展程序必须处于启用状态
- session必须是有效的 XrSession 句柄
- createInfo必须是指向 XrLightEstimatorCreateInfoANDROID 结构的指针
- outHandle必须是指向 XrLightEstimatorANDROID 句柄的指针
返回代码
- 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
XrLightEstimatorCreateInfoANDROID 结构描述了用于创建 XrLightEstimatorANDROID 句柄的信息。
typedef struct XrLightEstimatorCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrLightEstimatorCreateInfoANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。
有效使用情况(隐式)
- 在调用 XrLightEstimatorCreateInfoANDROID 之前,XR_ANDROID_light_estimation扩展程序必须处于启用状态
- type必须为- XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
xrDestroyLightEstimatorANDROID 函数会释放 estimator 和任何底层资源。
XrResult xrDestroyLightEstimatorANDROID(
    XrLightEstimatorANDROID                     estimator);
参数说明
- estimator是之前由 xrCreateLightEstimatorANDROID 创建的 XrLightEstimatorANDROID。
有效使用情况(隐式)
- 在调用 xrDestroyLightEstimatorANDROID 之前,XR_ANDROID_light_estimation扩展程序必须处于启用状态
- estimator必须是有效的 XrLightEstimatorANDROID 句柄
线程安全
- 对 estimator及其任何子句柄的访问都必须在外部进行同步
返回代码
- XR_SUCCESS
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_HANDLE_INVALID
访问光照估计数据
xrGetLightEstimateANDROID 函数的定义如下:
XrResult xrGetLightEstimateANDROID(
    XrLightEstimatorANDROID                     estimator,
    const XrLightEstimateGetInfoANDROID*        input,
    XrLightEstimateANDROID*                     output);
参数说明
- estimator:之前使用- xrCreateLightEstimatorANDROID创建的 XrLightEstimatorANDROID 的句柄。
- input:指向 XrLightEstimateGetInfoANDROID 结构的指针。
- output:指向 XrLightEstimateANDROID 结构的指针。
有效使用情况(隐式)
- 在调用 xrGetLightEstimateANDROID 之前,XR_ANDROID_light_estimation扩展程序必须处于启用状态
- estimator必须是有效的 XrLightEstimatorANDROID 句柄
- input必须是指向有效 XrLightEstimateGetInfoANDROID 结构的指针
- output必须是指向 XrLightEstimateANDROID 结构的指针
返回代码
- 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
XrLightEstimateGetInfoANDROID 描述了获取光照估计数据所需的信息。
typedef struct XrLightEstimateGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrSpace            space;
    XrTime             time;
} XrLightEstimateGetInfoANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。
- space是定义返回的光照方向、球面谐波和立方体贴图旋转所表达的参考空间的 XrSpace。
- time是- XrTime,用于描述应用希望查询光照估计的时间。
有效使用情况(隐式)
- 在调用 XrLightEstimateGetInfoANDROID 之前,必须启用 XR_ANDROID_light_estimation扩展程序
- type必须为- XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
- space必须是有效的 XrSpace 句柄
XrLightEstimateANDROID 结构包含光照估计数据。
typedef struct XrLightEstimateANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrTime                         lastUpdatedTime;
} XrLightEstimateANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。有效的结构包括 XrAmbientLightANDROID、XrSphericalHarmonicsANDROID、XrEnvironmentLightingCubemapANDROID 和 XrDirectionalLightANDROID。
- state是表示光估测状态的 XrLightEstimateStateANDROID。
- lastUpdatedTime是表示上次计算估算值的时间的- XrTime。
如需获取环境光照立方贴图、环境光、球面谐波和主方向光的轻量级估计信息,应用可以将以下结构的实例(XrEnvironmentLightingCubemapANDROID、XrAmbientLightANDROID、XrSphericalHarmonicsANDROID 和 XrDirectionalLightANDROID)分别链接到 XrLightEstimateANDROID::next。
有效使用情况(隐式)
- 必须先启用 XR_ANDROID_light_estimation扩展程序,然后才能使用 XrLightEstimateANDROID
- type必须为- XR_TYPE_LIGHT_ESTIMATE_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针。另请参阅:XrAmbientLightANDROID、XrDirectionalLightANDROID、XrEnvironmentLightingCubemapANDROID、XrSphericalHarmonicsANDROID
- state必须是有效的 XrLightEstimateStateANDROID 值
XrEnvironmentLightingCubemapANDROID 结构体包含场景环境光照的立方体贴图格式的光照估计数据。
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;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。有效结构包括 XrSphericalHarmonicsANDROID、XrAmbientLightANDROID 和 XrDirectionalLightANDROID。
- state是表示光估测状态的 XrLightEstimateStateANDROID。
- cubemapRightImage是一个- float*,表示立方体贴图右侧的 R32G32B32_SFLOAT 缓冲区。请注意,这是 HDR,因此浮点值可以大于 1.0。
- cubemapLeftImage是一个- float*,表示立方体贴图左侧的 R32G32B32_SFLOAT 缓冲区。请注意,这是 HDR,因此浮点值可以大于 1.0。
- cubemapTopImage是一个- float*,表示立方体贴图顶面的 R32G32B32_SFLOAT 缓冲区。请注意,这是 HDR,因此浮点值可以大于 1.0。
- cubemapBottomImage是一个- float*,表示立方体贴图底面的 R32G32B32_SFLOAT 缓冲区。请注意,这是 HDR,因此浮点值可以大于 1.0。
- cubemapFrontImage是一个- float*,表示立方体贴图正面的 R32G32B32_SFLOAT 缓冲区。请注意,这是 HDR,因此浮点值可以大于 1.0。
- resolution是一个- uint32_t,表示立方体贴图每个面的图像的宽度和高度。
- rotation是表示立方体贴图旋转的 XrQuaternionf。
- centerExposureTime是一个- XrTime,表示拍摄立方体贴图的时间。有助于在立方体贴图之间进行插值。
有效使用情况(隐式)
- 必须先启用 XR_ANDROID_light_estimation扩展程序,然后才能使用 XrEnvironmentLightingCubemapANDROID
- type必须为- XR_TYPE_ENVIRONMENT_LIGHTING_CUBEMAP_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
- state必须是有效的 XrLightEstimateStateANDROID 值
- cubemapRightImage必须是指向有效浮点值的指针
- cubemapLeftImage必须是指向有效浮点值的指针
- cubemapTopImage必须是指向有效浮点值的指针
- cubemapBottomImage必须是指向有效浮点值的指针
- cubemapFrontImage必须是指向有效浮点值的指针
- cubemapBackImage必须是指向有效浮点值的指针
XrAmbientLightANDROID 结构体包含有关场景中环境光的光照估计数据。
typedef struct XrAmbientLightANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrVector3f                     intensity;
    XrVector3f                     colorCorrection;
} XrAmbientLightANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。有效结构包括 XrSphericalHarmonicsANDROID、XrEnvironmentLightingCubemapANDROID 和 XrDirectionalLightANDROID。
- state是表示光估测状态的 XrLightEstimateStateANDROID。
- intensity是一个- XrVector3,表示环境光的强度。 向量的每个分量分别对应于红色、绿色和蓝色通道。
- colorCorrection是一个- XrVector3,其值位于伽玛空间中。将经过灰度校正的渲染颜色与这些值进行分量级相乘。
有效使用情况(隐式)
- 在使用 XrAmbientLightANDROID 之前,XR_ANDROID_light_estimation扩展程序必须处于启用状态
- type必须为- XR_TYPE_AMBIENT_LIGHT_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
- state必须是有效的 XrLightEstimateStateANDROID 值
XrSphericalHarmonicsANDROID 结构包含表示场景光照的球面谐波。
typedef struct XrSphericalHarmonicsANDROID {
    XrStructureType                    type;
    void*                              next;
    XrLightEstimateStateANDROID        state;
    XrSphericalHarmonicsKindANDROID    kind;
    float                              coefficients[9][3];
} XrSphericalHarmonicsANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。有效结构包括 XrAmbientLightANDROID、XrEnvironmentLightingCubemapANDROID 和 XrDirectionalLightANDROID。
- state是表示光估测状态的 XrLightEstimateStateANDROID。
- kind是应用请求的 XrSphericalHarmonicsKindANDROID。
- coefficients是一个二维- float数组,维度为 9 行 3 列。分别对应于红色、绿色和蓝色这 3 个颜色通道的 3 列。每个渠道有 9 个球面谐波系数。
有效使用情况(隐式)
- 必须先启用 XR_ANDROID_light_estimation扩展程序,然后才能使用 XrSphericalHarmonicsANDROID
- type必须为- XR_TYPE_SPHERICAL_HARMONICS_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
- state必须是有效的 XrLightEstimateStateANDROID 值
- kind必须是有效的 XrSphericalHarmonicsKindANDROID 值
XrDirectionalLightANDROID 结构包含光照估计数据。
typedef struct XrDirectionalLightANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    XrVector3f                     intensity;
    XrVector3f                     direction;
} XrDirectionalLightANDROID;
会员说明
- type是相应结构的 XrStructureType。
- next是- NULL或指向结构链中下一个结构的指针。有效结构包括 XrAmbientLightANDROID、XrSphericalHarmonicsANDROID 和 XrDirectionalLightANDROID。
- state是表示光估测状态的 XrLightEstimateStateANDROID。
- intensity是一个- XrVector3,表示定向光的强度。向量的每个分量分别对应于红色、绿色和蓝色通道。
- direction是表示光线方向的- XrVector3。
有效使用情况(隐式)
- 必须先启用 XR_ANDROID_light_estimation扩展程序,然后才能使用 XrDirectionalLightANDROID
- type必须为- XR_TYPE_DIRECTIONAL_LIGHT_ANDROID
- next必须为- NULL或指向结构链中下一个结构的有效指针
- state必须是有效的 XrLightEstimateStateANDROID 值
XrSphericalHarmonicsKindANDROID 枚举向运行时标识应用请求的球谐函数的类型。
typedef enum XrSphericalHarmonicsKindANDROID {
    XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID = 0,
    XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID = 1
} XrSphericalHarmonicsKindANDROID;
枚举具有以下含义:
| 枚举 | 说明 | 
| 
 | 球谐系数表示环境光辐亮度函数,包括主光的贡献。 | 
| 
 | 球面谐波系数表示环境光辐亮度函数,不包括主光的贡献。 | 
XrLightEstimateStateANDROID 枚举向运行时标识应用请求的球谐函数类型。
typedef enum XrLightEstimateStateANDROID {
    XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID = 0,
    XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID = 1
} XrLightEstimateStateANDROID;
枚举具有以下含义:
| 枚举 | 说明 | 
| 
 | 光照估计值有效 | 
| 
 | 光照估计无效 | 
光照估计的示例代码
以下示例代码演示了如何从运行时获取所有可能的光照估计量。
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));
新的对象类型
- XrLightEstimator
XrObjectType 枚举新增了:
- XR_OBJECT_TYPE_LIGHT_ESTIMATOR_ANDROID
XrStructureType 枚举新增了:
- 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
新枚举
新结构
- XrLightEstimatorCreateInfoANDROID
- XrLightEstimateGetInfoANDROID
- XrLightEstimateANDROID
- XrDirectionalLightANDROID
- XrSphericalHarmonicsANDROID
- XrAmbientLightANDROID
- XrSystemLightEstimationPropertiesANDROID
- XrEnvironmentLightingCubemapANDROID
新函数
问题
版本历史记录
- 修订版 2,2025-01-17(萨拉尔·汗)
- 添加了环境光照立方体贴图支持
 
- 修订版 1,2024-09-16(Cairn Overturf)
- 初始扩展程序说明
 
OpenXR™ 和 OpenXR 徽标是 The Khronos Group Inc. 拥有的商标,已在中国、欧盟、日本和英国注册为商标。
