XR_ANDROID_depth_texture

Строка имени

XR_ANDROID_depth_texture

Тип расширения

Расширение экземпляра

Зарегистрированный добавочный номер

703

Пересмотр

1

Статус ратификации

Не ратифицировано

Зависимости расширений и версий

OpenXR 1.0

Дата последнего изменения

2024-09-11

Статус IP

Известных претензий на интеллектуальную собственность нет.

Авторы

Сушант Кулкарни, Google
Кэрн Овертурф, Google
Спенсер Куин, Google
Левана Чен, 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 указывающий, поддерживает ли текущая система отслеживание глубины.

Приложение может проверить, способна ли система отслеживать глубину, расширив структуру XrSystemProperties с помощью XrSystemDepthTrackingPropertiesANDROID при вызове функции xrGetSystemProperties .

Только если среда выполнения возвращает XR_FALSE для supportsDepthTracking , она должна вернуть XR_ERROR_FEATURE_UNSUPPORTED из xrCreateDepthSwapchainANDROID .

Допустимое использование (неявное)

Разрешение глубины запроса

Функция xrEnumerateDepthResolutionsANDROID определена следующим образом:

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

Описание параметров

  • session — это объект XrSession , который перечисляет поддерживаемые разрешения глубины.
  • resolutionCapacityInput — это емкость resolutions , или 0 для получения требуемой емкости.
  • resolutionCountOutput — это указатель на количество записанных resolutions типа uint64_t или указатель на требуемую емкость в случае, если resolutionCapacityInput недостаточен.
  • resolutions — это указатель на массив XrDepthCameraResolutionANDROID , но он может быть NULL если resolutionCapacityInput равен 0 .
  • Подробное описание получения необходимого размера resolutions см. в разделе « Параметры размера буфера» .

Параметр xrEnumerateDepthResolutionsANDROID перечисляет разрешения глубины, поддерживаемые текущей сессией. Разрешения глубины должны быть упорядочены от наивысшего к наинизшему значению, выбранному во время выполнения. Для оптимальной производительности и качества приложение должно использовать наивысшее поддерживаемое разрешение.

В течение всего времени работы сессии среды выполнения должны всегда возвращать идентичное содержимое буфера из этого перечисления.

Допустимое использование (неявное)

  • Расширение XR_ANDROID_depth_texture необходимо включить перед вызовом функции xrEnumerateDepthResolutionsANDROID.
  • 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 описывает поддерживаемые разрешения глубины при создании объекта 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_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 предоставляет параметры создания объекта XrDepthSwapchainANDROID при передаче его в функцию xrCreateDepthSwapchainANDROID .

Допустимое использование (неявное)

Параметр 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 и любым дочерним элементам должен осуществляться посредством внешней синхронизации.

Коды возврата

Успех

  • 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 для получения изображений.
  • depthImageCapacityInput — это емкость массива depthImages , или 0, указывающее на запрос на получение необходимой емкости.
  • depthImageCountOutput — это указатель на количество записанных depthImages или указатель на требуемую емкость в случае, если depthImageCapacityInput недостаточен.
  • depthImages — это указатель на массив структур XrDepthSwapchainImageANDROID . Он может быть NULL если depthImageCapacityInput равен 0.
  • Подробное описание получения необходимого размера depthImages см. в разделе « Параметры размера буфера» .

Функция xrEnumerateDepthSwapchainImagesANDROID заполняет массив структур XrDepthSwapchainImageANDROID . Ресурсы должны быть постоянными и действительными в течение всего времени существования структуры XrDepthSwapchainANDROID . Эта функция работает аналогично функции xrEnumerateSwapchainImages .

В течение всего времени существования цепочки обменов среда выполнения должна всегда возвращать идентичное содержимое буфера из этого перечисления.

Допустимое использование (неявное)

  • Расширение 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 , выделенного, как описано в XrDepthSwapchainCreateInfoANDROID :: resolution и XrDepthSwapchainCreateInfoANDROID :: createFlags при вызове xrCreateDepthSwapchainANDROID . Для каждого изображения глубины:

  • Значения изображений располагаются в памяти в порядке следования строк, без заполнения между строками.
  • Первое значение находится в верхнем левом углу, а последнее — в нижнем правом.
  • Размер памяти, на которую указывает указатель, определяется значением xrEnumerateDepthSwapchainImagesANDROID и задается функцией XrDepthSwapchainCreateInfoANDROID :: resolution при вызове xrCreateDepthSwapchainANDROID . Например, если XrDepthSwapchainCreateInfoANDROID :: resolution равно XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID , то размер изображений глубины будет равен 2*160*160*sizeof(float) .
  • Значение rawDepthImage должно быть NULL если XrDepthSwapchainCreateInfoANDROID :: createFlags не включал XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID .
  • Значение rawDepthConfidenceImage должно быть NULL если XrDepthSwapchainCreateInfoANDROID :: createFlags не включал XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID .
  • Значение smoothDepthImage должно быть 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 .

