XR_ANDROID_depth_texture
名称字符串
XR_ANDROID_depth_texture
扩展类型
实例扩展程序
已注册的扩展程序编号
703
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
上次修改日期
2024-09-11
IP 状态
没有已知的 IP 权利主张。
创作贡献者
Sushant Kulkarni,Google
Cairn Overturf,Google
Spencer Quin,Google
Levana Chen,Google
概览
此扩展程序可让应用请求头戴式设备周围真实环境的深度图,并在创建时查询支持的深度分辨率。
此扩展程序旨在公开原始深度和平滑深度,以用于遮挡、命中测试和其他利用精确场景几何的任务,例如检测假脸。
备注
深度图由运行时生成,并使用 XrDepthSwapchainANDROID 与应用共享。在应用的整个生命周期内,运行时不得更改通过 xrEnumerateDepthResolutionsANDROID 返回的深度图像分辨率。
权限
此扩展程序会公开一个下采样的深度纹理,以缓解个人身份信息 (PII) 方面的担忧。Android 应用必须在清单中列出 android.permission.SCENE_UNDERSTANDING_FINE 权限,因为此扩展程序会暴露环境的几何信息。android.permission.SCENE_UNDERSTANDING_FINE 权限被视为危险权限。应用必须在运行时请求该权限才能使用以下函数:
(保护级别:危险)
检查系统功能
XrSystemDepthTrackingPropertiesANDROID 结构定义如下:
typedef struct XrSystemDepthTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsDepthTracking;
} XrSystemDepthTrackingPropertiesANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。supportsDepthTracking是一个XrBool32,用于指示当前系统是否支持深度跟踪。
应用可以通过在调用 xrGetSystemProperties 时使用 XrSystemDepthTrackingPropertiesANDROID 结构体扩展 XrSystemProperties 来检查系统是否支持深度跟踪。
当且仅当运行时针对 supportsDepthTracking 返回 XR_FALSE 时,该运行时必须从 xrCreateDepthSwapchainANDROID 返回 XR_ERROR_FEATURE_UNSUPPORTED。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrSystemDepthTrackingPropertiesANDROID -
type必须为XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针
队列深度解决方案
xrEnumerateDepthResolutionsANDROID 函数的定义如下:
XrResult xrEnumerateDepthResolutionsANDROID(
XrSession session,
uint32_t resolutionCapacityInput,
uint32_t* resolutionCountOutput,
XrDepthCameraResolutionANDROID* resolutions);
参数说明
session是枚举支持的深度分辨率的 XrSession。resolutionCapacityInput是resolutions的容量,或设为 0 以检索所需的容量。resolutionCountOutput是一个指针,指向写入的uint64_tresolutions数量;若resolutionCapacityInput容量不足,则指向所需的容量。resolutions是指向 XrDepthCameraResolutionANDROID 数组的指针,但如果resolutionCapacityInput为0,则可以为NULL。- 如需详细了解如何检索所需的
resolutions大小,请参阅缓冲区大小参数部分。
xrEnumerateDepthResolutionsANDROID 会枚举当前会话支持的深度分辨率。深度分辨率应按从最高到最低的运行时偏好顺序排列。应用应使用其支持的最高偏好设置,以获得最佳性能和质量。
在会话的整个生命周期内,运行时必须始终从此枚举中返回相同的缓冲区内容。
有效使用情况(隐式)
-
XR_ANDROID_depth_texture扩展程序必须先启用,然后才能调用 xrEnumerateDepthResolutionsANDROID -
session必须是有效的 XrSession 句柄 -
resolutionCountOutput必须是指向uint32_t值的指针 - 如果
resolutionCapacityInput不是0,则resolutions必须是指向resolutionCapacityInput个 XrDepthCameraResolutionANDROID 值的数组的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_VALIDATION_FAILURE
XrDepthCameraResolutionANDROID 枚举描述了创建 XrDepthSwapchainANDROID 时支持的深度分辨率。
typedef enum XrDepthCameraResolutionANDROID {
XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID = 0,
XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID = 1,
XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID = 2,
XR_DEPTH_CAMERA_RESOLUTION_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrDepthCameraResolutionANDROID;
枚举值说明
XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID- 深度图像和置信度图像的分辨率为 80x80。XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID- 深度图像和置信度图像的分辨率为 160x160。XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID- 深度图像和置信度图像的分辨率为 320x320。
创建深度交换链
XR_DEFINE_HANDLE(XrDepthSwapchainANDROID)
XrDepthSwapchainANDROID 是深度交换链句柄。
xrCreateDepthSwapchainANDROID 函数的定义如下:
XrResult xrCreateDepthSwapchainANDROID(
XrSession session,
const XrDepthSwapchainCreateInfoANDROID* createInfo,
XrDepthSwapchainANDROID* swapchain);
参数说明
session是创建深度交换链的 XrSession。createInfo是一个指向 XrDepthSwapchainCreateInfoANDROID 结构的指针,其中包含用于创建交换链的参数。swapchain是一个指向句柄的指针,创建的 XrDepthSwapchainANDROID 将通过该句柄返回。
应用可以使用 xrCreateDepthSwapchainANDROID 函数来创建管理深度图像和置信度图像的深度交换链。
- 如果系统不支持深度跟踪,运行时必须返回
XR_ERROR_FEATURE_UNSUPPORTED。 - 如果发出调用的应用未被授予所需权限,运行时必须返回
XR_ERROR_PERMISSION_INSUFFICIENT。 - 如果 XrDepthSwapchainCreateInfoANDROID 中指定的深度分辨率不受支持,则运行时必须返回
XR_ERROR_VALIDATION_FAILURE。 - 运行时应仅在交换链创建时为
createInfo设置了相应位时创建深度置信度图像。
返回的深度交换链句柄可以在后续 API 调用中使用。XrDepthSwapchainANDROID 句柄最终必须通过 xrDestroyDepthSwapchainANDROID 函数释放。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能调用 xrCreateDepthSwapchainANDROID -
session必须是有效的 XrSession 句柄 -
createInfo必须是指向有效 XrDepthSwapchainCreateInfoANDROID 结构的指针 -
swapchain必须是指向 XrDepthSwapchainANDROID 句柄的指针
返回代码
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
XrDepthSwapchainCreateInfoANDROID 结构的定义如下:
typedef struct XrDepthSwapchainCreateInfoANDROID {
XrStructureType type;
const void* next;
XrDepthCameraResolutionANDROID resolution;
XrDepthSwapchainCreateFlagsANDROID createFlags;
} XrDepthSwapchainCreateInfoANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。resolution是创建深度和置信度纹理时使用的 XrDepthCameraResolutionANDROID。createFlags是一个或多个 XrDepthSwapchainCreateFlagsANDROID。
当传递给 xrCreateDepthSwapchainANDROID 时,XrDepthSwapchainCreateInfoANDROID 结构会为 XrDepthSwapchainANDROID 提供创建选项。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrDepthSwapchainCreateInfoANDROID -
type必须为XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针 -
resolution必须是有效的 XrDepthCameraResolutionANDROID 值 -
createFlags必须是 XrDepthSwapchainCreateFlagBitsANDROID 值的有效组合 -
createFlags不得为0
XrDepthSwapchainCreateFlagsANDROID 指定了 XrDepthSwapchainANDROID 的创建选项。
typedef XrFlags64 XrDepthSwapchainCreateFlagsANDROID;
XrDepthSwapchainCreateFlagsANDROID 的有效位由 XrDepthSwapchainCreateFlagBitsANDROID 定义,具体如下:
// Flag bits for XrDepthSwapchainCreateFlagsANDROID
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID = 0x00000001;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000002;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID = 0x00000004;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000008;
标志说明
XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID- 表示交换链将提供平滑的深度图像。XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID- 表示交换链将提供平滑的深度置信度图像。XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID- 表示交换链将提供原始深度图像。XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID- 表示交换链将提供原始深度置信度映像。
xrDestroyDepthSwapchainANDROID 函数的定义如下:
XrResult xrDestroyDepthSwapchainANDROID(
XrDepthSwapchainANDROID swapchain);
参数说明
swapchain是一个先前由 xrCreateDepthSwapchainANDROID 创建的 XrDepthSwapchainANDROID 句柄。
xrDestroyDepthSwapchainANDROID 函数用于销毁深度交换链。在此调用之后,运行时可能会释放所有相关内存和资源。
有效使用情况(隐式)
-
XR_ANDROID_depth_texture扩展程序必须先启用,然后才能调用 xrDestroyDepthSwapchainANDROID -
swapchain必须是有效的 XrDepthSwapchainANDROID 句柄
线程安全
- 对
swapchain及其任何子句柄的访问都必须在外部进行同步
返回代码
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
访问深度纹理
xrEnumerateDepthSwapchainImagesANDROID 函数的定义如下:
XrResult xrEnumerateDepthSwapchainImagesANDROID(
XrDepthSwapchainANDROID depthSwapchain,
uint32_t depthImageCapacityInput,
uint32_t* depthImageCountOutput,
XrDepthSwapchainImageANDROID* depthImages);
参数说明
depthSwapchain是要从中获取图像的 XrDepthSwapchainANDROID。depthImageCapacityInput是depthImages数组的容量,或设为 0 以请求获取所需的容量。depthImageCountOutput是一个指针,指向写入的depthImages数量;若depthImageCapacityInput容量不足,则指向所需的容量。depthImages是一个指向 XrDepthSwapchainImageANDROID 结构数组的指针。如果depthImageCapacityInput为 0,它可以为NULL。- 如需详细了解如何检索所需的
depthImages大小,请参阅缓冲区大小参数部分。
xrEnumerateDepthSwapchainImagesANDROID 会填充一个 XrDepthSwapchainImageANDROID 结构数组。资源必须是常量,并且在 XrDepthSwapchainANDROID 的生命周期内有效。此函数的行为与 xrEnumerateSwapchainImages 类似。
在交换链的整个生命周期内,运行时 必须始终从此枚举中返回相同的缓冲区内容。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能调用 xrEnumerateDepthSwapchainImagesANDROID -
depthSwapchain必须是有效的 XrDepthSwapchainANDROID 句柄 -
depthImageCountOutput必须是指向uint32_t值的指针 - 如果
depthImageCapacityInput不为0,则depthImages必须是指向depthImageCapacityInput个 XrDepthSwapchainImageANDROID 结构体数组的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_VALIDATION_FAILURE
XrDepthSwapchainImageANDROID 结构的定义如下:
typedef struct XrDepthSwapchainImageANDROID {
XrStructureType type;
void* next;
const float* rawDepthImage;
const uint8_t* rawDepthConfidenceImage;
const float* smoothDepthImage;
const uint8_t* smoothDepthConfidenceImage;
} XrDepthSwapchainImageANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。rawDepthImage是运行时分配的左视图和右视图的原始深度图像的NULL或指针。这些值以米为单位。特殊值:0.0表示原始深度中的无效或空深度像素,Inf表示已知深度,实际上是无限远,rawDepthConfidenceImage是NULL,还是运行时分配的左视图和右视图的原始深度置信度图像的指针。smoothDepthImage是运行时分配的左视图和右视图的平滑深度图像的NULL或指针。这些值以米为单位。特殊值:0.0表示平滑深度中的无效或空深度像素,Inf表示已知深度,实际上是无限远。smoothDepthConfidenceImage是NULL,还是运行时分配的左视图和右视图的平滑深度置信度图像的指针。
图像缓冲区指针仅在交换链的生命周期内有效。交换链销毁后,指针将被视为悬空指针。
XrDepthSwapchainImageANDROID 表示来自可读 XrDepthSwapchainANDROID 的深度图像,这些图像是在调用 xrCreateDepthSwapchainANDROID 时,根据 XrDepthSwapchainCreateInfoANDROID :: resolution 和 XrDepthSwapchainCreateInfoANDROID :: createFlags 中的描述分配的。对于每个深度图像:
- 图片值以行主序在内存中布局,行之间没有填充。
- 第一个值是左上角,最后一个值是右下角。
- 所指向内存的大小由 xrEnumerateDepthSwapchainImagesANDROID 的值确定,并在调用 xrCreateDepthSwapchainANDROID 时由 XrDepthSwapchainCreateInfoANDROID ::
resolution设置。例如,如果 XrDepthSwapchainCreateInfoANDROID ::resolution为XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID,则深度映像的大小将为2*160*160*sizeof(float)。 - 如果 XrDepthSwapchainCreateInfoANDROID ::
createFlags未包含XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID,则rawDepthImage的值必须为NULL。 - 如果 XrDepthSwapchainCreateInfoANDROID ::
createFlags不包含XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID,则rawDepthConfidenceImage的值必须为NULL。 - 如果 XrDepthSwapchainCreateInfoANDROID ::
createFlags不包含XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID,则smoothDepthImage的值必须为NULL。 - 如果 XrDepthSwapchainCreateInfoANDROID ::
createFlags不包含XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID,则smoothDepthImage的值必须为NULL。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrDepthSwapchainImageANDROID -
type必须为XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针
xrAcquireDepthSwapchainImagesANDROID 函数的定义如下:
XrResult xrAcquireDepthSwapchainImagesANDROID(
XrDepthSwapchainANDROID depthSwapchain,
const XrDepthAcquireInfoANDROID* acquireInfo,
XrDepthAcquireResultANDROID* acquireResult);
参数说明
depthSwapchain是深度图像的 XrDepthSwapchainANDROID 句柄。acquireInfo是一个 XrDepthAcquireInfoANDROID,其中包含有关如何获取深度图像的信息。acquireResult是返回的 XrDepthAcquireResultANDROID,其中包含有关所获取深度图像的信息。
应用可以使用 xrAcquireDepthSwapchainImagesANDROID 函数将最新的可用交换链图像索引(即 XrDepthAcquireResultANDROID :: acquiredIndex )获取到由 xrEnumerateDepthSwapchainImagesANDROID 枚举的 XrDepthSwapchainImageANDROID 数组中。返回的 XrDepthAcquireResultANDROID 还包含其他信息,例如解释深度数据所需的视野范围和姿势。在下次调用 xrAcquireDepthSwapchainImagesANDROID 之前,可以安全地从映像数组中的已获取槽读取数据。
在会话中,任何一对对应的 xrBeginFrame 和 xrEndFrame 调用之间,对 xrAcquireDepthSwapchainImagesANDROID 的调用不得超过一次。
- 如果运行时之前获取的交换链图片仍在被运行时使用,则运行时可能会阻塞。
- 如果在 xrBeginFrame 之前或 xrEndFrame 之后调用 xrAcquireDepthSwapchainImagesANDROID,运行时必须返回
XR_ERROR_CALL_ORDER_INVALID。 - 如果每个帧中 xrAcquireDepthSwapchainImagesANDROID 的调用次数超过一次,即在运行会话中,在调用 xrBeginFrame 之后(但尚未调用关联的 xrEndFrame),运行时必须返回
XR_ERROR_LIMIT_REACHED。 - 如果环境深度数据尚不可用,运行时可能会返回
XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID。如果发生这种情况,应用应在后续帧中再次调用 xrAcquireDepthSwapchainImagesANDROID。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能调用 xrAcquireDepthSwapchainImagesANDROID -
depthSwapchain必须是有效的 XrDepthSwapchainANDROID 句柄 -
acquireInfo必须是指向有效 XrDepthAcquireInfoANDROID 结构的指针 -
acquireResult必须是指向 XrDepthAcquireResultANDROID 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_DEPTH_NOT_AVAILABLE_ANDROIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrDepthAcquireInfoANDROID 结构的定义如下:
typedef struct XrDepthAcquireInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime displayTime;
} XrDepthAcquireInfoANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。space是一个 XrSpace,用于定义 XrDepthAcquireResultANDROID ::views中返回的姿势的参考系。displayTime是一个XrTime,用于指定计算 XrDepthAcquireResultANDROID ::views中返回的姿势所用的时间。应用应传递当前帧的预测展示时间。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrDepthAcquireInfoANDROID -
type必须为XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针 -
space必须是有效的 XrSpace 句柄
XrDepthAcquireResultANDROID 结构定义如下:
typedef struct XrDepthAcquireResultANDROID {
XrStructureType type;
const void* next;
uint32_t acquiredIndex;
XrTime exposureTimestamp;
XrDepthViewANDROID views[2];
} XrDepthAcquireResultANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。acquiredIndex是所获取纹理在 xrEnumerateDepthSwapchainImagesANDROID 枚举的 XrDepthSwapchainImageANDROID 数组中的索引。exposureTimestamp是一个XrTime,用于指定捕获深度图的时间。views是一个包含两个 XrDepthViewANDROID 的数组,每个眼睛对应一个,其中索引 0 是左眼,索引 1 是右眼。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrDepthAcquireResultANDROID -
type必须为XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针 -
views的任何给定元素必须是有效的 XrDepthViewANDROID 结构
XrDepthViewANDROID 结构的定义如下:
typedef struct XrDepthViewANDROID {
XrStructureType type;
const void* next;
XrFovf fov;
XrPosef pose;
} XrDepthViewANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。fov是一个 XrFovf,用于指定生成此视图时使用的视野范围。视图绝不会水平或垂直翻转。pose是一个 XrPosef,用于指定渲染深度图的姿势。参考帧在 XrDepthAcquireInfoANDROID 中指定。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_depth_texture扩展程序,然后才能使用 XrDepthViewANDROID -
type必须为XR_TYPE_DEPTH_VIEW_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针
深度跟踪的示例代码
以下示例代码演示了如何获取深度图像,以及如何使用深度值将深度图像坐标映射到舞台空间。
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace stageSpace; // space created for XR_REFERENCE_SPACE_TYPE_STAGE.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateDepthSwapchainANDROID xrCreateDepthSwapchainANDROID; // previously initialized
PFN_xrDestroyDepthSwapchainANDROID xrDestroyDepthSwapchainANDROID; // previously initialized
PFN_xrEnumerateDepthSwapchainImagesANDROID xrEnumerateDepthSwapchainImagesANDROID; // previously initialized
PFN_xrEnumerateDepthResolutionsANDROID xrEnumerateDepthResolutionsANDROID; // previously initialized
PFN_xrAcquireDepthSwapchainImagesANDROID xrAcquireDepthSwapchainImagesANDROID; // previously initialized
float tanf(float);
// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemDepthTrackingPropertiesANDROID depthTrackingProperties{XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID};
properties.next = &depthTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!depthTrackingProperties.supportsDepthTracking) {
// depth tracking is not supported.
return;
}
// Query the supported depth resolution.
XrDepthCameraResolutionANDROID supportedDepthResolution;
uint32_t supportedResolutionCount = 0;
CHK_XR(xrEnumerateDepthResolutionsANDROID(
session, 1, &supportedResolutionCount, &supportedDepthResolution));
// Define metadata to access the raw and smooth depth along with confidences.
XrDepthSwapchainCreateInfoANDROID swapchainCreateInfo = {
.type = XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID,
.next = nullptr,
// Use the resolution supported by the runtime.
.resolution = supportedDepthResolution,
.createFlags =
XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID |
XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID |
XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID |
XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID,
};
XrDepthSwapchainANDROID depthSwapchain;
CHK_XR(xrCreateDepthSwapchainANDROID(
session, &swapchainCreateInfo, &depthSwapchain));
// Enumerate depth images.
uint32_t imageCountOutput = 0;
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
depthSwapchain, 0, &imageCountOutput, nullptr));
std::vector<XrDepthSwapchainImageANDROID> depthImages(imageCountOutput);
for (int i = 0; i < imageCountOutput; i++) {
depthImages[i].type = XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID;
}
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
depthSwapchain, imageCountOutput, &imageCountOutput, depthImages.data()));
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
XrDepthAcquireInfoANDROID acquireInfo = {
.type = XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID,
.space = stageSpace,
.displayTime = time
};
XrDepthAcquireResultANDROID acquireResult = {
.type = XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID,
};
CHK_XR(xrAcquireDepthSwapchainImagesANDROID(
depthSwapchain, &acquireInfo, &acquireResult));
// Each value in a depth image corresponds to a point in the real world.
// The sample code below shows how to find the stageSpace position of
// the point corresponding to a particular value in the depth image.
// For this sample code, assume we are using a right handed coordinate system
// with +X to the right, +Y up and -Z forward.
XrDepthSwapchainImageANDROID *image =
&depthImages[acquireResult.acquiredIndex];
// Assume supported resolution is XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID.
const int imageResolution = 160;
int imageY = 80; // value in [0, imageResolution)
int imageX = 80; // value in [0, imageResolution)
// Get depth value from left eye.
// A right depth value is obtained with the following expression:
// depthR = image->rawDepthImage[imageResolution*imageResolution+i*imageResolution+j]
float depthL = image->rawDepthImage[imageY*imageResolution + imageX];
XrDepthViewANDROID viewL = acquireResult.views[0];
float tanL = tanf(viewL.fov.angleLeft);
float tanR = tanf(viewL.fov.angleRight);
float tanU = tanf(viewL.fov.angleUp);
float tanD = tanf(viewL.fov.angleDown);
float s = (imageX + 0.5f) / (float)imageResolution;
float t = (imageY + 0.5f) / (float)imageResolution;
// Calculate the depth camera space position of the point
// corresponding to this depth value.
XrVector3f posInCameraSpace;
posInCameraSpace.z = -depthL;
posInCameraSpace.x = (tanL + (tanR - tanL)*s)*depthL;
posInCameraSpace.y = (tanD + (tanU - tanD)*t)*depthL;
XrPosef depthCameraPoseL = viewL.pose;
// Transform posInCameraSpace by depthCameraPoseL
// ...
// Finish frame loop
// ...
}
新的对象类型
新命令
- xrAcquireDepthSwapchainImagesANDROID
- xrCreateDepthSwapchainANDROID
- xrDestroyDepthSwapchainANDROID
- xrEnumerateDepthResolutionsANDROID
- xrEnumerateDepthSwapchainImagesANDROID
新结构
- XrDepthAcquireInfoANDROID
- XrDepthAcquireResultANDROID
- XrDepthSwapchainCreateInfoANDROID
- XrDepthSwapchainImageANDROID
- XrDepthViewANDROID
新枚举
新位掩码
新的枚举常量
XR_ANDROID_DEPTH_TEXTURE_EXTENSION_NAMEXR_ANDROID_depth_texture_SPEC_VERSION扩展 XrObjectType:
XR_OBJECT_TYPE_DEPTH_SWAPCHAIN_ANDROID
扩展 XrResult:
XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID
扩展 XrStructureType:
XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROIDXR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROIDXR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROIDXR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROIDXR_TYPE_DEPTH_VIEW_ANDROIDXR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID
问题
版本记录
修订版本 1,2024 年 9 月 9 日(Levana Chen)
- 初始扩展程序说明