在 Android NDK (C) 上使用 Vulkan 渲染 AR 应用

ArTextureUpdateMode 设为 AR_TEXTURE_UPDATE_MODE_EXPOSE_HARDWARE_BUFFER 时,ARCore 会在调用 ArSession_update() 时提供 Android 硬件缓冲区。此硬件缓冲区可以绑定到 Vulkan VkImage

查看示例应用

hello_ar_vulkan_c 示例应用演示了 Vulkan 渲染支持。

启用硬件缓冲区输出模式

配置的 ArTextureUpdateMode 决定了 ARCore 将如何更新相机纹理。将其设置为 AR_TEXTURE_UPDATE_MODE_EXPOSE_HARDWARE_BUFFER 后,ARCore 将通过 AHardwareBuffer 提供相机图片。

将该会话配置为使用 AR_TEXTURE_UPDATE_MODE_EXPOSE_HARDWARE_BUFFER

ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
ArConfig_setTextureUpdateMode(ar_session, ar_config,
                              AR_TEXTURE_UPDATE_MODE_EXPOSE_HARDWARE_BUFFER);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

获取硬件缓冲区

启用 AR_TEXTURE_UPDATE_MODE_EXPOSE_HARDWARE_BUFFER 后,使用 ArFrame_getHardwareBuffer() 获取硬件缓冲区:

void* native_hardware_buffer = NULL;
ArFrame_getHardwareBuffer(ar_session, ar_frame, &native_hardware_buffer);

if ((int64_t)native_hardware_buffer == 0) {
  // The hardware buffer isn't ready yet.
  return;
}

在 Vulkan 渲染期间使用硬件缓冲区

如需查看有关如何使用 Vulkan 渲染 AR 应用的示例,请参阅 vulkan_handler.cc

支持的设备

Vulkan 渲染支持仅适用于 Android API 级别 27 及更高级别。此外,设备还必须支持 VK_ANDROID_external_memory_android_hardware_buffer 扩展。

要求在应用清单中加入 Vulkan

Google Play 会利用应用清单中声明的 <uses-feature>,从不符合应用硬件和软件功能要求的设备上过滤该应用。使用 Vulkan 1.0 的设备可能不支持所需的扩展,但设备可能 从 Android 10(API 级别 29)开始,与 Vulkan 1.1 兼容的必须具有所需的扩展。