在开发 VR 项目时,我们经常会遇到一个老问题:
当场景模型、灯光和后期太复杂时,VR 双目渲染(2Pass Rendering) 会让帧率暴跌。尤其是需要保留远处复杂地形、建筑、云层、反射等细节时,即使是高端显卡也吃不消。
远景为三维场景

那有没有办法,既不降低画面真实感,又能让性能恢复流畅?
答案是 ------ 用双目立体全景图替代远处场景,制作立体天空盒背景。
远景优化为天空盒

🧠 原理简述:普通天空盒 vs. 立体天空盒
普通天空盒的问题
传统的天空盒只是一张单眼 360° 全景图或立方体贴图(Cubemap)。
虽然在普通显示器上看起来真实,但在 VR 中会出现明显的空间错觉 :
当用户用双眼观察远处的建筑或山体时,立体视觉会告诉大脑------"那是一张贴在无限远处的平面",而不是有深度的世界。
结果就是:
- 天空和近景之间的过渡不自然。
- 当近景被裁剪掉时,双眼会察觉到"近处是空的",背景贴图突然变成"天幕"。
立体天空盒的改进
通过渲染双目立体全景图 (左眼 + 右眼各一幅),我们可以让天空盒本身就带有左右视差。
这样 VR 用户在转头或聚焦远方时,依旧能感受到真实的空间深度,过渡也更加自然。
换句话说,就是让远处的世界以立体形式被"烘焙"到天空背景中。
🧩 获取双目立体全景图(Panoramic Capture)
在 Unreal Engine 里,可以使用 Panoramic Capture 插件 来渲染立体全景图。
该插件会自动从当前相机渲染出上下分布(Top/Bottom)的左右眼全景图。
⚠️ 但 UE5.3 的 Panoramic Capture 插件存在一个小 Bug:
当设置自定义输出目录时,即使路径是绝对路径,也会提示"找不到目录"。
目前的解决方案是使用默认目录"
.(当前目录)",输出文件会保存在:
<UE安装目录>\Engine\Binaries\Win64\<日期时间>\FinalColor例如:
D:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64\2025.11.08-20.21.20\FinalColor
渲染完成后,我们就能得到一张上下分布的双目立体全景图 (上半部分为左眼,下半部分为右眼)。

🧱 在 Unreal 中创建立体天空盒材质
接下来,我们需要一个能够识别左右眼的材质,用这张上下分布的贴图作为VR 双目天空背景。
1️⃣ 获取当前渲染的眼睛(左眼或右眼)
在材质编辑器中创建一个 Custom 节点,输入以下代码:
hlsl
return ResolvedView.StereoPassIndex;
- 返回
0表示当前是左眼 Pass。 - 返回
1表示当前是右眼 Pass。
这是 Unreal 渲染系统内部提供的视图信息接口,能让我们知道当前渲染的哪只眼睛。

2️⃣ 根据眼睛选择贴图上下半区
获得 StereoPassIndex 后,我们就能动态决定采样贴图的哪一部分:
hlsl
float2 GetStereoUV(float2 uvBase, float EyeIndex)
{
float2 uv = uvBase;
// 左眼采样上半部分 [0, 0.5)
// 右眼采样下半部分 [0.5, 1.0)
if (EyeIndex < 0.5)
uv.y = uv.y * 0.5;
else
uv.y = uv.y * 0.5 + 0.5;
return uv;
}

把这段逻辑放进材质的第二个 Custom 节点,输入:
uvBase:普通 equirect 球面映射 UV(可以用 PixelNormalWS + atan2 算出)EyeIndex:第一个 Custom 节点输出的 StereoPassIndex
输出接到 TextureSample 的 UV,就能让左右眼分别从贴图的不同半区采样,实现真正的立体天空盒。
3️⃣ 完整材质设置
- 材质类型:Unlit(无光照)
- 两面渲染:勾选 "Two Sided"
- 输出 :只接到
Emissive Color - 贴图:上下分布的双目立体全景图
然后将该材质应用到一个反转法线的球体模型上。这样用户在 VR 中看到的就是一张带深度的立体天空背景。
🚀 实际效果与性能收益
这种方法的优点非常明显:
| 项目 | 普通天空盒 | 双目立体天空盒 |
|---|---|---|
| 视觉沉浸感 | 单眼平面,缺乏空间深度 | 真正立体,远景过渡自然 |
| 性能消耗 | 极低 | 略高,但远低于保留真实几何体 |
| 实现复杂度 | 简单 | 中等(需要自定义节点) |
| 推荐使用场景 | 静态或非 VR | VR、大场景、高性能要求 |
在实际项目中,我们通常这样组合使用:
- 近景:保留真几何模型
- 中远景:Bake 成双目全景图 + 替换为立体天空盒
- 天空层:使用动态云或天空光
这样既能保留 VR 的沉浸感,又能大幅减轻 GPU 负载。
实际效果

去掉天空盒效果

🧩 小结
通过上面的方式,我们成功地将一个原本复杂的场景"压缩"为一张双目立体全景图,并通过 Unreal 材质系统识别左右眼 Pass,从而构建出一个立体天空盒背景。
核心关键点:
hlsl
// 获取当前渲染眼睛
return ResolvedView.StereoPassIndex;
// 根据左右眼分区采样贴图
if (EyeIndex < 0.5) uv.y *= 0.5;
else uv.y = uv.y * 0.5 + 0.5;
这套方案在 VR 项目中非常实用,尤其是需要兼顾画面与性能时。