XR_ANDROID_light_estimation
名称字符串
XR_ANDROID_light_estimation
扩展程序类型
实例扩展程序
已注册的扩展程序编号
701
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
上次修改日期
2025-03-13
IP 状态
没有已知的 IP 权利主张。
创作贡献者
Jared Finder,Google
Cairn Overturf,Google
Spencer Quin,Google
Levana Chen,Google
Nihav Jain,Google
Salar Khan,Google
Scott Chung,Google
概览
借助此扩展程序,应用可以请求表示头戴式设备周围真实环境照明情况的数据。应用可以 使用此信息在与虚拟对象所处真实场景相同的条件下照亮虚拟对象。
权限
Android 应用必须 在清单中列出 android.permission.SCENE_UNDERSTANDING_COARSE 权限,因为此扩展程序会公开环境的照明信息。android.permission.SCENE_UNDERSTANDING_COARSE 权限被视为危险权限。应用必须 在运行时请求该权限才能使用以下函数:
(保护级别:危险)
检查系统功能
XrSystemLightEstimationPropertiesANDROID 结构的定义如下:
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。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrSystemLightEstimationPropertiesANDROID -
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 函数来创建光照估计器。
- 如果系统不支持光照估计,运行时必须 返回
XR_ERROR_FEATURE_UNSUPPORTED。 - 如果发出调用的应用未被授予所需权限,运行时必须 返回
XR_ERROR_PERMISSION_INSUFFICIENT。
如果应用想要向运行时表明它已完成对光照估计数据的访问,它 必须 通过 xrDestroyLightEstimatorANDROID 销毁句柄。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能调用 xrCreateLightEstimatorANDROID -
session必须 是有效的 XrSession 句柄 -
createInfo必须 是指向 XrLightEstimatorCreateInfoANDROID 结构的指针 -
outHandle必须 是指向 XrLightEstimatorANDROID 句柄的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOST
XrLightEstimatorCreateInfoANDROID 结构描述了用于创建 XrLightEstimatorANDROID 句柄的信息。
typedef struct XrLightEstimatorCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrLightEstimatorCreateInfoANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrLightEstimatorCreateInfoANDROID -
type必须 为XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID -
next必须 为NULL或指向结构链中下一个结构的有效指针。另请参阅:XrCubemapLightEstimatorCreateInfoANDROID、XrPointLightsEstimatorCreateInfoANDROIDX1
xrDestroyLightEstimatorANDROID 函数的定义如下:
XrResult xrDestroyLightEstimatorANDROID(
XrLightEstimatorANDROID estimator);
参数说明
estimator是先前由 xrCreateLightEstimatorANDROID 创建的 XrLightEstimatorANDROID。
The xrDestroyLightEstimatorANDROID 函数会释放 estimator 和任何底层资源。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能调用 xrDestroyLightEstimatorANDROID -
estimator必须 是有效的 XrLightEstimatorANDROID 句柄
线程安全
- 对
estimator及其任何子句柄的访问必须 在外部进行同步
返回代码
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
访问光照估计数据
xrGetLightEstimateANDROID 函数的定义如下:
XrResult xrGetLightEstimateANDROID(
XrLightEstimatorANDROID estimator,
const XrLightEstimateGetInfoANDROID* input,
XrLightEstimateANDROID* output);
参数说明
estimator是指向先前使用 xrCreateLightEstimatorANDROID 创建的 XrLightEstimatorANDROID 的句柄。input是指向 XrLightEstimateGetInfoANDROID 结构的指针。output是指向 XrLightEstimateANDROID 结构的指针。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能调用 xrGetLightEstimateANDROID -
estimator必须 是有效的 XrLightEstimatorANDROID 句柄 -
input必须 是指向有效 XrLightEstimateGetInfoANDROID 结构的指针 -
output必须 是指向 XrLightEstimateANDROID 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrLightEstimateGetInfoANDROID 结构的定义如下:
typedef struct XrLightEstimateGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
} XrLightEstimateGetInfoANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。space是 XrSpace,用于定义返回的光照方向和球面谐波所表示的参考空间。time是XrTime,用于描述应用希望查询光线估计的时间。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrLightEstimateGetInfoANDROID -
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 和 XrDirectionalLightANDROID。state是 XrLightEstimateStateANDROID,表示光照估计的状态。lastUpdatedTime是XrTime,表示上次计算估计的时间。
对于每个光照估计结构体,如果 state 为 XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID,则结构体中的所有其他字段都是任意的,这意味着它们的值未定义。
如需获取环境光、球面谐波和主定向光的估计信息,应用可以 将以下结构的实例分别链接到 XrLightEstimateANDROID :: next:XrAmbientLightANDROID、XrSphericalHarmonicsANDROID 和 XrDirectionalLightANDROID。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrLightEstimateANDROID** -
type必须 为XR_TYPE_LIGHT_ESTIMATE_ANDROID -
next必须 为NULL或指向结构链中下一个结构的有效指针。另请参阅:XrAmbientLightANDROID、XrCubemapLightingDataANDROID、XrDirectionalLightANDROID、XrPointLightsANDROIDX1、XrSphericalHarmonicsANDROID -
state必须 是有效的 XrLightEstimateStateANDROID 值
XrAmbientLightANDROID 结构包含有关场景中氛围灯的光照估计数据。
typedef struct XrAmbientLightANDROID {
XrStructureType type;
void* next;
XrLightEstimateStateANDROID state;
XrVector3f intensity;
XrVector3f colorCorrection;
} XrAmbientLightANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。有效结构包括 XrSphericalHarmonicsANDROID 和 XrDirectionalLightANDROID。state是 XrLightEstimateStateANDROID,表示光照估计的状态。intensity是 XrVector3f,表示环境光的强度。向量的每个分量分别对应于红色、绿色和蓝色通道。colorCorrection是一个 XrVector3f,其值位于伽马空间中。如果在伽马色彩空间中渲染,请在渲染后将它们与最终计算出的颜色按分量相乘。如果在线性空间中渲染,请先将值转换为线性空间(方法是将其提升到 2.2 次方),然后在渲染后将它们与最终计算出的颜色按分量相乘。The purpose of pname:colorCorrection is to make a scene appear natural and blend with the real world.
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrAmbientLightANDROID -
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 和 XrDirectionalLightANDROID。state是 XrLightEstimateStateANDROID,表示光照估计的状态。kind是应用请求的 XrSphericalHarmonicsKindANDROID。coefficients是一个二维float数组,包含 9 行和 3 列。这 3 列分别对应于红色、绿色和蓝色通道。每个通道都有 9 个球面谐波系数。
coefficients 将在特殊函数中使用,该函数将方向作为输入,并输出来自该方向的光照颜色。如需了解更多详细信息,请参阅此论文。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrSphericalHarmonicsANDROID -
type必须 为XR_TYPE_SPHERICAL_HARMONICS_ANDROID -
next必须 为NULL或指向结构链中下一个结构的有效指针 -
state必须 是有效的 XrLightEstimateStateANDROID 值 -
kind必须 是有效的 XrSphericalHarmonicsKindANDROID 值
XrSphericalHarmonicsKindANDROID 枚举向运行时标识应用请求的球面谐波类型。
typedef enum XrSphericalHarmonicsKindANDROID {
XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID = 0,
XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID = 1,
XR_SPHERICAL_HARMONICS_KIND_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSphericalHarmonicsKindANDROID;
枚举值具有以下含义:
枚举说明
XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID
球面谐波系数表示环境光辐射函数,不包括主光的贡献。
XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID
球面谐波系数表示环境光辐射函数,包括主光的贡献。
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是 XrVector3f,表示定向光的强度。向量的每个分量分别对应于红色、绿色和蓝色通道。direction是 XrVector3f,表示光照方向。
有效用法(隐式)
- 必须先启用
XR_ANDROID_light_estimation扩展程序,然后才能使用 XrDirectionalLightANDROID** -
type必须 为XR_TYPE_DIRECTIONAL_LIGHT_ANDROID -
next必须 为NULL或指向结构链中下一个结构的有效指针 -
state必须 是有效的 XrLightEstimateStateANDROID 值
XrLightEstimateStateANDROID 枚举指示运行时返回的光照估计的状态。
typedef enum XrLightEstimateStateANDROID {
XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID = 0,
XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID = 1,
XR_LIGHT_ESTIMATE_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrLightEstimateStateANDROID;
枚举值具有以下含义:
枚举说明
XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID
光照估计有效
XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID
光照估计无效
光照估计的示例代码
以下示例代码演示了如何从运行时获取所有可能的光照估计量
XrSession session; // Created at app startup
XrSpace appSpace; // Created previously.
PFN_xrCreateLightEstimatorANDROID xrCreateLightEstimatorANDROID; // Created previously.
PFN_xrDestroyLightEstimatorANDROID xrDestroyLightEstimatorANDROID; // Created previously.
PFN_xrGetLightEstimateANDROID xrGetLightEstimateANDROID; // 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 sphericalHarmonics = {
.type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
.next = &directionalLight,
};
// Querying both TOTAL or AMBIENT spherical harmonics in one call will result in an error because chaining two structs with the same type is not allowed
bool useTotalSH;
if (useTotalSH) {
sphericalHarmonics.kind = XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID;
} else {
sphericalHarmonics.kind = XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID;
}
XrAmbientLightANDROID ambientLight = {
.type = XR_TYPE_AMBIENT_LIGHT_ANDROID,
.next = &sphericalHarmonics,
};
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));
新对象类型
新命令
新结构
新枚举
新枚举常量
XR_ANDROID_LIGHT_ESTIMATION_EXTENSION_NAMEXR_ANDROID_light_estimation_SPEC_VERSION扩展 XrObjectType:
XR_OBJECT_TYPE_LIGHT_ESTIMATOR_ANDROID
扩展 XrStructureType:
XR_TYPE_AMBIENT_LIGHT_ANDROIDXR_TYPE_DIRECTIONAL_LIGHT_ANDROIDXR_TYPE_LIGHT_ESTIMATE_ANDROIDXR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROIDXR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROIDXR_TYPE_SPHERICAL_HARMONICS_ANDROIDXR_TYPE_SYSTEM_LIGHT_ESTIMATION_PROPERTIES_ANDROID
问题
版本记录
修订版本 1,2024 年 9 月 16 日 (Cairn Overturf)
- 初始扩展程序说明