这篇文档是我的个人学习笔记。想更深入了解 USD,可以访问 openUSD.org。
什么是 USD?
Universal Scene Description(USD)是一套用于描述、存储和交换完整 3D 场景的框架,同时也是一系列文件格式的统称。它不仅仅保存几何体,还能以结构化、可扩展的方式打包制作场景的许多部分,包括几何体与属性、材质、动画、灯光、摄像机、实例化以及渲染设置。由于它同时支持标准化的场景表达方式与资产组装、更新的工作流程,USD 场景可以在大多数专业特效与三维软件之间可靠地加载与共享。
USD 可存储的数据类型
- 几何体
- 几何体属性
- 材质
- 动画
- 灯光
- 摄像机
- 渲染设置
- 实例
为什么 CG 行业正在转向 USD
USD 之所以重要,是因为它让复杂三维项目的协作变得切实可行。团队不再需要依赖一套庞大的定制流程来保持同步,而是可以基于一套在制作规模下依然稳定的共享场景描述,共同处理同一批镜头和场次。
USD 也是为非破坏性工作流而生的。它通过分层的 Opinion(表态值)让场景数据始终保持"可编辑"的状态,因此可以在不拆散整个场景的前提下添加、覆盖或撤销修改。这种结构让迭代变得更安全、更可预测 —— 尤其是在多个部门同时处理同一批资产时。
另一大优势是长期的一致性。当资产或场景组件被更新时,这些更新可以传播到整个镜头甚至整个场次,减少重复的手动修正,并保持画面观感与布局的一致。
USD 在设计上就是为了高效处理重量级场景。随着项目规模增长,它依然能保持良好性能,并支持 Variant(同一资产的多个版本)和 Payload(按需加载所需内容)等智能策略。这让 USD 对资产格外友好:你可以在不同软件之间保留材质、指定关系与渲染相关属性,而不必每次传输数据都重新搭建一遍。
最后,USD 不只是一种文件格式,更是一种流程思维方式。越来越多专业特效与三维软件开始支持它,行业趋势也明显在朝着以 USD 作为场景组装、协作与渲染标准的方向发展。如果你在 Houdini 中工作,Solaris 是目前最完整的创作环境之一,能让你以结构化的方式充分利用这些 USD 工作流程。
TL;DR
- 大规模协作:团队无需搭建庞大的定制流程,也能共同处理同一批镜头/场次。
- 非破坏性工作流:分层的 Opinion 让你可以干净地覆盖、迭代和撤销修改。
- 一致的更新:资产与场景的修改可以传播到整个镜头甚至整个场次。
- 应对重量级场景:专为高效管理复杂、数据密集的环境而设计。
- 对资产友好:可跨软件保留材质/指定关系/渲染属性,并支持 Variant 与 Payload。
- 高效加载与更小的文件:模块化结构与基于 Payload 的加载方式降低内存占用,让文件体积保持可控。
- 渲染集成:专为与现代流程中的渲染引擎顺畅衔接而设计。
- 行业趋势:广泛的 DCC 软件支持,并正强势走向成为三维协作与场景组装的行业标准。
- Solaris(附注):一个强大的 USD 创作环境,能在实践中清晰体现上述优势。
USD 中的层(Layer)是什么?
一个 USD 层本质上就是磁盘上的一个 .usd 文件。以下是一些常见的 USD 文件扩展名及其含义:
.usda— 人类可读的 USD 文件类型。- 文件体积更大,但适合作为"指针文件"或用于调试。
.usdc— 二进制编码的 USD 文件类型。- 文件体积更小、效率更高,但不可读。
.usd— 可以是以上任意一种格式,但通常是.usdc。.usdz— 将所有依赖的层文件与贴图打包在一起。- 不太适合用于生产环境的特效流程。
- 通常用于手机 AR 应用。
为什么 USD 文件被称为层(Layer)?
这是因为我们可以将多个 USD 文件组合(分层)在一起,构建出一个完整场景。你可以用截然不同的底层层级结构,搭建出完全相同的 USD 三维场景:
- 分层方式:多个底层层级指向
.usd文件,自动更新,文件体积小(仅作为指针使用)。 - 展平(Flatten)方式:单一层,所有信息都被烘焙进去,不会自动更新,文件体积大。
USD 组合弧(Composition Arcs)
USD 层是如何组合在一起构建三维场景的。
Sublayer(子层)
将 USD 文件加入场景最基础的方式。它会告诉 USD 直接把所选文件中的 Primitive 加入场景,不做重命名或重新定位。
Reference(引用)
Reference 通常用于将单个资产组装进场景与镜头当中。
Sublayer 与 Reference 的主要区别:
- Sublayer 会引入整个场景,路径不可修改。
- Reference 会将某个特定 Primitive(及其子级)引入场景,路径可以修改。
其他我还在学习、笔记尚未补全的组合弧:Payload、Variants、Inherits、Specializes。
Opinion(表态值)
当我们为 USD 的某个属性设置一个值时,就表达了一个 Opinion。有 Opinion 永远比没有 Opinion 的优先级更高。
编写 USD 层
保存方式
- Flatten implicit layers —— 当你与他人协作、需要 Sublayer 引入其他 USD 文件时使用。
- Flatten all layers —— 当你独立工作、所有内容都放在同一个文件中时使用。
Configure Layer
将上方的节点树保存为一个 USD 文件。
Output Processors(输出处理器)
- Copy All Assets to Referencing Layer Directory —— 将所有贴图保存到磁盘。使用时请务必指定文件夹名称,并确保该处理器排在最上层。
- Save Paths Relative to Output Path —— 例如使用
./data/camera.usd,而不是$HIP/usd/RBL3_0101_lgt_v002/export_v006/data/camera.usd。
保存动画
对于多镜头场次,可以遵循以下流程:
- 创建一个 Configure Layer 节点并指定帧范围。
- 在 USD ROP 中,将 Frame Range 设置为 "Render Frame Range From Stage"。
- 为每个镜头配置一个层,并使用 switch 节点在不同镜头之间切换 —— 这样每次渲染不同镜头时,就不需要在 USD ROP 中重新调整帧范围。