Допустимое использование (неявное)

Функция xrAcquireDepthSwapchainImagesANDROID определена следующим образом:

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

Описание параметров

  • depthSwapchain — это идентификатор XrDepthSwapchainANDROID для изображения глубины.
  • acquireInfo — это объект XrDepthAcquireInfoANDROID, содержащий информацию о том, как получить изображение глубины.
  • acquireResult — это возвращаемый объект XrDepthAcquireResultANDROID , содержащий информацию о полученном изображении глубины.

Приложения могут использовать функцию xrAcquireDepthSwapchainImagesANDROID для получения последнего доступного индекса изображения цепочки обмена, т.е. XrDepthAcquireResultANDROID :: acquiredIndex , в массив XrDepthSwapchainImageANDROID , перечисляемый функцией xrEnumerateDepthSwapchainImagesANDROID . Возвращаемый массив XrDepthAcquireResultANDROID также содержит другую информацию, такую ​​как поле зрения и положение, необходимые для интерпретации данных о глубине. Безопасно считывать данные из полученного слота в массиве изображений до следующего вызова функции xrAcquireDepthSwapchainImagesANDROID .

Между любыми парами соответствующих вызовов xrBeginFrame и xrEndFrame в рамках одной сессии должно быть не более одного вызова функции xrAcquireDepthSwapchainImagesANDROID .

  • Выполнение программы может завершиться с ошибкой, если ранее полученные образы цепочки обменов все еще используются программой.
  • Если функция xrAcquireDepthSwapchainImagesANDROID вызывается до xrBeginFrame или после xrEndFrame , среда выполнения должна вернуть XR_ERROR_CALL_ORDER_INVALID
  • Если функция xrAcquireDepthSwapchainImagesANDROID вызывается более одного раза за кадр, среда выполнения должна возвращать XR_ERROR_LIMIT_REACHED то есть в рамках текущей сессии после вызова xrBeginFrame , которому не был связан вызов xrEndFrame .
  • Если данные о глубине окружения еще недоступны, среда выполнения может вернуть ошибку 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 данной структуры.
  • next равно NULL или указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены.
  • space — это XrSpace , определяющий систему координат, возвращаемую в XrDepthAcquireResultANDROID :: views .
  • displayTime — это объект XrTime указывающий время, затраченное на вычисление позы для возвращаемой позы в XrDepthAcquireResultANDROID :: views . Приложения должны передавать прогнозируемое время отображения для текущего кадра.

Допустимое использование (неявное)

Структура XrDepthAcquireResultANDROID определяется следующим образом:

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

Описание участников

  • type — это XrStructureType данной структуры.
  • next равно NULL или указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены.
  • acquiredIndex — это индекс полученной текстуры в массиве XrDepthSwapchainImageANDROID , который перечисляется функцией xrEnumerateDepthSwapchainImagesANDROID .
  • exposureTimestamp — это значение XrTime , указывающее время, когда была получена карта глубины.
  • views — это массив из двух объектов XrDepthViewANDROID , по одному для каждого глаза, где индекс 0 соответствует левому глазу, а индекс 1 — правому.

Допустимое использование (неявное)

Структура XrDepthViewANDROID определяется следующим образом:

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

Описание участников

  • type — это XrStructureType данной структуры.
  • next равно NULL или указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены.
  • fov — это параметр XrFovf , определяющий поле зрения, используемое для создания данного изображения. Изображение никогда не переворачивается ни по горизонтали, ни по вертикали.
  • pose — это объект XrPosef, определяющий позу, из которой была отрисована карта глубины. Опорная система координат задается в XrDepthAcquireInfoANDROID .

Допустимое использование (неявное)

Пример кода для отслеживания глубины

Приведенный ниже пример кода демонстрирует, как получать изображения глубины и использовать значения глубины для сопоставления координат изображения глубины с пространством сцены.

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, 9 сентября 2024 г. (Левана Чен)

    • Первоначальное описание расширения