Table of Contents

启用 VR

入门 程序员

本页说明如何为游戏添加对 Oculus Rift 和 Vive 设备的支持。Stride 目前尚不支持其他 VR 设备。

  1. 在资产视图(默认位于底部窗格)中,双击**图形合成器(Graphics Compositor)**资产。

    图形合成器资产

    图形合成器编辑器随即打开。

  2. 在图形合成器编辑器中,选择**前向渲染器(forward renderer)**节点。

    选择前向渲染器

  3. 在属性网格(默认位于右侧)中,展开 VR Settings。

    VR 设置

  4. 在 Required APIs 旁边,单击 绿色加号按钮(添加)。

    Game Studio 会向列表中添加一个新的 API。

    添加 VR 项

  5. 在 Item 下拉菜单中,选择你的游戏要支持的 VR API。

    添加 API

    API 说明
    Oculus 支持 Oculus Rift 设备(对 Oculus Rift 的支持最好)
    OpenVR 支持 Vive 和 Oculus Rift 设备(对 Vive 的支持最好)
    Dummy 在屏幕上使用两个摄像机(每只眼睛一个)显示游戏,而不是在 VR 设备中显示。这主要用于开发。要在 Game Studio 场景编辑器中显示 Dummy 视图,请确保编辑器已连接到前向渲染器。
  6. 重复步骤 4 和 5,按需添加任意数量的 API。

  7. 确保列表顺序正确。游戏运行时,会按列表顺序尝试使用设备。例如,如果第一项是 Dummy,游戏将不使用任何 VR 设备。如果最后一项是 Dummy,游戏只会在没有可用 VR 设备时使用它。

    要更改顺序,请更改每个项中选择的 VR 设备。

    Tip

    虽然 OpenVR API 同时支持 Vive 和 Oculus Rift 设备,但 Oculus API 对 Oculus Rift 提供更好的支持。因此,在大多数情况下,我们建议按以下顺序排列列表:

    • 项 0:Oculus

    • 项 1:OpenVR

    这意味着如果连接了 Oculus Rift 设备,游戏将使用 Oculus API;如果连接了其他设备(例如 Vive),游戏将使用 OpenVR API。

  8. 启用 VRRendererSettings。

    VR 渲染器设置

你的游戏现在已准备好使用 VR。

Note

更改 API 后,你需要重新加载项目(文件 > 重新加载项目 / File > Reload project),更改才会在运行时生效。

VR 属性

属性 说明
Ignore camera rotation 禁用 VR 设备以外的输入所引起的摄像机移动,有助于减少 VR 晕动症
Resolution scale VR 设备中显示的图像分辨率。分辨率越高,图像越清晰,但对 GPU 的要求也越高。

多重采样抗锯齿

由于走样(锯齿)伪影在 VR 中更加明显,我们建议你在前向渲染器属性(VR 设置上方)中启用 MSAA(多重采样抗锯齿)。

MSAA

Note

Direct3D 11 或更低版本不支持 MSAA。

禁用屏幕同步

为了获得最佳性能,VR 游戏需要以 90 FPS 运行。这意味着你必须关闭与显示器的同步。

目前,这需要通过脚本完成。我们建议你在 IsFixedTimeStep 中使用 IsDrawDesynchronized。

using System;
using Stride.Engine;

namespace VRSandbox
{
    class VRSandboxApp
    {
        static void Main(string[] args)
        {
            using (var game = new Game())
            {
                //VR 需要以 90 fps 运行,必须禁用垂直同步,绘制必须不同步
                //如果使用具有不规则移动的角色控制器,你可能也想将物理时间步长设置为 90 fps,但请尽量避免这样做!尽可能使用运动学(Kinematic)刚体。
                game.IsFixedTimeStep = true;
                game.IsDrawDesynchronized = true;
                game.GraphicsDeviceManager.SynchronizeWithVerticalRetrace = false;
                game.TargetElapsedTime = TimeSpan.FromSeconds(1 / 90.0f);
                game.Run();
            }
        }
    }
}

另请参阅