大多数浏览器和
Developer App 均支持流媒体播放。
-
为空间计算优化 3D 素材资源
深入了解创建优化 3D 素材的端到端流程。探索使用数字内容创建工具来优化网格、材质和纹理的推荐做法。了解如何利用 Shader Graph、嵌入和材质实例来优化 3D 场景,同时提升性能。充分利用原生工具,更有效地处理素材并提升 App 的性能。
章节
- 0:00 - Introduction
- 1:05 - Before you begin
- 2:21 - Polygon count
- 2:59 - Export from DCCs
- 6:25 - Efficient texture use
- 13:07 - Optimizing materials
- 15:07 - Sky dome setup
- 16:03 - Image-based lighting
资源
相关视频
WWDC24
-
下载
大家好 我是 Scott Wade 是负责 Apple Vision Pro App 和内容的技术美术师 欢迎观看 “为空间计算优化 3D 素材资源”讲座
在本次讲座中 我将通过这个示例场景来讲解 可以采取哪些措施 确保内容呈现出最佳效果 你可以下载与本次讲座相关联的 示例 跟着一起操作 Apple Vision Pro 的 高分辨率显示屏和高帧率 能为用户实现非凡的体验 而这些特点让 Apple Vision Pro 的内容开发 与你以往使用的平台有所不同 在本次讲座中 我们将探讨 在开始创建 3D 内容之前 你应牢记的几个关键注意事项 然后 我们将探讨针对 多边形数量应设定怎样的目标 从所选的内容创作工具 导出内容时需要注意什么 如何有效使用纹理内存 如何优化材质和着色器 有关设置天空穹顶的技巧 最后 我们还会探索如何 高效地自定基于图像的光效
首先 我们来了解一下 准备阶段应注意的几个方面 开始创建素材之前 首先要考虑的是 你的内容 将以何种方式呈现在观众面前 是通过具备大量素材的 沉浸式 App 呈现? 还是通过你构建的空间容器呈现? 你的内容是否会呈现在共享空间中 也就是说可能需要 并行渲染其他应用程序? 尤为关键的是 用户输入是否会影响 内容的呈现? 所有这些因素 都会影响应用程序的表现 并可能需要不同的内容优化 观众视角如此重要的原因就是 在 Apple Vision Pro 中 GPU 仅负责你实际渲染的像素 而不涉及透视视频 因此 GPU 工作负载会根据 App 在观众视野中的大小而变化 这意味着 渲染非沉浸式场景 可能会快得多
相比之下 沉浸式场景渲染的是 整个视图的每一帧图像 这意味着 GPU 必须 另外渲染数百万像素
因此 在没有进行测试的情况下 很难给出具体的性能目标 所以你应该及早进行测试 处于共享空间内的 App 可能会与其他应用程序同时运行 但沉浸式 App 可能会显著占用更多 屏幕区域 从而增加每帧的渲染时间 正因如此 沉浸式应用程序 通常需要更多的优化工作 场景的多边形数量 以三角形个数为计量单位 这是一个关键性能指标 需要特别注意 一般来说 我们建议沉浸式场景中的 三角形数量不超过 50 万个 对于共享空间中的应用程序 三角形数量最好不超过 25 万个 请记住 这在很大程度上取决于 观众在任意时间所看到的内容 此外 我们还建议将像地形 这样的大型对象分割成块 这样 当某一块不在摄像头范围内时 就可以将它剔除 不进行渲染 如果你想更谨慎点 请尽量将视野中三角形的数量 控制在 10 万个左右 因为这能为你提供充足的余量 在开始构建内容之前 牢记以上几点有助于你合理控制预算
接下来 你可能想问 可使用哪些 App 来创建和编辑内容
幸运的是 你有很多选择 因为关键是 能够以 USD 格式保存你的作品 考虑到这一点 Blender、 Autodesk Maya、SideFX Houdini 等应用程序都是不错的选择 你可以访问 openusd.org 进一步了解 USD 生态系统 我将使用 Blender 4.1 所以让我们切换一下
现在 我会重点处理大型场景中的 几个独立素材 我已根据这些素材 距离观众的远近情况 用适当的多边形数量进行了建模 这可能不好判断 因此 我会选择 在场景中创建一个摄像头 帮助我从观众的视角 直观地查看所呈现的内容 我将摄像头放置在平均视线高度 也就是场景中心的 1.5 米处 现在 我可以旋转摄像头 大致了解一下我的内容 在观众眼中的大小情况
我准备将素材以 USD 格式导出 但这意味着 我们需要选择 要使用的特定 USD 文件类型 因为存在多个类型 让我快速介绍一下 各个类型的适用情况 USDA 是一种 ASCII 格式 这意味着它能以纯文本形式阅读 USDA 适合存储协作文件 例如 多人进行编辑的场景 这也是 Reality Composer Pro 将它用作场景格式的原因 文本格式也可以解决合并冲突 适合多人同时处理同一个文件的情况 USDC 是一种二进制格式 虽然可以使用各种兼容 USD 的 App 打开这种格式的文件 但它无法以纯文本形式阅读 但这种格式存储大量数据的效率更高 比如几何图形
USDZ 是一种压缩格式 如果你以前使用过 AR 素材 你可能对它比较熟悉 USDZ 会收集资产的所有依赖项 比如纹理 然后为它们创建一个内部的文件结构 因此 USDZ 非常适合 发布和分发素材 但必须先解压才能进行编辑
我的素材主要是几何图形 因此 我会将它另存为 USDC 格式
虽然我已在 Blender 中设置了材质 但我会取消选中材质 因为我想利用 Reality Composer Pro 的 Shader Graph 功能 然后点按“Export USD” 将文件添加到 Reality Composer Pro 的项目浏览器 并将它添加到我的场景中 你会有两点发现
首先你会看到紫红色 说明 Reality Composer Pro 在提示我们没有分配任何材质 这是正常现象 你还会发现 对象已旋转
那就让我来介绍一下坐标系统吧
Reality Kit 使用的坐标系统 假设 -Z 表示前进 Y 为向上 +X 为向右 而 Blender 的 Z 表示向上 Y 表示前进 还有一些其他的应用程序 也可能使用不同的单位尺度 RealityKit 使用的是米 如果你导入的内容已经应用了尺度 这可能就是原因 务必在开始之前就对素材的 导入功能进行测试 以便制定一致的计划 解决任何不一致的问题
macOS 今年新增的一项功能是 允许在“预览”中更改坐标和尺度 请观看讲座 “USD 和 MaterialX 的新功能” 了解更多信息 将素材导入 Reality Composer Pro 后 我会对它们进行调整 对 X 轴应用 -90 度旋转
现在让我们继续应用纹理 看看如何更高效地打造纹理 我们将使用 Reality Composer Pro 的 Shader Graph 来设置材质和纹理 如果你需要关于在 Shader Graph 中 设置材质的入门介绍 强烈建议你观看 “探索 Reality Composer Pro 中的材质” 这场 2023 年的讲座 我已经为这个素材创建 并应用了基本的 PBR 材质 现在只需要应用纹理即可 项目浏览器中已有这些内容 我可以进入材质 然后选择文件引用来添加我的基本色
当你添加彩色图像时 你还需要选择一个色彩空间
我们来快速了解一下 与纹理相关的色彩空间 在 Reality Composer Pro 中 色彩空间为两个术语 中间是破折号 例如“sRGB - Display P3”
第一个术语是转换函数 它定义了对值进行编码的曲线 sRGB 专门用于“感知”纹理 我们可以直接在渲染器中 看到这类纹理 比如 基本色或无光照颜色 Linear 用于数据或 HDR 图像 第二个术语是色域 它定义了色彩空间的最大范围 Vision Pro 将 Display P3 用作原生显示色域 但当你在 Xcode 中构建 App 时 使用其他色域的纹理 将转换为 Display P3 确保你选择最初创作纹理时 使用的色彩空间 这样才能获得一致的表现效果 我的纹理是使用 sRGB Display P3 创作的 所以我将选择这一选项
现在 我将添加粗糙度和 环境光遮挡的纹理
你会发现 这些灰度纹理 没有色彩空间的选项 这是因为 Shader Graph 将它们正确地假定为数据 这意味着我们不希望 对它们应用任何转换 不过 在构建 App 时 这些灰度纹理不会被压缩 这意味着 它们将占用 比实际所需更多的空间 有一种方法可以解决这个问题 这就是“纹理打包”
纹理打包就是将不同文件中的 纹理数据合并到一个更大的文件 通过利用颜色纹理的不同通道 来实现这一目的 例如 我们可以利用粗糙度、 金属和环境光遮挡纹理 并分别对它们应用红色、 绿色和蓝色通道 然后将这些数据合并到 一个纹理文件中 这个 RGB 纹理还有个特点 现在 当我们构建 App 时 它会进行压缩 将灰度纹理打包在一起 可将 PBR 素材的总大小 减少多达 40% 添加了打包纹理后 我就会为这一节点选择 vector3 类型 以便着色器知道这是一个数据纹理
这样就不会应用色彩空间转换 要将 RGB 纹理拆分到单独的通道中 我将使用 Separate 3
然后 我可以将粗糙度和环境光 遮挡纹理与单独输入点关联起来
现在 我们来添加法线贴图 法线贴图被视为数据 因此我们仍将使用 vector3 类型
但是 当我们连接这一纹理时 素材突然变得不对劲 别担心 如果你的法线贴图看起来 不对劲 通常主要是因为两种问题 格式不正确和数据范围不正确 法线贴图有两种常用格式 分别是 OpenGL 和 DirectX RealityKit 使用了 OpenGL 格式的法线贴图 两者看起来可能很相似 但 DirectX 格式中的绿色通道是反转的 在我的示例中 我的纹理 采用了 OpenGL 格式 下面我们来探讨数据范围问题
我们的材质需要数据范围 从 -1 到 1 的法线贴图 但示例中的图像 却仅包含 0 到 1 之间的值 要调整图像的范围 我们需要做一些数学运算 乘以 2 就会将范围增加到 0 到 2
然后减去 1 将范围向下移动到 -1 到 1
这样看起来就很棒了! 幸好 RealityKit 有一个节点 可以一步到位完成这种操作 称为“Normal Map Decode”
提醒一下 你可能注意到 Shader Graph 中 还有一个名为“NormalMap”的节点 与 Blender 的同名节点不同 这个节点不会更改纹理的范围 请务必阅读节点上的工具提示 以防它们与其他应用程序有所不同 完成这个操作后 我的素材现在看起来很棒了
不过 要是不用对每项素材 都做这样的设置就好了 幸好 Reality Composer Pro 的 “材质实例”可以实现这一目的 “材质实例”是重复使用 某种材质逻辑的理想方式 同时能够更改公开的参数 这样可以在设置素材时节省时间 这对 App 表现也大有裨益 因为引擎不需要载入相同 Shader Graph 的冗余副本 目前 我们的材质中 还没有任何公开的参数 因此 每个实例都是相同的 在本例中 我将选择所有的文件引用 点按右键并提升为输入参数
你会发现 现在可以在右侧面板中 访问这些输入参数了 现在 点按右键我的主材质 并选择“Create Instance”
可以看到纹理输入参数 是可以编辑的 虽然我没法编辑基本图表 我将在下一个素材中进行添加
而且我还会重命名我的材质实例 这样我就知道它所适用的素材
在我应用时 大家可以看到 它仍在使用旧版纹理
但现在 当我选择相应实例时 我可以换上我的基本色、 法线贴图和打包纹理
这样一来 每次创建素材时 我就无需再次拆分已打包的纹理 也不用更改法线贴图上的范围了 现在 我们已经设置了第二项素材 用时比设置第一项素材要短得多 接下来 我们来了解一下场景 并探讨优化的材质和着色器选择 我导入了之前看到的场景 以搭配我的独立素材看看效果
整个场景使用无光照材质 其中大多数素材仅使用单种材质 为了实现这种效果 我使用了像 Blender 这样的外部 应用程序来设置光效 然后将所有阴影信息烘焙到 每个对象的单一纹理中 在 RealityKit 中使用 实时光源对性能有影响 我们建议慎重使用动态光源 并尽可能进行烘焙 大家还会注意到 我的场景被拆分为多个块
这一点很重要 因为这样 可以确保不可见的实体 在摄像头范围外时被剔除
如果在 Blender 中查看我的场景 并应用棋盘格材质 你也可以看到 随着距离的增加 我的纹理分辨率下降了多少 事实上 我的纹理分辨率 有一半以上 是专门用于渲染观众周围 5 到 10 米范围内的细节 如果观众不太移动 我们强烈建议根据距离和屏幕尺寸 调整纹理分辨率
即使是无光照场景 也需要考虑到 Alpha 透明度的使用 应该尽量少用 Alpha 透明度
透明材质往往伴随着高开销 因为 GPU 需要重复计算 每一个透明图层的 相同像素 这种情况被称为过度绘制 尤其是很多透明图层 都堆叠在一起时 就会变得非常麻烦
比如 我的草丛可能看起来 像是使用了透明纹理
但实际上 我使用了 几何图形制作草叶 同样 在灌木上
我使用了不透明的核心结构 只在边缘处添加了透明卡片 这样它们的效果最为显著 这会增加多边形数量 但根据经验 为了减少透明像素 而选择使用更多的三角形 往往是一种明智的折衷方案 当然前提是 不能超过 三角形的总体预算 准备好场景后 现在我们需要一个天空穹顶 否则 我们的观众将会看到 场景边缘之外的 透视环境
在我的示例中 我将使用 在 Blender 中创建的倒置球体 但你可以使用任何你喜欢的几何图形 只要确保图形足够大 或距离用户足够远就可以 我的球体直径约为 500 米
你的天空穹顶或天空盒 应具有分辨率相当高的纹理 对于像这样一张细节丰富的图像 至少需要 8K 水平分辨率 甚至可能需要更高分辨率 以减少模糊度
鉴于这个纹理的尺寸 如果 有部分内容不必呈现给用户 最好进行裁剪 在本例中 我将裁剪地平线以下部分 一起来看看我的场景中的天空穹顶 你可以看到仅这一个素材就会 占用多少屏幕空间 在天空穹顶和天空盒上 使用无光照材质非常重要 它们是你应该首先优化的素材
天空盒设置到位 整个场景 就真正实现了浑然一体的效果
但是 如果我们看看 之前的 PBR 素材 可能就会注意到 它们看起来不太对劲 它们的光效似乎与 场景中的其他部分不一样 有些高光明显并非来自太阳光 这些高光应该显示在素材后方 这是因为我们的天空穹顶 只是一个网格 它实际上对 PBR 素材的 光照情况没有任何影响 为此 我们需要了解如何 实现基于图像的自定光照 你可能熟悉基于图像的光照 也就是 IBL 但大体上就是我们要使用 2D 图像 代表环境为素材添加阴影 在 RealityKit 中 PBR 材质 使用的就是这种阴影处理方法 使用基于图像的光照 主要是为了 让你的材质能够动态响应 现实世界环境的变化 比方说用户打开房间的灯 这对于某些体验来说非常合适 但在这个场景中 我只希望素材的光照效果 贴合我所创建的环境 而非现实世界环境 为此 我们需要添加几个组件 首先 我会创建一个新的转换组件
并将它命名为“IBL” 这样我就知道它的用途了
然后我将附加一个 “Image Based Light”组件
我将在这里添加场景的 预渲染高动态范围图像
这是少数几种需要使用 HDR 格式 才能确保出色显示效果的纹理之一
IBL 纹理应采用 Lat/Long 格式 也称为“等距圆柱投影” HDR 纹理的载入和渲染开销很大 但是因为我的场景中 没有很多高反光的物体 我将使用非常小的纹理 这个纹理在宽度 512 像素下 就已经可以呈现不错的效果 这意味着它的大小只相当于 我的天空穹顶纹理的一小部分 只要没有类似镜面的表面 通常不需要比这更高的分辨率
你会注意到我们的图像 还没有反映到我们的素材上
这是因为我们还需要添加一个东西 Image Based Light Receiver 组件 我将为 PBR 对象选择父节点 并在这里应用我的接收器
这将会应用于所有子实体 现在我只需要选择之前创建的 IBL 实体 将它们关联起来 这就是我一定要标记它的原因
现在你可以在素材中 看到场景的光效和反射
总结一下 天空盒应该是一个 大的低动态范围纹理 最好使用无光照材质 IBL 应该是 Lat/Long 格式的 HDR 纹理 最好使用较低的分辨率 并且你需要添加基于图像的光照组件 和相应的接收器组件来查看效果 有时候 你需要的材质 比无光照颜色复杂一些 但又无需采用全面的 PBR 着色器 在这种情况下 我们可以使用 Shader Graph 中的 Environment Radiance 节点 这个车轮应该有金属轮圈 但因为它经过了烘焙处理 视觉效果就不太像金属
远距离看起来可能没问题 但近距离观察 你就会发现没有反射 你可能认为 为了解决这个问题 我们应该使用 PBR 材质 而不是无光照材质 与我们对前面素材的处理一样 但实际上 有一种方法可以在使用 无光照着色器的同时实现这一效果 在我已分离出的素材材质图表中 我将使用 Environment Radiance 节点
这样我就可以在无光照图表中 使用来自 IBL 的阴影信息 如果我们来看 Environment Radiance 节点的镜面反射输出 我们可以看到场景倒影 会根据视角而发生变化
我们也可以利用漫反射光效 但我们的示例不需要这个 因为它已经烘焙到纹理中了 在本例中 我们只想同时添加 镜面辐射亮度和 烘焙纹理
这样我们就可以创建 视图相关的镜面反射 让材质看起来更像金属
使用 Environment Radiance 节点 比普通无光照材质的成本更高 但它仍然比使用全面的 PBR 材质更划算 它适用于需要呈现出 一定的动态光效 但又不需要使用全面 PBR 的场景 这样我们的场景就完成了 看起来非常棒
最后 我们可以查看 Reality Composer Pro 中的 Statistics 面板 来了解 预算控制情况 三角形数量为 108,000 个 符合我们的多边形数量目标 总计 108,000 个三角形 因为场景被分割成块 用户可能只会在任意时候 看到一半的画面 我们的网格、纹理和材质的 总数相当低 纹理存储空间为 1.2 GB 但请记住 我们的材质 还没有经过压缩处理 当我们在 Xcode 中编译 应用程序时 纹理会被压缩 将占用空间减少到 300 MB 左右 我们还尽量减少了透明材质的数量 并尽可能使用无光照阴影 最后 如果要分析应用程序的 性能和渲染效果 你可以使用 RealityKit Trace 或者 如果你只想调试场景中的实体 或检测哪些部分的代码 导致出现了问题 你可以使用全新的 RealityKit Debugger 请观看以下讲座 进一步了解这些工具
我们已经介绍了在空间计算中 优化 3D 内容的多种方式 提醒一下 尽量控制多边形数量 重点关注同时显示的三角形数量 根据素材在屏幕上的大小优化素材 打包纹理以节省内存 并充分利用压缩功能 尽量使用无光照材质和烘焙纹理 当无光照材质无法满足需要时 考虑使用 Environment Radiance 节点 最后 使用大型天空盒纹理 和小型 IBL 纹理
如果你想进一步了解 如何为你的沉浸式 App 创建逼真的自定环境 请观看这里列出的讲座 将以上内容熟记于心 你就能为 Apple Vision Pro 创建出高性能、 高保真的 3D 内容 很期待看到大家在空间计算环境中 创建的精彩内容 谢谢!
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。