XR_ANDROID_depth_texture

이름 문자열

XR_ANDROID_depth_texture

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 내선 번호

703

버전

1

승인 상태

비준되지 않음

확장 프로그램 및 버전 종속 항목

OpenXR 1.0

최종 수정일

2024-09-11

IP 상태

알려진 IP 소유권 주장이 없습니다.

도움을 주신 분들

수샨트 쿨카르니, Google
케언 오버터프, Google
스펜서 퀸, Google
레바나 첸, Google

개요

이 확장 프로그램을 사용하면 애플리케이션이 헤드셋 주변의 실제 환경에 대한 깊이 지도를 요청하고 생성 시 지원되는 깊이 해상도를 쿼리할 수 있습니다.

이 확장 프로그램은 오클루전, Hit Test, 정확한 장면 도형을 활용하는 기타 특정 작업(예: 위조 얼굴 인식)을 위해 원시 및 부드러운 깊이를 노출하기 위한 것입니다.

참고

깊이 지도는 런타임에 의해 생성되며 XrDepthSwapchainANDROID를 사용하여 애플리케이션과 공유됩니다. 런타임은 애플리케이션의 전체 기간 동안 xrEnumerateDepthResolutionsANDROID를 통해 반환된 깊이 이미지 해상도를 변경하면 안 됩니다.

권한

이 확장 프로그램은 개인 식별 정보 (PII) 문제를 완화하기 위해 다운샘플링된 깊이 텍스처를 노출합니다. 이 확장 프로그램은 환경의 도형을 노출하므로 Android 애플리케이션은 매니페스트에 android.permission.SCENE_UNDERSTANDING_FINE 권한을 나열해야 합니다. android.permission.SCENE_UNDERSTANDING_FINE 권한은 위험한 권한으로 간주됩니다. 애플리케이션은 런타임에 권한을 요청하여 다음 함수를 사용해야 합니다(must).

(보호 수준: 위험)

시스템 기능 검사

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를 반환해야 합니다(must).

올바른 사용 (암시적)

쿼리 깊이 해상도

xrEnumerateDepthResolutionsANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrEnumerateDepthResolutionsANDROID(
    XrSession                                   session,
    uint32_t                                    resolutionCapacityInput,
    uint32_t*                                   resolutionCountOutput,
    XrDepthCameraResolutionANDROID*             resolutions);

파라미터 설명

  • session는 지원되는 깊이 해상도를 열거하는 XrSession입니다.
  • resolutionCapacityInput은 resolutions의 용량 또는 필요한 용량을 검색하기 위한 0입니다.
  • resolutionCountOutput은 작성된 uint64_t resolutions의 개수에 대한 포인터이거나 resolutionCapacityInput가 부족한 경우 필요한 용량에 대한 포인터입니다.
  • resolutions은 XrDepthCameraResolutionANDROID 배열의 포인터이지만 resolutionCapacityInput가 0인 경우 NULL일 수 있습니다.
  • 필요한 resolutions 크기를 가져오는 방법에 관한 자세한 설명은 버퍼 크기 매개변수 섹션을 참고하세요.

xrEnumerateDepthResolutionsANDROID는 현재 세션에서 지원하는 깊이 해상도를 열거합니다. 깊이 해상도는 런타임 환경설정이 가장 높은 것부터 가장 낮은 것 순으로 정렬되어야 합니다. 애플리케이션은 최적의 성능과 품질을 위해 지원하는 가장 높은 환경설정을 사용해야 합니다(SHOULD).

런타임은 세션의 전체 기간 동안 이 열거에서 항상 동일한 버퍼 콘텐츠를 반환해야 합니다(must).

올바른 사용 (암시적)

  • XR_ANDROID_depth_texture 확장 프로그램은 xrEnumerateDepthResolutionsANDROID를 호출하기 전에 사용 설정해야 합니다(MUST).
  • session는 유효한 XrSession 핸들이어야 합니다.
  • resolutionCountOutput는 uint32_t 값에 대한 포인터여야 합니다.
  • resolutionCapacityInput가 0가 아닌 경우 resolutions는 resolutionCapacityInput XrDepthCameraResolutionANDROID 값 배열의 포인터여야 합니다.

반품 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_VALIDATION_FAILURE

XrDepthCameraResolutionANDROID enum은 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);

파라미터 설명

애플리케이션은 xrCreateDepthSwapchainANDROID 함수를 사용하여 깊이 및 신뢰도 이미지를 모두 관리하는 깊이 스왑체인을 만들 수 있습니다.

  • 시스템이 깊이 추적을 지원하지 않는 경우 런타임은 XR_ERROR_FEATURE_UNSUPPORTED를 반환해야 합니다(must).
  • 런타임은 호출 앱에 필요한 권한이 부여되지 않은 경우 XR_ERROR_PERMISSION_INSUFFICIENT를 반환해야 합니다(MUST).
  • XrDepthSwapchainCreateInfoANDROID에 지정된 깊이 해상도가 지원되지 않는 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
  • 런타임은 스왑체인 생성 시 createInfo에 해당하는 비트가 설정된 경우에만 깊이 신뢰도 이미지를 만들어야 합니다(should).

반환된 깊이 스왑체인 핸들은 이후 API 호출에서 사용될 수 있습니다. XrDepthSwapchainANDROID 핸들은 결국 xrDestroyDepthSwapchainANDROID 함수를 통해 해제되어야 합니다(must).

