XR_EXT_frame_synthesis

名称字符串

XR_EXT_frame_synthesis

扩展程序类型

实例扩展程序

已注册的扩展程序编号

212

修订版本

1

批准状态

未批准

扩展程序和版本依赖项

OpenXR 1.0

创作贡献者

Jian Zhang,Meta Platforms
Neel Bedekar,Meta Platforms
Xiang Wei,Meta Platforms
Guodong Rong,Meta Platforms
Trevor Dasch,Meta Platforms
Rémi Arnaud,Varjo
Paulo Gomes,Samsung Electronics
Bryce Hutchings,Microsoft
Rylie Pavlik,Collabora
Shuai Liu,ByteDance

概览

此扩展程序提供支持,以便根据应用提供的其他数据在应用上启用帧合成。运行时可能 会使用应用生成的运动矢量图像和深度图像进行高质量的帧外推和重投影,以合成新帧,即使应用以低于 FPS 目标的速度运行,也能提供流畅的体验。

此扩展程序旨在独立于 XR_KHR_composition_layer_depth,并且两者可能 会同时启用和使用,以用于不同的目的。XrFrameSynthesisInfoEXT :: depthSubImage 可能会使用专用于帧合成的深度数据,并且其分辨率可能低于XrCompositionLayerDepthInfoKHR :: subImage。如需了解 depthSubImage 的建议分辨率,请参阅 XrFrameSynthesisConfigViewEXT

提交运动矢量图像和深度图像

XrFrameSynthesisInfoEXT 结构的定义如下:

typedef struct XrFrameSynthesisInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrFrameSynthesisInfoFlagsEXT    layerFlags;
    XrSwapchainSubImage             motionVectorSubImage;
    XrVector4f                      motionVectorScale;
    XrVector4f                      motionVectorOffset;
    XrPosef                         appSpaceDeltaPose;
    XrSwapchainSubImage             depthSubImage;
    float                           minDepth;
    float                           maxDepth;
    float                           nearZ;
    float                           farZ;
} XrFrameSynthesisInfoEXT;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。
  • layerFlagsXrFrameSynthesisInfoFlagsEXT 的位掩码。
  • motionVectorSubImage 标识要用于帧合成的运动矢量图像 XrSwapchainSubImage
  • motionVectorScale 是一个 XrVector4f,用于缩放 motionVectorSubImage 中运动矢量的解释。
  • motionVectorOffset 是一个 XrVector4f,用于偏移 motionVectorSubImage 中运动矢量的解释。
  • appSpaceDeltaPose 是自上一帧以来影响视图的增量应用转换(如果有)。人工运动(脚本化移动、传送等)体验涉及应用将整个 XrCompositionLayerProjection :: space 从一个应用空间姿势转换为帧之间的另一个姿势,从而影响视图,其影响程度超过了帧之间跟踪的移动。当应用中没有 XrCompositionLayerProjection :: space 转换时,appSpaceDeltaPose 必须 是身份。XrPosef :: positionappSpaceDeltaPose必须 相对于当前应用 XrCompositionLayerProjection :: space
  • depthSubImage 标识要用于帧合成的深度图像 XrSwapchainSubImage
  • minDepthmaxDepthdepthSubImage 中深度值的范围,并且必须 在 [0.0,1.0] 范围内。这类似于 OpenGL 的 glDepthRange 的最小值和最大值,但此处的条件是 maxDepth ≥ minDepth。
  • nearZ 是深度交换链中 minDepth 值的正距离(以米为单位)。应用可能 会使用大于 farZnearZ 来表示深度值已反转。nearZ 可能 是无限的。
  • farZ 是深度交换链中 maxDepth 值的正距离(以米为单位)。farZ 可能 是无限的。如果 nearZ == farZ,运行时必须 返回错误 XR_ERROR_VALIDATION_FAILURE

