XR_ANDROID_depth_texture

이름 문자열

XR_ANDROID_depth_texture

확장 프로그램 유형

인스턴스 확장

등록된 내선 번호

703

버전

1

비준 상태

비준되지 않음

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

OpenXR 1.0

최종 수정일

2024-09-11

IP 상태

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

도움을 주신 분들

Sushant Kulkarni, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google

개요

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

이 확장 프로그램은 폐색, Hit Test, 정확한 장면 지오메트리를 활용하는 기타 특정 태스크(예: 위조 얼굴 인식)를 위해 RAW 깊이와 부드러운 깊이를 노출하기 위한 것입니다.

참고

깊이 지도는 런타임에 의해 생성되고 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입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • supportsDepthTracking는 현재 시스템이 깊이 추적을 지원하는지 나타내는 XrBool32입니다.

애플리케이션은 xrGetSystemProperties를 호출할 때 XrSystemDepthTrackingPropertiesANDROID 구조로 XrSystemProperties를 확장하여 시스템이 깊이 추적을 지원하는지 검사할 수 있습니다 .

런타임이 supportsDepthTracking에 대해 XR_FALSE을 반환하는 경우에만 런타임은 xrCreateDepthSwapchainANDROID에서 XR_ERROR_FEATURE_UNSUPPORTED을 반환해야 합니다 .

유효한 사용 (암시적)

쿼리 심도 해결

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

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

매개변수 설명

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

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

런타임은 세션 수명 동안 이 열거형에서 항상 동일한 버퍼 콘텐츠를 반환해야 합니다.

유효한 사용 (암시적)

  • xrEnumerateDepthResolutionsANDROID를 호출하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • session은 유효한 XrSession 핸들이어야 합니다.
  • resolutionCountOutputuint32_t 값에 대한 포인터여야 합니다.
  • resolutionCapacityInput0이 아닌 경우 resolutionsresolutionCapacityInput 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 열거형은 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를 반환해야 합니다.
  • 필요한 권한이 호출 앱에 부여되지 않은 경우 런타임은 XR_ERROR_PERMISSION_INSUFFICIENT를 반환해야 합니다.
  • 런타임은 XrDepthSwapchainCreateInfoANDROID에 지정된 깊이 해상도가 지원되지 않으면 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다.
  • 런타임은 스왑체인 생성 시 createInfo에 해당하는 비트가 설정된 경우에만 깊이 신뢰도 이미지를 생성해야 합니다.

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

유효한 사용 (암시적)

반환 코드

성공

  • 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입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • resolution는 깊이 및 신뢰도 텍스처가 생성되는 XrDepthCameraResolutionANDROID입니다.
  • createFlags는 하나 이상의 XrDepthSwapchainCreateFlagsANDROID입니다 .

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

유효한 사용 (암시적)

XrDepthSwapchainCreateFlagsANDROIDXrDepthSwapchainANDROID의 생성 옵션을 지정합니다 .

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 및 모든 하위 핸들에 대한 액세스는 외부에서 동기화해야 합니다.

반환 코드

성공

  • XR_SUCCESS

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

깊이 텍스처 액세스

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

XrResult xrEnumerateDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    uint32_t                                    depthImageCapacityInput,
    uint32_t*                                   depthImageCountOutput,
    XrDepthSwapchainImageANDROID*               depthImages);

매개변수 설명

  • depthSwapchain은 이미지를 가져올 XrDepthSwapchainANDROID입니다.
  • depthImageCapacityInputdepthImages 배열의 용량입니다. 필요한 용량을 가져오기 위한 요청을 나타내는 0일 수도 있습니다.
  • depthImageCountOutput는 기록된 depthImages의 개수를 가리키는 포인터이거나 depthImageCapacityInput가 부족한 경우 필요한 용량을 가리키는 포인터입니다.
  • depthImagesXrDepthSwapchainImageANDROID 구조의 배열에 대한 포인터입니다. depthImageCapacityInput이 0인 경우 NULL일 수 있습니다.
  • 필요한 depthImages 크기를 가져오는 방법에 관한 자세한 설명은 버퍼 크기 매개변수 섹션을 참고하세요.

xrEnumerateDepthSwapchainImagesANDROIDXrDepthSwapchainImageANDROID 구조의 배열을 채웁니다. 리소스는 XrDepthSwapchainANDROID의 수명 동안 일정하고 유효해야 합니다 . 이 함수는 xrEnumerateSwapchainImages와 유사하게 동작합니다 .

런타임은 스왑체인의 수명 동안 이 열거형에서 항상 동일한 버퍼 콘텐츠를 반환해야 합니다.

유효한 사용 (암시적)

  • xrEnumerateDepthSwapchainImagesANDROID를 호출하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • depthSwapchain은 유효한 XrDepthSwapchainANDROID 핸들이어야 합니다(must).
  • depthImageCountOutputuint32_t 값에 대한 포인터여야 합니다.
  • depthImageCapacityInput0이 아닌 경우 depthImagesdepthImageCapacityInput XrDepthSwapchainImageANDROID 구조의 배열을 가리키는 포인터여야 must 합니다.

반환 코드