올바른 사용 (암시적)

반품 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_PERMISSION_INSUFFICIENT
  • XR_ERROR_RUNTIME_FAILURE
  • XR_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입니다.

XrDepthSwapchainCreateInfoANDROID 구조는 xrCreateDepthSwapchainANDROID에 전달될 때 XrDepthSwapchainANDROID의 생성 옵션을 제공합니다.

올바른 사용 (암시적)

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);

파라미터 설명

xrDestroyDepthSwapchainANDROID 함수는 깊이 스왑체인을 소멸시킵니다. 이 호출 후 런타임은 모든 관련 메모리와 리소스를 확보할 수 있습니다.

올바른 사용 (암시적)

스레드 안전

  • swapchain 및 모든 하위 핸들에 대한 액세스는 외부에서 동기화되어야 합니다(must).

반품 코드

성공

  • XR_SUCCESS

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

깊이 텍스처 액세스

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와 유사하게 작동합니다.

런타임은 스왑체인의 전체 기간 동안 이 열거에서 항상 동일한 버퍼 콘텐츠를 반환해야 합니다(MUST).

올바른 사용 (암시적)

  • XR_ANDROID_depth_texture 확장 프로그램은 xrEnumerateDepthSwapchainImagesANDROID를 호출하기 전에 사용 설정해야 합니다.
  • depthSwapchain는 유효한 XrDepthSwapchainANDROID 핸들이어야 합니다.
  • depthImageCountOutput는 uint32_t 값에 대한 포인터여야 합니다.
  • depthImageCapacityInput가 0가 아닌 경우 depthImages는 depthImageCapacityInput XrDepthSwapchainImageANDROID 구조의 배열에 대한 포인터여야 합니다.

반품 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_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);

파라미터 설명

애플리케이션은 xrAcquireDepthSwapchainImagesANDROID 함수를 사용하여 사용 가능한 최신 스왑체인 이미지 색인(XrDepthAcquireResultANDROID :: acquiredIndex)을 xrEnumerateDepthSwapchainImagesANDROID로 열거된 XrDepthSwapchainImageANDROID 배열로 가져올 수 있습니다. 반환된 XrDepthAcquireResultANDROID에는 깊이 데이터를 해석하는 데 필요한 시야 및 포즈와 같은 다른 정보도 포함되어 있습니다. xrAcquireDepthSwapchainImagesANDROID를 다음에 호출할 때까지 이미지 배열에서 획득한 슬롯을 읽어도 안전합니다.

세션에서 상응하는 xrBeginFrame 및 xrEndFrame 호출 쌍 사이에 xrAcquireDepthSwapchainImagesANDROID 호출이 두 번 이상 있으면 안 됩니다(must).

  • 이전에 획득한 스왑체인 이미지가 런타임에서 계속 사용 중인 경우 런타임이 차단될 수 있습니다.
  • 런타임은 xrAcquireDepthSwapchainImagesANDROID가 xrBeginFrame 전 또는 xrEndFrame 후에 호출되는 경우 XR_ERROR_CALL_ORDER_INVALID를 반환해야 합니다(must).
  • 런타임은 프레임당 xrAcquireDepthSwapchainImagesANDROID가 두 번 이상 호출되는 경우(즉, 실행 중인 세션에서 연결된 xrEndFrame이 없는 xrBeginFrame 호출 후) XR_ERROR_LIMIT_REACHED를 반환해야 합니다(must).
  • 환경 깊이 데이터를 아직 사용할 수 없는 경우 런타임은 XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID를 반환할 수 있습니다. 이 경우 애플리케이션은 이후 프레임에서 xrAcquireDepthSwapchainImagesANDROID를 다시 호출해야 합니다(SHOULD).

올바른 사용 (암시적)

반품 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE

XrDepthAcquireInfoANDROID 구조는 다음과 같이 정의됩니다.

typedef struct XrDepthAcquireInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             displayTime;
} XrDepthAcquireInfoANDROID;

회원 설명

  • type는 이 구조의 XrStructureType입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.
  • space은 XrDepthAcquireResultANDROID :: views에서 반환된 포즈의 참조 프레임을 정의하는 XrSpace입니다.
  • displayTime는 XrTime로, XrDepthAcquireResultANDROID :: views에서 반환된 포즈의 포즈를 계산하는 데 사용되는 시간을 지정합니다. 애플리케이션은 현재 프레임의 예상 표시 시간을 전달해야 합니다(should).

올바른 사용 (암시적)

  • XrDepthAcquireInfoANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • type은(는) XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID여야 합니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다.
  • space는 유효한 XrSpace 핸들이어야 합니다(must).

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은 오른쪽 눈입니다.

올바른 사용 (암시적)

  • XrDepthAcquireResultANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • 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에 지정됩니다.

올바른 사용 (암시적)

  • XrDepthViewANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • 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
    // ...
}

새 객체 유형

새 명령어

새로운 구조

새 enum

새 비트마스크

새 enum 상수

  • XR_ANDROID_DEPTH_TEXTURE_EXTENSION_NAME
  • XR_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_ANDROID
    • XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID
    • XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID
    • XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID
    • XR_TYPE_DEPTH_VIEW_ANDROID
    • XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID

문제

버전 기록

  • 버전 1, 2024-09-09 (레바나 첸)

    • 초기 확장 프로그램 설명