高通 OpenXR SDK 使用指南(3)
2 SXR SDK 与 OpenXR 比较
2.1 SXR SDK 到 OpenXR API 映射
General
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
sxrGetVersion() | xrEnumerateApiLayerProperties() xrGetInstanceProperties() | 应用程序可以通过调用 xrEnumerateApiLayerProperties 函数获取可用 API 层列表来确定它们可用的 API 层。 然后,应用程序可以从此列表中选择所需的 API 层,并在创建实例时将它们提供给 xrCreateInstance 函数。 |
svrGetVrServiceVersion() | 不适用 | |
svrGetVrClientVersion() | 不适用 | |
svrInitialize() | xrCreateInstance() | xrCreateInstance 创建 XrInstance,然后启用并初始化应用程序请求的全局 API 层和扩展。 必须在 xrCreateInstance() 期间创建 SVR 服务客户端才能查询系统和视图属性。 |
sxrShutdown() | xrDestroyInstance() | 销毁 XrInstance 并取消初始化对象 |
svrGetDeviceInfo() | 不适用 | |
不适用 | xrGetSystem() | 系统代表运行时中相关设备的集合,通常由多个单独的硬件组件组成,这些组件协同工作以实现 XR 体验。 XrSystemId 由 xrGetSystem 返回,表示运行时将用于支持给定外形规格的设备系统。 每个系统可能包括 VR/AR 显示器、各种形式的输入(游戏板、触摸板、运动控制器)和其他可跟踪对象。 |
不适用 | xrGetSystemProperties() | 应用程序可以调用 xrGetSystemProperties 来检索有关系统的信息,例如供应商 ID、系统名称以及图形和跟踪属性。 |
svrBeginVr() | 不适用 | |
svrEndVr() | 不适用 |
loader
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
不适用 | xrEnumerateApiLayerProperties() | 提供XrApiLayerProperties结构体,描述API层的详细信息,如描述、版本号等。 |
xrEnumerateInstanceExtensionProperties() | 提供扩展详细信息,例如扩展名称和规范 | |
xrGetInstanceProcAddr() | 调用以获取加载程序函数的 OpenXR 函数指针 |
Predicted Display Times
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrGetPredictedDisplayTime() | xrWaitFrame() | PredictedDisplayTime 是下一个应用程序生成的帧的预期显示 XrTime。 它在 OpenXR 的 xrWaitFrame() 函数中处理。 |
svrGetPredictedDisplayTimePipelined() | xrWaitFrame() | PredictedDisplayTime 是下一个应用程序生成的帧的预期显示 XrTime。 |
PredictedDisplayPeriod 是下一个应用程序生成的帧的显示周期的 XrDuration,用于预测超出下一个帧的显示时间。 它在 OpenXR 的 xrWaitFrame() 函数中处理。 |
Head tracking
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrGetPredictedHeadPose() | xrLocateSpace() | OpenXR 定义了一组众所周知的参考空间,应用程序使用这些空间来引导其空间推理。 这些参考空间是 VIEW、LOCAL 和 STAGE。 xrLocateSpace 在指定时间提供空间在基础空间中的物理位置(如果运行时当前已知)。一些设备在使用时会提高他们对世界的理解。 xrLocateSpace 在后面的帧中返回的位置可能会随着时间而改变,即使对于跟踪静态对象的空间也是如此,因为目标空间或基础空间会调整其原点。应用程序使用 xrLocateSpace 函数在给定的历史或预测时间找到基本 XrSpace 中 XrSpace 原点的姿态。 如果应用程序想知道空间原点的速度,它可以在调用 xrLocateSpace 函数时将 XrSpaceVelocity 结构链接到 XrSpaceLocation 结构的下一个指针。 应用程序应检查输出 XrSpaceLocationFlagBits 和 XrSpaceVelocityFlagBits 以确定位置组件的有效性和跟踪状态。 |
svrGetHistoricHeadPose() | xrLocateSpace() | 应用调用此函数获取头部姿势 |
svrRecenterPose() | OpenXR 调用者可以更新 XrSpace 发布到阶段转换 | |
svrRecenterPosition() | OpenXR 调用者可以更新 XrSpace 发布到阶段转换 | |
svrRecenterOrientation() | OpenXR 调用者可以更新 XrSpace 发布到阶段转换 | |
svrGetSupportedTrackingModes() | xrGetSystemProperties() | 函数调用 XrSystemTrackingProperties 以获取跟踪属性详细信息 |
svrSetTrackingMode() | 不适用 |
Asynchronous event processing
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrPollEvent() | xrPollEvent() | 这些事件放在队列中,应用程序必须定期从队列中读取。 通过 xrPollEvent 一次一个地从队列中读取事件。 每个事件都由一个单独的结构标识,每个结构都以 XrEventDataBaseHeader 开头 |
Rendering
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrBeginEye() | 不适用 | |
svrEndEye() | 不适用 | |
xrWaitFrame() | 如果提交给 xrEndFrame 的帧在其目标显示时间之前被合成器使用,则对 xrWaitFrame 的后续调用必须阻止调用方,直到在运行时确定的帧目标显示时间之后的下一个渲染间隔开始。运行时最早从 xrWaitFrame 返回是在它确定应用程序应该开始绘制下一帧时。xrWaitFrame 必须可从任何线程调用,包括调用 xrBeginFrame/xrEndFrame 的不同线程。 调用 xrWaitFrame 必须由应用程序进行外部同步。 并发调用可能会导致未定义的行为。如果应用程序应正常渲染其图层并将其提交给 xrEndFrame,则 shouldRender 为 XR_TRUE。 当此值为 XR_FALSE 时,应用程序应尽可能避免繁重的 GPU 工作,例如跳过层渲染,然后在调用 xrEndFrame 时忽略这些层。对于 shouldRender 为 XR_FALSE 的任何帧,应用程序应避免为该帧进行繁重的 GPU 工作,例如不渲染其层。 这通常发生在应用程序进入或退出正在运行的会话时,或者当某些系统 UI 目前完全覆盖应用程序时。 只要会话在运行,应用程序就应该继续运行帧循环以保持帧与运行时同步,即使这需要调用 xrEndFrame 并省略所有层。 | |
xrBeginFrame() | 应用程序应该在为给定帧执行任何图形设备工作之前立即调用 xrBeginFrame,而不是在之后调用它。 运行时必须只组合其 xrBeginFrame 和 xrEndFrame 都返回成功代码的帧。 虽然不需要在同一线程上调用 xrBeginFrame 和 xrEndFrame,但如果在不同的线程上调用它们,应用程序必须处理同步。 | |
svrSubmitFrame() | xrEndFrame() | 应用程序可以调用 xrEndFrame 而无需调用 xrReleaseSwapchainImage 自上次调用 xrEndFrame 以获取传递给 xrEndFrame 的任何交换链。 |
svrSetWarpMesh() | 不适用 | |
svrGetOcclusionMesh() | 不适用 | |
xrEnumerateViewConfigurations() | VR 服务需要枚举和配置 XR 查看器。 因此,VR 服务必须正在运行才能将此信息返回给 OpenXR 运行时。 | |
xrCreateSwapchainAndroidSurfaceKHR() | xrCreateSwapchainAndroidSurfaceKHR 创建一个在 swapchain 中返回的 XrSwapchain 对象和一个在 surface 中返回的 Android Surface jobject。 jobject 必须有效才能使用 JNI 传回 Java 代码,并且必须有效才能与普通 Android API 一起使用以将图像提交到表面。 | |
xrEnumerateSwapchainImages() | 交换链图像按索引获取、等待和释放,但交换链中图像的数量是实现定义的。此外,渲染图像需要访问正在使用的图形 API 的底层图像原语。 应用程序可以在交换链创建后随时查询和缓存图像。 | |
xrLocateViews() | 应用程序使用 xrLocateViews 来检索呈现 xrEnumerateViewConfigurationViews 返回的每个合成视图所需的查看器姿势和投影参数。当一个或两个空间都在跟踪动态对象时,将更新的时间传递给 xrLocateSpace 每帧将导致更新的相对姿势。 |
Controllers
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrControllerStartTracking() | xrCreateAction(), xrCreateActionSpace() | 所有控制器工作对于 OpenXR 都是新的。 将尽可能利用 VR SDK。 |
svrControllerStopTracking() | xrDestroySpace(), xrDestroyAction() | |
xrSyncActions() | xrSyncActions 更新输入操作的当前状态。 后续同步调用之间的重复输入操作状态查询必须返回相同的值。 | |
svrControllerGetState() | xrLocateSpace(), xrGetActionStatePose(),xrGetActionStateBoolean,Vector1f,Vector2f() | |
svrControllerSendMessage() | 不适用 | |
svrControllerQuery() | 不适用 | |
xrCreateActionSpace() | 根据选定的姿势动作创建 XrSpace 句柄。 应用程序可以提供一个 XrPose 来定义新空间原点在动作空间的自然参考框架内的位置和方向。 | |
xrDestroySpace() | ||
xrCreateAction() | 在检索动作数据、创建动作空间或发送触觉事件时,动作句柄用于指代单个动作。 | |
xrCreateActionSet() | 它返回动作集实例。 动作集是应用程序定义的动作集合。 它们通过 xrAttachSessionActionSets 调用附加到给定的 XrSession。 它们由应用程序根据当前应用程序上下文通过 xrSyncActions 启用或禁用。 例如,游戏可能有一组动作用于控制角色,另一组动作用于导航菜单系统。 当这些操作被分组到两个 XrActionSet 句柄中时,可以使用单个函数调用有选择地启用和禁用它们。 | |
xrDestroyAction() | ||
xrDestroyActionSet() | ||
xrApplyHapticFeedback() | 使用 xrApplyHapticFeedback 函数将触觉反馈发送到设备。 hapticEvent 指向支持的事件结构。 所有事件结构的共同点是第一个元素是 XrHapticBaseHeader,可用于确定触觉事件的类型。 | |
xrStopHapticFeedback() | 使用 xrStopHapticFeedback 函数可以立即停止触觉反馈。 | |
xrSuggestInteractionProfileBindings() | xrSuggestInteractionProfileBindings 设置应用程序可以为其提供默认绑定的交互配置文件。 应用程序可以针对它支持的每个交互配置文件调用一次 xrSuggestInteractionProfileBindings。 |
Boundary System
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
svrIsBoundarySystemEnabled | 不适用 | |
svrEnableBoundarySystem() | 不适用 | |
svrForceDisplayBoundarySystem() | 不适用 | |
svrSetBoundaryParameters() | 不适用 | |
svrGetBoundaryParameters() | 不适用 |
Coordinate Systems
SVR SDK | OpenXR | Notes OpenXR |
---|---|---|
xrCreateReferenceSpace() | SXR OpenXR 实现将使用 6DoF 跟踪模式(如果可用)。 客户可以选择使用姿势中的方向和/或平移值 | |
xrDestroySpace() | ||
svrGetPredictedDisplayTime() | xrLocateSpace() | xrLocateSpace 返回当前、过去和未来的预测姿势。 |
xrEnumerateReferenceSpaces() | 可用的引用空间类型由 xrEnumerateReferenceSpaces 指示。 请注意,也可以创建其他空间,例如由 xrCreateActionSpace 创建的姿势动作空间,该 API 未枚举这些空间。 | |
xrGetReferenceSpaceBoundsRect() | 调用时,xrGetReferenceSpaceBoundsRect 应返回没有障碍物的矩形范围,直至地面,允许用户在保持跟踪的同时自由移动(如果该参考空间可用)。 并非所有系统或空间都支持边界。 如果运行时无法为给定空间提供边界,XR_SPACE_BOUNDS_UNAVAILABLE 将被返回并且边界的所有字段将被设置为 0。 |