【译文】【Universal Scene Description - Learn】初识USD
初识USD
什么是USD
能够制作计算机图形电影和游戏的管道,通常会生成、存储和传输大量的3D数据,我们把这些3D数据称之为“场景描述”。管道中的许多合作应用程序(建模,着色,动画,照明,fx,渲染)中的每一个通常都有自己的特殊形式的场景描述,以适应应用程序的特定需求和工作流程,这些特定软件的场景描述是对于其他应用程序既不可读也不可编辑。通用场景描述(USD)是第一个公开可用的软件,它解决了健壮和可扩展的交换和增强任意3D场景的需求,这些场景可能由许多元素资产组成。
USD提供了基本资产(如模型)或动画的交换。但与其他交换包不同的是,USD还支持将任意数量的资产组装和组织到虚拟集合、场景、镜头和世界中,将它们从一个应用程序传输到另一个应用程序,并使用单个、一致的API在单个场景中对它们进行无损编辑(作为覆盖)。USD提供了一个丰富的工具集,用于阅读,写作,编辑和快速预览3D几何,阴影,照明,物理和越来越多的其他图形相关领域。此外,由于USD的核心场景和组合引擎与任何特定领域无关,因此USD可以以一种可维护的方式进行扩展,以编码和组合其他领域的数据。
具体来说,USD是一个在TOST许可下发布的开源项目。
为什么使用USD
USD是皮克斯3D图形管道的核心,用于每个3D创作和渲染应用程序,包括皮克斯专有的Presto动画系统。皮克斯致力于发展和改进USD,以解决以下正在进行的制作问题:
-
为定义、打包、组装和编辑3D数据提供丰富的通用语言,方便使用多个数字内容创建应用程序。
像许多其他交换包一样,USD提供了一个低级数据模型,在“文件格式级别”规定如何对数据进行编码和组织,以及一组(可扩展的)高级模式,为网格或转换等概念提供有意义的API和组织。有了这样的基础,可以创建具有几何,材料,照明和其他属性的资产定义。但USD进一步提供了一组自由组合的合成操作符,可用于打包、聚合、改变和覆盖原始元素和资产,并使用高性能运行时评估引擎,体现在一个紧凑的场景图中,称为Stage,用于解析生成的组合场景描述并从中提取(和创作)数据。 -
允许多个美工在相同的资产和场景上合作。
USD最基本的合成操作符就是SubLayers操作符,它通过允许每个美工在他们自己的文件(称为图层)中工作,使不同部门或同一部门的多个美工可以同时在相同的资产或场景上工作,所有这些(图层)都将按照USD文件中明确规定的强度顺序进行组合和解决。当建模艺术家改变在较弱层中定义的几何结构的拓扑结构时,这种能力并不是一个可以自动调整较强层中的阴影数据的神奇子弹,但它允许每个艺术家独立工作,而无需删除或编辑任何其他艺术家的工作,并有助于提供清晰的更改审计跟踪,有助于解决诸如拓扑变化问题之类的问题。 -
通过最小化延迟来最大化艺术迭代。
与许多媒体一样,实现高质量数字艺术的最重要因素之一是能够快速且频繁地迭代设计、资产和动画。3D美术迭代的最大障碍之一是美术人员获得“足够好的”视觉反馈的速度,以及他们在多个应用程序之间迁移新数据或恢复崩溃会话的速度。速度是皮克斯美国项目的首要目标;我们将继续探索算法改进,利用现代多核系统和GPU的更好方法,以及压缩技术,以最大限度地减少访问远程存储数据的延迟。
如果您的需求与上述需求相似或属于上述需求的一部分,那么USD可能是一个有吸引力的选择。
USD可以做什么
USD可以表现:
USD将数据组织到Prims(“primitive”的缩写)的分层命名空间中。除了子prim之外,每个prim还可以包含属性(Attributes)和关系(Relationships),统称为Properties。属性具有随时间变化的类型值;关系是指向层次结构中其他对象的多目标“指针”,当引用导致名称空间发生变化时,USD会自动重新映射目标。Prims和Properties都可以有(非时变的)元数据。Prims及其内容被组织到一个称为层的文件抽象中。
基于这种低级的通用场景描述,USD提供了一组模式,为常见的3D计算机图形概念建立标准编码和客户端API,例如:
几何
UsdGeom 模式定义了OpenSubdiv兼容的网格、变换、曲线、点、nurbs patch和几个固有实体。它还定义了任意原值的概念,即可以在几何表面上插入的属性;几何范围和聚合,计算边界框;修剪的可见性;以及一个名为Purpose的属性,它表达了一个(非动画化的)条件可见性,这对部署细节级代理和指南很有用。
着色
UsdShade模式定义了原始的着色器节点,可以连接到网络中并打包成可重用的材料,在此基础上可以创建一个公共的属性接口,该接口将驱动包含的着色器网络中的参数。UsdShade还提供了灵活的机制来绑定几何材料,以定义他们的照明响应(和物理)特性。
模型和资产
USD的合成操作符允许您构建任意大的、复杂的场景。为了帮助处理、分析和分解这些场景,USD将模型和资产的概念形式化。“模型”prim分类允许将场景划分为逻辑的、可管理的块,用于遍历、工作集管理和数据合并/缓存。“资产”的概念在USD中表现为两个层面:作为明确引用外部文件的核心数据类型,确定哪些数据需要参与资产/路径解析;并在AssetInfo模式中保存已被引用到场景中的资产的记录,即使场景被平化,该记录也会存在。
USD可以组合和重载:
以下是对USD组合语义的一个非常简洁的描述,并提供了更多详细描述的链接。
你可以使用SubLayers合成操作符将USD图层“堆叠”在一起,合成引擎将解析包含在这种有序(可嵌套的)“LayerStacks”中的数据,类似于Photoshop中的图层组合方式。
层中的任何prim也可以包含一个或多个参考合成操作符,这些参考合成操作符针对另一个(或相同的!)层中的prim,并将扎根于目标prim的树组合到参考prim中——这是将元素资产组装成聚合和完整场景的主要方法。有效载荷操作符提供了一个“延迟引用”,可以在阶段初始打开后选择性地从阶段“加载”(或卸载);明智地使用有效负载可以让你构建场景,这样客户端就可以轻松地管理“工作集”,在内存中只保留他们手头任务所需的场景部分。
VariantSets允许资产创建者使用“变体选择器”将资产的不同多个变体捆绑到单个包中,下游资产消费者可以在更强的层中进行非破坏性切换,以改变他们想要的变体;任何prim都可以定义多个VariantSets,它们可以沿相关轴或独立轴变化。
最后两个合成操作符,继承和专门化都在“基本”prim和“派生”prim之间建立了一个持久的(跨越更远的上游合成操作符)关系,这样派生prim接收到组合中任何地方应用于基本prim的所有覆盖;继承和专门化之间的技术差异在于派生的意见何时“胜过”基础的意见,但实际上的区别在于:你可以使用继承轻松地“大量编辑”特定类别的所有实例或资产,你可以使用专门化来创建一个“派生”,它总是在场景的所有视图中对“基础”进行“专门化”细化。
USD的组合语义最强大和统一的方面是,上述所有操作符都可以以任何组合应用于任何prim,并且组合引擎将以可预测的方式解析生成的图。这种构图弧线统一处理的另一个可取特性是,构图中较强的图层可以均匀地覆盖较弱图层中的场景描述,而不管较弱的图层是否被分层、引用、继承等。相对于较弱的层,较强的层可以覆盖以下内容:
- 添加新的prim,包括以添加的prim为根的整个子树
- 停用prims,这是USD的非破坏性(可逆)prims /子树删除方法
- 重新排序质数,因为在某些上下文中,名称空间排序可能是有意义的
- 向现有的VariantSet添加或删除变体
- 添加或删除整个VariantSets,或要继承或专门化的目标
- 覆盖prim或属性上的模式和用户级元数据的值
- 添加新属性到prim
- 在prim上重新排序属性。如果没有显式排序,则按字典顺序枚举属性
- 覆盖任何属性的值(覆盖值会阻止所有较弱的timessample)
- 阻塞属性的值,使其看起来没有写入值
- 在关系或属性连接上添加、删除和重新排序目标
最后,USD提供了一些场景级的功能,可以极大地扩展可用USD编码的数据集的类型和规模。最突出的两个是原生prim实例化,用于非常紧凑地编码(和处理)引用资产或prim的大量实例/副本,适用于副本不需要深度编辑的情况; 而Value Clips 允许将一组质数的时间样本分布在许多文件中,并(重新)排序和非破坏性地重新计时。
USD/Hydra可以成像:
Hydra是作为USD发行版的一部分发布的成像框架。它连接了“场景委托”(使用场景数据)和“渲染委托”(将场景数据发送到特定的渲染器),以这样一种方式,渲染和场景委托可以混合和匹配应用程序和消费者的需求。Hydra的第一个也是主要的渲染委托是栅格化的Storm渲染器,它最初是一个现代的OpenGL渲染器,现在已经合并了一个“图形界面”抽象,允许Storm使用Vulkan, Metal,以及潜在的其他栅格化渲染API。Storm是高度可扩展的,支持多通道,并使用OpenSubdiv网格渲染。该存储库还包括一个简单的基于Embree的路径跟踪器,作为创建更多后端的示例,以及HdPrman,它正在演变成与皮克斯首映RenderMan渲染器一起渲染USD的最终手段。
Hydra的USD场景委托在usdview和几乎所有集成USD的第三方插件中使用,旨在为符合UsdGeom模式、UsdShade、UsdVol、UsdSkel、UsdLux和其他图形相关模式域的任何场景提供“地面真实”渲染。它还为USD场景提供快速预览和动画流。
USD可以扩展和自定义:
尽管USD主要用作嵌入式子系统,但它所涵盖的问题空间的广度要求它可以沿着许多轴进行扩展。USD有自己的插件发现机制,以及以下插件点:
- 资产的决议
在高度引用的场景中,在USD文件中记录的资产路径和最终将加载资产的“解析定位器/标识符”之间有一定程度的分离是有利的。ArResolver接口可以根据每个USD安装和每个“插件包”进行定制,例如,允许解析特定于站点的命名约定,以及应用动态版本控制。USD附带了一个默认的解析器实现,允许对传统文件系统进行简单的“搜索路径”风格的资产解析。
然而,Ar系统允许多个uri协议分派的解析器共存,每个解析器都可以将资产路径解析到ArAsset, ArAsset可以直接从云或数据库流式传输数据,甚至可以在内存中按程序构造资产。 - 文件格式
通过为格式实现SdfFileFormat插件,可以教USD层填充从任何类型的兼容文件格式转换的数据。USD自己的原生usda(文本)、usdc(二进制)和usdz(打包归档)格式都是这样实现的,通过Alembic USD插件以及MaterialX xml文件读取Alembic文件的支持也是如此。
文件格式也可以是“动态的”,例如,当通过有效负载弧引用到场景时,有效加载的prim上可修改的元数据参数被传输到文件格式插件,然后允许重新评估自己。这允许一定程度的用户导向程序主义。 - 模式
USD包含一个工具,用于从模式的简单usda文本描述生成新模式(c++类、python绑定和所有必需的样板)。这可以用于向您的管道或包中添加新的USD prim模式类型和API,您将能够在应用程序级插件中与它们进行交互,就好像它们是本机的USD模式一样。对于概念上可映像的类型化模式,您还可以教Hydra如何映像它们。
USD不能做什么
不支持GUID
USD使用文本的、分层的名称空间来标识它的数据,这意味着它是“名称空间路径”,覆盖绑定到它们的定义质数/属性。因此,当引用资产的内部名称空间发生变化时,先前在引用资产中记录的更高级别的覆盖将会消失。这个问题的一个解决方案是通过“全局唯一标识符”(GUID)来识别数据,然后将覆盖与定义prim的GUID相关联。在解决名称空间编辑问题的同时,GUID给管道引入了其他问题,并可能限制组合的灵活性。在过去的USD迭代中,Pixar在模型/资产粒度上使用了一种GUID形式,在仔细权衡利弊之后,我们决定,对我们来说,偶尔的“名称空间修复”操作的成本值得为资产构建和聚合的便利性付出代价,以及我们从名称空间路径作为标识符获得的可读文本资产表示。
不是高效执行体和传动系统
USD提供了一个轻量级的,优化的场景图,以方便创作和有效地提取合成的场景描述。然而,它只提供名称空间层次结构和属性值解析的组合,并且在“低内存占用、高延迟数据访问”和“高内存占用、低延迟数据访问”之间的权衡空间中,USD的场景更倾向于前者,而高性能执行引擎需要后者。
此外,我们向USD添加的操纵行为和执行语义越多,在DCC之间成功交换数据就越困难,因为目前供应商之间对这些行为应该是什么还没有广泛的共识。
USD及其模式生成工具应该适合在特定应用程序或自定义管道中对往返数据进行编码,并且USD确实提供了一些工具,客户可以使用这些工具在UsdStage之上构建更广泛的内存缓存,以提供对以USD编码的数据的低延迟访问。但就目前而言,这些在我们认为的USD的主要指导方针中并没有发挥重要作用:在3D内容创建管道中DCC之间可扩展的几何,阴影和照明数据交换。
皮克斯的USD遗产
USD大概是皮克斯开发的第四代“合成场景描述”。在《玩具总动员》中,每个镜头都是由一个单一的线性程序文件描述的,皮克斯的研发团队开始在其专有动画系统《木偶》(内部称为Menv)的背景下添加和发展参考、分层、编辑和变化的概念,从《虫虫危机》开始,一直持续到接下来的十部故事片。
到2004年,很明显,尽管木偶已经发展得相当强大,但其有机进化的来源正在成为持续稳定发展和我们利用多核系统等重要工具的能力的障碍。该工作室致力于设计和开发一种全新的第二代动画系统,现在被称为Presto,该系统首次用于《勇敢传说》及其后的所有电影。Presto着手解决的《木偶》的一个问题是,它的各种合成和覆盖3D场景描述的功能并不总是能够有效地一起使用,因为它们分布在三种不同的格式和“合成引擎”中。Presto提供了统一的第二代场景描述,支持从单个网格到整个模型,到环境或镜头的所有粒度的引用,覆盖,变化和其他操作,以单一文本格式编码并使用单个合成引擎进行评估。
然而,与此同时,皮克斯,以及许多电影和特效行业,发现从动画和索具一直保持到渲染的流水线过渡到动画和装备被烘烤成有效的“姿势缓存”包含动画的姿势点和变换的流水线是有利的,这样照明,效果和渲染可以减少延迟(和内存占用),他们可以访问数据。因此,在2008-2009年,管道开发团队开始构建TidScene,这是一个由二进制数据库(Berkeley DB)支持的几何模式,使用轻量级场景作为创作和读取时间采样数据的机制。TidScene的关键元素包括一个(当时)高性能的OpenGL渲染插件,它可以在所有管道应用程序中直接从TidScene预览渲染,以及使用(可能被滥用)实现分层、场景“隔离”(即只加载场景的一部分)、资产引用和对变化的一些支持的本地引用功能的开发。
TidScene姿态缓存的速度、可扩展性和通用管道访问是成功的,但也让皮克斯回到了一个地方,我们有多个相互竞争的系统来创建合成的场景描述,具有不同的语义、API和管道中可以使用它们的位置。2012年启动的USD项目的任务是将Presto的(最近重新设计和改进的)组合引擎和低级数据模型与TidScene的延迟访问、时间采样数据模型和轻量级场景结合起来。USD提供了一个全新的场景,它位于Presto使用的非常相同的构图引擎之上,并在场景描述和构图核心的各个层面引入了并行计算。
USD项目的一个关键组成部分是开发一个现代的、可扩展的渲染架构,称为Hydra,最初与后来被称为Storm的高性能光栅化渲染器一起部署。Hydra作为USD项目的一部分发布,因为它在管道中为USD的采用增加了巨大的价值,并用于我们所有的插件;它还提供了一个基准和参考如何利用美元的多线程快速场景加载和成像,以及有效地更新响应动态编辑到现场UsdStage。然而,Hydra本身就是一个产品,并且已经有了除USD之外的其他直接前端耦合(包括Presto和Maya, Katana和Houdini插件),并且已经超越了其原始的opengl启发架构来服务其他渲染委托,例如路径跟踪器。
更多推荐



所有评论(0)