XR_EXT_frame_synthesis
名称字符串
XR_EXT_frame_synthesis
扩展程序类型
实例扩展程序
已注册的扩展程序编号
212
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
创作贡献者
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。next是NULL或指向结构链中下一个结构的指针。layerFlags是 XrFrameSynthesisInfoFlagsEXT 的位掩码。motionVectorSubImage标识要用于帧合成的运动矢量图像 XrSwapchainSubImage。motionVectorScale是一个 XrVector4f,用于缩放motionVectorSubImage中运动矢量的解释。motionVectorOffset是一个 XrVector4f,用于偏移motionVectorSubImage中运动矢量的解释。appSpaceDeltaPose是自上一帧以来影响视图的增量应用转换(如果有)。人工运动(脚本化移动、传送等)体验涉及应用将整个 XrCompositionLayerProjection ::space从一个应用空间姿势转换为帧之间的另一个姿势,从而影响视图,其影响程度超过了帧之间跟踪的移动。当应用中没有 XrCompositionLayerProjection ::space转换时,appSpaceDeltaPose必须 是身份。XrPosef ::position在appSpaceDeltaPose中 必须 相对于当前应用 XrCompositionLayerProjection ::space。depthSubImage标识要用于帧合成的深度图像 XrSwapchainSubImage。minDepth和maxDepth是depthSubImage中深度值的范围,并且必须 在 [0.0,1.0] 范围内。这类似于 OpenGL 的glDepthRange的最小值和最大值,但此处的条件是 maxDepth ≥ minDepth。nearZ是深度交换链中minDepth值的正距离(以米为单位)。应用可能 会使用大于farZ的nearZ来表示深度值已反转。nearZ可能 是无限的。farZ是深度交换链中maxDepth值的正距离(以米为单位)。farZ可能 是无限的。如果nearZ==farZ,运行时必须 返回错误XR_ERROR_VALIDATION_FAILURE
在提交运动矢量图像和深度图像以及投影层时,请为给定层中的每个 XrCompositionLayerProjectionView 结构向 XrCompositionLayerProjectionView :: next 链添加 XrFrameSynthesisInfoEXT 结构。
运行时必须 将 motionVectorSubImage 的 RGB 通道中的运动矢量数据解释为由 motionVectorScale 和 motionVectorOffset 修改,如下所示: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 ”。
有效用法(隐式)
- 必须先启用
XR_EXT_frame_synthesis扩展程序,然后才能使用 XrFrameSynthesisInfoEXT -
type必须 为XR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
next必须 为NULL或指向结构链中下一个结构的有效指针 -
layerFlags必须 为0或 XrFrameSynthesisInfoFlagBitsEXT 值的有效组合 -
motionVectorSubImage必须 是有效的 XrSwapchainSubImage 结构 -
depthSubImage必须 是有效的 XrSwapchainSubImage 结构
注意
生成 motionVectorSubImage 和 depthSubImage 的方法有很多种。例如,应用可能会在专用的低分辨率运动矢量传递中渲染它们(如需了解建议的分辨率,请参阅 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_EXT 在 XrFrameSynthesisInfoEXT 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。next是NULL或指向结构链中下一个结构的指针。recommendedMotionVectorImageRectWidth:建议的运动矢量和深度图像宽度。recommendedMotionVectorImageRectHeight:建议的运动矢量和深度图像高度。
启用此扩展程序后,应用可以在调用xrEnumerateViewConfigurationViews以获取有关建议的运动矢量图像分辨率的信息时,在XrViewConfigurationView :: next链中传入XrFrameSynthesisConfigViewEXT结构。
有效用法(隐式)
- 必须先启用
XR_EXT_frame_synthesis扩展程序,然后才能使用 XrFrameSynthesisConfigViewEXT -
type必须 为XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
next必须 为NULL或指向结构链中下一个结构的有效指针
新结构
新枚举常量
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSION扩展 XrStructureType:
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
问题
版本历史记录
修订版 1,2022-01-31 (Jian Zhang)
- 初始扩展程序说明,从 fb_space_warp 转换而来
- 与贡献者协作,完善扩展程序接口。