성공

  • 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입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • rawDepthImageNULL이거나 런타임에서 할당한 왼쪽 및 오른쪽 뷰의 원시 깊이 이미지 포인터입니다. 값의 단위는 미터입니다. 특수 값: 0.0는 원시 깊이에서 유효하지 않거나 비어 있는 깊이 픽셀을 나타내고, Inf는 사실상 무한히 먼 것으로 알려진 깊이를 나타냅니다.
  • rawDepthConfidenceImageNULL이거나 런타임에서 할당한 왼쪽 및 오른쪽 뷰의 원시 깊이 신뢰도 이미지 포인터입니다.
  • smoothDepthImageNULL이거나 런타임에서 할당한 왼쪽 및 오른쪽 뷰의 부드러운 깊이 이미지 포인터입니다. 값의 단위는 미터입니다. 특수 값: 0.0는 부드러운 깊이에서 유효하지 않거나 비어 있는 깊이 픽셀을 나타내고, Inf는 사실상 무한히 먼 것으로 알려진 깊이를 나타냅니다.
  • smoothDepthConfidenceImageNULL이거나 런타임에서 할당한 왼쪽 및 오른쪽 뷰의 부드러운 깊이 신뢰도 이미지 포인터입니다.

이미지 버퍼 포인터는 스왑체인의 수명 동안에만 유효합니다. 스왑체인이 삭제되면 포인터가 매달린 것으로 간주됩니다.

XrDepthSwapchainImageANDROIDxrCreateDepthSwapchainANDROID를 호출하는 동안 XrDepthSwapchainCreateInfoANDROID :: resolutionXrDepthSwapchainCreateInfoANDROID :: createFlags에 설명된 대로 할당된 읽을 수 있는 XrDepthSwapchainANDROID의 깊이 이미지를 나타냅니다 . 각 깊이 이미지의 경우:

  • 이미지 값은 행 사이에 패딩이 없이 행 우선 순서로 메모리에 배치됩니다.
  • 첫 번째 값은 왼쪽 상단이고 마지막 값은 오른쪽 하단입니다.
  • 가리키는 메모리의 크기는 xrEnumerateDepthSwapchainImagesANDROID 값에 따라 결정되고 xrCreateDepthSwapchainANDROID를 호출하는 동안 XrDepthSwapchainCreateInfoANDROID :: resolution에 의해 설정됩니다 . 예를 들어 XrDepthSwapchainCreateInfoANDROID :: resolutionXR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID이면 깊이 이미지의 크기는 2*160*160*sizeof(float)입니다 .
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID이 포함되지 않은 경우 rawDepthImage의 값은 NULL이어야 합니다 .
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID이 포함되지 않은 경우 rawDepthConfidenceImage의 값은 NULL이어야 합니다 .
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID이 포함되지 않은 경우 smoothDepthImage의 값은 NULL이어야 합니다 .
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID이 포함되지 않은 경우 smoothDepthImage의 값은 NULL이어야 합니다 .

유효한 사용 (암시적)

  • XR_ANDROID_depth_texture 확장 프로그램은 XrDepthSwapchainImageANDROID를 사용하기 전에 사용 설정해야 합니다.
  • typeXR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.

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

XrResult xrAcquireDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    const XrDepthAcquireInfoANDROID*            acquireInfo,
    XrDepthAcquireResultANDROID*                acquireResult);

매개변수 설명

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

세션에서 xrBeginFramexrEndFrame 호출 쌍 사이에 xrAcquireDepthSwapchainImagesANDROID 호출이 두 번 이상 있으면 안 됩니다.

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

유효한 사용 (암시적)

반환 코드

성공

  • 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입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • spaceXrDepthAcquireResultANDROID :: views에서 반환된 포즈의 참조 프레임을 정의하는 XrSpace입니다 .
  • displayTimeXrDepthAcquireResultANDROID :: views에서 반환된 포즈의 포즈를 계산하는 데 사용된 시간을 지정하는 XrTime입니다 . 애플리케이션은 현재 프레임의 예측 표시 시간을 전달해야 합니다.

유효한 사용 (암시적)

  • XrDepthAcquireInfoANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
  • space은 유효한 XrSpace 핸들이어야 합니다.

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

typedef struct XrDepthAcquireResultANDROID {
    XrStructureType       type;
    const void*           next;
    uint32_t              acquiredIndex;
    XrTime                exposureTimestamp;
    XrDepthViewANDROID    views[2];
} XrDepthAcquireResultANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • acquiredIndexxrEnumerateDepthSwapchainImagesANDROID로 열거된 XrDepthSwapchainImageANDROID 배열에서 획득한 텍스처의 색인입니다 .
  • exposureTimestamp는 깊이 맵이 캡처된 시간을 지정하는 XrTime입니다.
  • views는 두 개의 XrDepthViewANDROID 배열입니다. 각 눈에 하나씩 있으며 색인 0은 왼쪽 눈, 색인 1은 오른쪽 눈입니다.

유효한 사용 (암시적)

  • XrDepthAcquireResultANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
  • views의 모든 요소는 유효한 XrDepthViewANDROID 구조여야 합니다.

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

typedef struct XrDepthViewANDROID {
    XrStructureType    type;
    const void*        next;
    XrFovf             fov;
    XrPosef            pose;
} XrDepthViewANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • fov은 이 뷰를 생성하는 데 사용된 시야를 지정하는 XrFovf입니다. 뷰는 가로 또는 세로로 뒤집히지 않습니다.
  • pose는 깊이 지도가 렌더링된 포즈를 지정하는 XrPosef입니다. 참조 프레임은 XrDepthAcquireInfoANDROID에 지정됩니다 .

유효한 사용 (암시적)

  • XrDepthViewANDROID를 사용하기 전에 XR_ANDROID_depth_texture 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_DEPTH_VIEW_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.

깊이 추적을 위한 예시 코드

다음 예시 코드에서는 깊이 이미지를 획득하고 깊이 값을 사용하여 깊이 이미지 좌표를 스테이지 공간에 매핑하는 방법을 보여줍니다.

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
    // ...
}

새 객체 유형

새 명령어

새 구조

새 열거형

새 비트 마스크

새 열거형 상수

  • 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년 9월 9일 (레바나 첸)

    • 초기 확장 프로그램 설명