在提交运动矢量图像和深度图像以及投影层时,请为给定层中的每个 XrCompositionLayerProjectionView 结构向 XrCompositionLayerProjectionView :: next 链添加 XrFrameSynthesisInfoEXT 结构。

运行时必须motionVectorSubImage 的 RGB 通道中的运动矢量数据解释为由 motionVectorScalemotionVectorOffset 修改,如下所示:motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz。系统会忽略组件 motionVectorSubImage a、motionVectorScale w 和 motionVectorOffset w。

运动矢量表示自上一帧的 XrFrameEndInfo ::displayTime 到当前帧的 XrFrameEndInfo ::displayTime 以来像素的移动。运行时可能 会使用此信息将渲染的帧外推到未来的帧中。

运动矢量必须 源自归一化设备坐标 (NDC) 空间,在此上下文中,该空间使用 Vulkan 样式的惯例:NDC 范围定义为 [-1, -1, 0] 到 [1, 1, 1],与 OpenGL 的 NDC 范围不同。不过,运动矢量本身不受此范围的限制;其值取决于像素的移动,并且可能会超出 NDC 空间的边界。例如,假设上一帧中像素的 NDC 为 PrevNDC,当前帧中的 NDC 为 CurrNDC,并且没有缩放或偏移,则运动矢量值为“ (CurrNDC - PrevNDC) xyz ”。

有效用法(隐式)

注意

生成 motionVectorSubImagedepthSubImage 的方法有很多种。例如,应用可能会在专用的低分辨率运动矢量传递中渲染它们(如需了解建议的分辨率,请参阅 XrFrameSynthesisConfigViewEXT),或者使用 MRT(多渲染目标)在主视图传递中渲染它们。具体采用哪种方法由应用决定。建议为 motionVectorSubImage 使用带符号的 16 位浮点型像素通道格式。

帧合成标志

typedef XrFlags64 XrFrameSynthesisInfoFlagsEXT;

// Flag bits for XrFrameSynthesisInfoFlagsEXT
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT = 0x00000001;
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT = 0x00000002;

标志说明

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT 表示使用 2D 运动矢量数据。
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT 向运行时提供提示,表明应用希望有更多时间来渲染每个帧,但代价是运行时会合成更多帧。这对于希望节省 CPU 和 GPU 利用率(例如,为了延长电池续航时间)或增加每个帧的计算预算的应用可能很有用。无论此标志的值如何,运行时可能 会以任何时间间隔请求帧。

默认情况下,运行时需要 3D 运动矢量数据,因此会使用 motionVectorSubImage rgb、motionVectorScale xyz 和 motionVectorOffset xyz,如 XrFrameSynthesisInfoEXT 中所述。

XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTXrFrameSynthesisInfoEXT layerFlags 上启用时,运行时会将提交的运动矢量图像解释为 2D 运动矢量数据,表示从上一帧到当前帧的 2D 像素移动。对于 2D 运动矢量数据,像素值的解释如下:motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy。系统会忽略组件 motionVectorSubImage ba、motionVectorScale zw 和 motionVectorOffset zw。使用 2D 而不是 3D 运动矢量数据可能 会降低合成帧的质量。

XrFrameSynthesisConfigViewEXT 结构的定义如下:

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。
  • recommendedMotionVectorImageRectWidth:建议的运动矢量和深度图像宽度。
  • recommendedMotionVectorImageRectHeight:建议的运动矢量和深度图像高度。

启用此扩展程序后,应用可以在调用xrEnumerateViewConfigurationViews以获取有关建议的运动矢量图像分辨率的信息时,在XrViewConfigurationView :: next链中传入XrFrameSynthesisConfigViewEXT结构。

有效用法(隐式)

新结构

新枚举常量

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • 扩展 XrStructureType

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

问题

版本历史记录

  • 修订版 1,2022-01-31 (Jian Zhang)

    • 初始扩展程序说明,从 fb_space_warp 转换而来
    • 与贡献者协作,完善扩展程序接口。