Axmol v3: VR 引入 OpenXR 运行时渲染路径

发布时间:2026/7/21 8:33:34

Axmol v3: VR 引入 OpenXR 运行时渲染路径 这次更新为 Axmol 带来了真正基于 OpenXR 的 VR 渲染路径。过去的 generic VR renderer 更适合本地预览和调试双眼渲染效果但它并不连接真实头显运行时。现在Axmol 可以创建 OpenXR session渲染到运行时提供的 swapchain提交双眼 projection layer并把手柄输入接回引擎事件系统。从 Renderer 到 Compositor这次重构把场景渲染扩展点从SceneRenderer调整为SceneCompositor。Compositor 负责和一帧画面绑定的场景呈现策略它可以在逻辑更新前轮询运行时事件也可以按普通方式渲染场景或者把同一个场景按多视图、多目标、多运行时 swapchain 的方式组合输出。默认SceneCompositor保持普通渲染行为。VR 现在拆成两条路径VRPreviewSceneCompositor不依赖 XR runtime用于本地双眼预览、畸变网格和调试。VRSceneCompositor基于 OpenXR 的真实 HMD 渲染路径。这样预览路径仍然轻量产品级 VR 路径则可以按运行时要求处理 frame timing、swapchain 和控制器输入。OpenXR 路径做了什么新增的OpenXRDriver驱动 OpenXR 帧管线OpenXR instance、system、session 和 local space。双眼 view configuration 和 swapchain。每帧xrWaitFrame、xrBeginFrame、xrEndFrame流程。把 OpenXR swapchain image 包装成当前 RHI 可渲染纹理。手柄 action set、binding、pose、button、thumbstick 和 interaction profile。VRSceneCompositor则把这些运行时状态接入 Axmol 的帧循环在 scheduler update 前同步 XR 事件和输入根据 runtime 给出的 eye pose 和非对称投影矩阵渲染每只眼睛绘制手柄射线提交 GPU 命令释放 swapchain image最后提交 projection layer。手柄射线接入 PointerEventOpenXR 手柄输入现在会进入两个层级。如果需要 XR 原生语义可以使用XRInputEventListener监听 button、axis、aim pose 和 grip pose。如果要复用现有 UI 和场景交互手柄 aim ray 也会桥接为PointerEvent。现在PointerEvent可以携带PointerType::Controller当前和上一帧 3D ray世界坐标中的PointerHitResult这意味着已有的 pointer listener 可以参与 VR 交互自定义节点也可以覆写Node::onPointerHitTest()来支持射线拾取。Widget、ScrollView、Menu、Terrain 以及相关测试已经适配了这条路径。RHI 层的支撑OpenXR swapchain image 由运行时拥有而不是由 Axmol 创建。为了渲染到这些图像RHI 新增了ExternalTextureDesc用于包装外部 native texture。Renderer 也新增了只提交当前 GPU 命令、不 present 默认窗口 surface 的接口方便 OpenXR compositor 在释放 swapchain image 前确保渲染工作已经提交。对于 VulkanOpenXRVulkanInterop实现了VulkanInterop抽象接口通过Application::registerVulkanInterop()在引擎初始化阶段注入。GraphicsCore原DriverContext在创建 Vulkan 设备时通过该接口向 OpenXR runtime 查询所需的 extension 和 runtime 选择的 physical device核心 RHI 层不再依赖 OpenXR 头文件。如何启用CMake 开启-DAX_ENABLE_VRON -DAX_ENABLE_OPENXRON如果 OpenXR 使用 Vulkan请在applicationWillLaunch()中调用voidAppDelegate::applicationWillLaunch(){#ifdefAX_ENABLE_OPENXRregisterVulkanInterop();#endif}然后安装对应 compositor#ifdefAX_ENABLE_OPENXRrenderView-setSceneCompositor(std::make_uniqueax::VRSceneCompositor());#elserenderView-setSceneCompositor(std::make_uniqueax::VRPreviewSceneCompositor());#endif这是 Axmol VR 栈接入 OpenXR 的关键一步真实运行时 frame timing、头显 swapchain、双眼 pose/projection以及手柄输入都进入了引擎主路径。平台说明本 PR 仅在 Win32 desktop 上验证通过Android 未经测试不承诺兼容。

相关新闻