优化 visionOS 自定义环境
Optimize your custom environments for visionOS
2025年6月9日
一句话判断
1 亿面的渲染级场景压到 20 万面以内跑在 Vision Pro 上——这不是魔法,是一套用 Houdini 做的程序化优化流水线,核心武器是 Immersive Boundary 视角裁剪 + 烘焙光照。
这场 Session 讲了什么
Session 用月球环境作为案例,走了一遍完整的 3D 环境优化流程。从 1 亿多面的预渲染级资产出发,通过几何优化(自适应减面、Billboard 远景替换、遮挡剔除)、UV 投影(多视角球面投影 + 屏幕空间 texel 密度分配)、纹理烘焙(球面渲染 + 表面直接投影)三个阶段,最终压到 18 万面、250MB 纹理内存、100 draw calls 以内。
全部操作基于 Apple 提供的 14 个 Houdini Digital Assets(HDA),每个工具都是程序化的、可复用的。Session 不是泛泛而谈”你要优化”,而是给出了具体的参数设置、工具配置和数字对比。
值得深挖的点
Immersive Boundary 是优化的核心锚点
Vision Pro 全沉浸模式下,用户只能在几米范围内物理移动(Immersive Boundary)。这意味着你可以精确知道用户可能在哪些位置、朝哪些方向看。这个信息是所有优化的出发点:
- 自适应减面:从 Immersive Boundary 内的多个采样点出发,计算每个三角形的视觉重要性。轮廓边缘保留更多面,平坦区域激进减少。保留细节 vs 删除冗余的判断完全基于”用户实际能看到什么”。
- Billboard 远景:1-3 公里外的物体深度感知已经很弱,可以把 3D 几何拍平成 Billboard。Session 用实际顶点构建轮廓(不用透明贴图),从用户视角投射到远处的简单形状上再重新三角化。
- 遮挡剔除:从采样点做光线投射,被遮挡的三角形直接从几何体中删除——不是运行时剔除,是永久删除。
三步叠加,1 亿面 → 35 万面(减面 + Billboard) → 18 万面(遮挡剔除),而且从用户视角看几乎无感知差异。
球面 UV 投影解决 texel 分配问题
Immersive Boundary 之外的几何,传统的按面积分配 UV 的方式会浪费 texel——远处物体用了很多像素但用户根本看不清。解决方案是球面投影:想象一个包围用户的球,把环境投影到球面上。这样 texel 密度自动按屏幕空间分配——远处的面拿到更少的 texel,近处的面拿到更多。
但单次投影不够:某些面在一次投影中被遮挡或 UV 重叠。所以需要 Mesh Partition 工具把几何切成小段,每段从最优视角单独投影。最终整个环境(几公里的地形)压缩到两张纹理贴图:Boundary 内一张(按面积),Boundary 外一张(按屏幕空间)。
纹理烘焙:从 GB 级降到 MB 级
原始资产有几十 GB 的 PBR 贴图。烘焙策略是两种投影混合:球面渲染(捕获远距离全局光照)+ 表面直接投影(把高模细节投射到低模 UV atlas,类似游戏里常用的高模烘焙到低模)。合成后作为 unlit 材质使用。最终几十 GB → 不到 250MB。
USD 层级与 Frustum Culling
优化后的几何不能整体导出——GPU 每帧要发送所有三角形。正确做法是用 USD 层级划分场景,让渲染器做 Frustum Culling。Boundary 内用 Boundary Partition HDA 分割,Boundary 外用 Frustum Partition HDA 分成逐渐变大的瓦片。Partition 工具生成 name 属性和 group 属性,在 Solaris(Houdini 的 USD 编辑器)中映射为 geometry subsets,运行时自动做视锥剔除。
代码片段
HDA 工具链概览(非 Swift 代码,是 Houdini 节点流)
Session 的核心不是代码而是 Houdini 节点流。14 个 HDA 的典型使用顺序:
- Boundary Camera:可视化 Immersive Boundary,提供多视角参考相机
- Boundary Samples:在 Boundary 内生成采样点,后续所有工具共用
- Adaptive Reduce:基于采样点的自适应减面
- Vista Billboard:远处几何转 Billboard
- Remove Backfaces + Occlusion Culling:两步剔除不可见面
- Mesh Partition + Multi-Projection:几何切分 + 多视角 UV 投影
- Boundary Partition + Frustum Partition:为 Frustum Culling 准备 USD 层级
- Solaris 导出:设置 geometry subsets,完成 USD
最佳实践
如果你的 visionOS App 使用自定义环境(而非系统环境),这套工作流是目前最完整的优化方案。Houdini 的 14 个 HDA 都可以从 developer.apple.com 下载,附带 README 说明每个工具的参数。
优化顺序很重要:先几何(减面 → Billboard → 剔除),再 UV(切分 → 多视角投影),再烘焙(球面渲染 + 表面投影),最后 USD(层级划分 → subset 设置)。不要跳步——每步的输出是下一步的输入。
Immersive Boundary 的采样点数量直接影响优化质量。更多采样点 = 更精确的减面和剔除,但也意味着更长的计算时间。从少量采样点开始迭代,逐步增加直到视觉差异消失。
还有什么值得关注
- 多 Immersive Boundary 支持:如果你的环境有多个用户位置(比如传送门体验),可以用多组采样点优化,共享同一几何和纹理。
- Houdini 免费学习版:SideFX 提供免费的 Houdini Apprentice 版本,可以用来学习和试验这些工具,但不能用于商业项目。
- “Optimize your 3D assets for spatial computing”(WWDC24):Session 提到的前置知识,讲从图形学角度理解 Vision Pro 的渲染特性。
- Reality Composer Pro 集成:最终的 USD 资产可以直接导入 Reality Composer Pro 或 Unity,不需要额外转换。