EP.001 — ← 返回日志

USD 基础

持续更新的笔记:USD 变化很快,我会尽量让这个页面保持更新 —— 新术语、更好的示例, 以及流程笔记。最近更新于 2026 年 1 月 12 日。

这篇文档是我的个人学习笔记。想更深入了解 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 文件扩展名及其含义:

为什么 USD 文件被称为层(Layer)?

这是因为我们可以将多个 USD 文件组合(分层)在一起,构建出一个完整场景。你可以用截然不同的底层层级结构,搭建出完全相同的 USD 三维场景:

USD 组合弧(Composition Arcs)

USD 层是如何组合在一起构建三维场景的。

Sublayer(子层)

将 USD 文件加入场景最基础的方式。它会告诉 USD 直接把所选文件中的 Primitive 加入场景,不做重命名或重新定位。

Reference(引用)

Reference 通常用于将单个资产组装进场景与镜头当中。

Sublayer 与 Reference 的主要区别:

其他我还在学习、笔记尚未补全的组合弧:Payload、Variants、Inherits、Specializes。

Opinion(表态值)

当我们为 USD 的某个属性设置一个值时,就表达了一个 Opinion。有 Opinion 永远比没有 Opinion 的优先级更高。

编写 USD 层

保存方式

Configure Layer

将上方的节点树保存为一个 USD 文件。

Output Processors(输出处理器)

保存动画

对于多镜头场次,可以遵循以下流程:

  1. 创建一个 Configure Layer 节点并指定帧范围。
  2. 在 USD ROP 中,将 Frame Range 设置为 "Render Frame Range From Stage"。
  3. 为每个镜头配置一个层,并使用 switch 节点在不同镜头之间切换 —— 这样每次渲染不同镜头时,就不需要在 USD ROP 中重新调整帧范围。

← 返回日志