Pixar Usd通用场景描述系统介绍

什么是USD?

USD 是一个高性能的可扩展软件平台,用于协同构建动画 3D 场景,旨在满足大型电影和视觉效果制作的需求。

USD 通过其扩展的Schemas集在数字内容创建工具之间提供了强大的数据交换,涵盖几何、阴影、照明和物理等领域。

USD 独特的组合功能具有强大的优势。例如,组合提供了丰富多样的方式来将单个资产组合成更大的程序集,并支持让许多用户同时协作而不会发生冲突的工作流。

计算机图形电影和游戏的制作流程通常会生成、存储和传输大量 3D 数据,我们将该3D数据称为“场景描述”。 制作流程中的诸多协作应用程序(建模、着色、动画、照明、特效、渲染)中的每一个通常都有自己的特殊形式的场景描述,适用于该应用程序的特定需求和工作流程,且它的场景描述无法被任何其他应用程序读取或编辑。通用场景描述 (USD) 是第一个公开可用的软件,它满足了稳健且可扩展地交换和增强可能由许多元素资产组成的任意 3D 场景的需求。

USD 提供元素资产(例如模型)或动画的交换。但与其他交换包不同,USD 还可以将任意数量的资产组装和组织成虚拟布景、场景、镜头和世界,将它们从一个应用程序传输到另一个应用程序,在单个场景图中使用单个一致的 API 对它们进行非破坏性编辑(通过使用覆盖的方法)。USD 提供了丰富的工具集,用于读取、写入、编辑和快速预览 3D 几何、着色、照明、物理以及越来越多的其他图形相关领域。此外,由于 USD 的核心场景图和合成引擎与任何特定域无关,因此可以以可维护的方式扩展 USD,以在其他领域中编码和合成数据。

具体来说,USD 是一个在修改后的 Apache 许可下发布的开源项目。

为什么使用USD?

USD 是皮克斯 公司3D 图形流水线的核心,用于每个 3D 创作和渲染应用程序,包括 Pixar 专有的 Presto 动画系统。皮克斯坚定地致力于发展和改进USD,以解决以下持续存在的生产问题:

为定义、打包、组装和编辑 3D 数据提供了丰富的通用语言,便于多个DCC(数字内容创建应用程序)的使用。

与许多其他交换包一样,USD 提供了一个低层级数据模型,该模型在“文件格式级别”规定了数据的编码和组织方式,以及一组(可扩展的)高层级Schema模式,该Schema提供了有具体含义的 API 和诸如模型网格或矩阵变换等概念的组织。在这些概念的基础上,我们就可以创建几何、材质、照明和其他属性的资产定义。但 USD 更进一步提供了一组可自由组合的组合弧,它们可用于打包、聚合、改变和覆盖原始元素和资产,具有高性能运行时评估引擎,体现在称为Stage的袖珍场景图中, 用于解析生成的组合场景描述并从中提取(和创作)数据。

允许多位艺术家就同一资产和场景进行协作。

USD 最基本的组合弧, subLayers 操作符,通过允许每个艺术家在自己的文件(称为图层)中工作,方便不同部门或同一部门内的多个艺术家同时处理相同的资产或场景。 所有这些都将按照USD文件本身明确规定的强度顺序进行组合和解决。当建模艺术家改变定义在较弱层中的几何拓扑时,这种能力不是可以在较强层中自动调整着色数据的灵丹妙药,但它允许每个艺术家独立工作,而无需擦除或编辑任何其他艺术家的作品,并且有助于提供清晰的变更审计跟踪,有助于解决诸如拓扑变化问题之类的问题。

通过最小化延迟来最大化艺术迭代。

与许多数字媒体一样,实现高质量数字艺术的最重要因素之一是能够快速且经常地对设计、资产、动画进行迭代。 3D 艺术迭代中最突出的障碍之一是艺术家在编辑结果上获得“足够好”的视觉反馈的速度,以及他们在多个应用程序之间迁移新数据或从崩溃会话中恢复的速度。 在Pixar,速度是USD项目的主要持续目标; 我们将继续探索改进算法、利用现代多核系统和 GPU 的更好方法以及压缩技术,以最大限度地减少访问远程存储数据的延迟。

如果您的需求与上述类似或只是其中的一部分,那么选择USD很可能是个有吸引力的选项。

USD能做什么

USD可以表达:

USD 将数据组织到 Prims(“primitive”的缩写)的分层命名空间中。 除了子 prim 之外,每个 prim 还可以包含属性和关系,统称为属性。 属性具有随时间变化的类型值; 关系是指向层次结构中其他对象的多目标“指针”,当引用导致命名空间发生变化时,USD 会自动重新映射目标。 prims 和 properties 都可以有(非时变的(不随时间变化的))元数据。 Prims 及其内容被组织成一个称为层的文件抽象中。

建立在这种低层级通用场景描述之上,USD 提供了一组Schema,为常见的 3D 计算机图形概念建立标准编码和客户端 API,例如:

几何

UsdGeom Schemas定义了符合 OpenSubdiv 规范的网格模型、矩阵变换、曲线、点、Nurbs 面片和几个固有实体。 它还定义了: 任意primvars的概念作为可以跨几何表面插值的属性; 几何包围盒和聚合,计算好的包围盒; 修剪可见性; 以及一个名为”Purpose”的属性,它表达了一个(不可动画的)条件可见性,在部署LOD代理体和指南时很有用。

着色

UsdShade  Schemas定义了可以连接到网络并打包成可重用材质的基础着色器节点,可以在其上创建属性的公共接口,该接口将驱动包含的着色器网络中的参数。UsdShade 还提供了将几何体绑定到材质的灵活机制,以便定义它们的光照反应(和物理)特性。

模型和资产

USD 的合成运算符允许您构建任意大的复杂场景。作为对此类场景的处理、分析和分解的辅助,USD 形成了模型和资产的概念。“模型” prim 类别允许场景图被划分为逻辑的、可管理的块,用于遍历、工作集管理和数据的合并/缓存。“资产”的概念在USD中体现在两个层面:作为明确引用外部文件的核心数据类型,确定哪些数据需要参与资产/路径解析; 并且在 AssetInfo Schema中,用于将哪些资产被引用到场景中存入记录,即使场景被展平,它仍然存在。

USD 可以进行组合和覆盖:

以下是对 USD 组合语义的非常简洁的描述,并附有更详细描述的链接。

您可以使用 subLayers 合成弧将 USD 图层“堆叠”在一起,合成引擎将解析包含在此类有序(可嵌套)“LayerStacks”中的数据,这类似于 Photoshop 中图层的合成方式。

层中的任何 prim 还可以包含一个或多个以另一个(或相同!)层中的 prim 为目标的参考组合弧,并将以目标prim为根的树组合成参考prim - 这是组装元素资产到聚合体和完整场景的主要方式。Payload组合弧提供了一个“延迟引用”,可以在stage最初被打开后,有选择性地从stage中加载(或卸载)。Payload的明智使用允许您对场景进行结构化,以便客户可以轻松管理“工作集”,只将他们手头任务所需的场景部分保留在内存中。

VariantSets 允许资产创建者将资产的不同多个变体捆绑到一个带有“变体选择器”的包中,下游资产消费者可以在更强的层中进行(非破坏性地)切换以更改他们想要的变体; 任何 prim 都可以定义多个 VariantSet,这些 VariantSet 可以沿相关轴或独立轴变化。

最后两个组合弧,继承和特化两者都在“基础”prim和“派生”prim之间建立持久(跨越进一步的上游组合弧)关系,使得派生prim在合成中的任何位置接收并应用于基础prim的所有覆盖。继承和特化之间的技术差异在于派生意见何时“胜过”基础意见的细节,但实际上的区别是:您可以使用继承轻松“批量编辑”特定类别的prim或资产的所有实例, 并且您可以使用 特化创建一个“派生”,该“派生”始终是您场景的所有视图中“基础”的“专业”细化。

USD 组合语义最强大和最统一的方面是上述所有运算符可以以任何组合应用于任何 prim,并且组合引擎将以可预测的方式解析结果图。 这种对合成弧进行统一处理的另一个理想属性是,合成中的较强层可以统一覆盖较弱层中的场景描述,而不管较弱层是否被子分层、引用、继承等。更强的层可以 对于较弱的层覆盖以下内容:

添加新的 prim,包括以添加的 prim 为根的整个子树

停用 prims ,这是 USD中用于对prim/subtree进行非破坏性(和可逆)删除的方法

重新排序 prims,因为在某些情况下,命名空间排序可能是有意义的

向现有 VariantSet 添加或删除变体

添加或删除整个 VariantSet,或要继承或特例化的目标

覆盖 prim 或属性上schema和用户级元数据的值

向prim添加新属性

重新排序 prim 上的属性。如果未明确排序,则按字典顺序枚举属性

覆盖任何属性的值(覆盖值会阻止所有较弱的 timeSamples)

阻止属性的值,使其看起来没有授权的值

在关系或属性连接上添加、删除和重新排序目标

最后,USD 提供了一些场景图级别的功能,它们可以极大地扩展在USD中可编码的数据集的类型和规模。最突出的两个,一个是原生 prim 实例化,用于非常紧凑地编码(和处理)引用资产或 prim 的大量实例/副本,适用于不需要深度编辑的副本;另一个是Value Clips,它允许将一组 prims 的 timeSamples 分布在许多文件中,并以非破坏性方式(重新)排序和重新定时。

USD/Hydra可以成像:

Hydra 是作为 USD 发行版的一部分提供的成像框架。它连接“场景代理”(使用场景数据)和“渲染代理”(将场景数据发送到特定渲染器),这样渲染和场景代理可以根据应用程序和消费者的需求进行混合和匹配。Hydra 的第一个也是主要的渲染代理是光栅化 的Storm 渲染器,它最初是一个现代 OpenGL 渲染器,现在已经合并了一个“图形接口”的抽象,这允许 Storm 使用 Vulkan、Metal 和其他可能的光栅化渲染 API。Storm 具有高度可扩展性、多通道,并使用 OpenSubdiv 进行网格渲染。该代码仓库还包括一个简单的基于 Embree 的路径跟踪器,作为创建更多后端的示例,以及 HdPrman,它正在演变为使用皮克斯首映的 RenderMan 渲染器来渲染USD的权威手段。

Hydra 的 USD 场景代理用于 usdview 和几乎所有集成 USD 的第三方插件,并且旨在提供由符合 UsdGeom  schema、UsdShade、UsdVol、UsdSkel、UsdLux 和其他图形相关schema域的prim组成的任何场景的“基本事实”渲染。它还为 USD 场景提供快速预览和动画流。

USD是可以扩展的/定制的:

尽管 USD 主要用作嵌入式子系统,但它所涵盖的问题空间的广度要求它可以沿多个轴进行扩展。USD 带有自己的插件发现机制,以及以下插件点:

资产解析

在具有高度引用的场景中,在 USD 文件中记录的资产路径与最终加载资产的“已解析定位器/标识符”之间有一定程度的分离可能是有利的。ArResolver 接口可以根据USD安装和“插件包”进行自定义,例如,允许解析特定站点的命名约定,并应用动态版本控制。USD 附带一个默认解析器实现,允许对传统文件系统进行简单的“搜索路径”样式的资产解析。

但是,Ar 系统允许多个 URI 协议调度的解析器共存,每个解析器都可以将资产路径解析到 ArAsset ——它可以直接从云或数据库流式传输数据,甚至可以按程序在内存中构建资产。

文件格式

通过为格式实现 SdfFileFormat 插件,可以让 USD 层填充从任何类型的兼容文件格式转换而来的数据。USD 自己的本地 usda(文本)、usdc(二进制)和 usdz(打包存档)格式都是通过这种方式实现的,包括通过 对Alembic USD 插件读取 Alembic 文件的支持以及 MaterialX xml 文件的支持。

文件格式也可以是“动态的”,这样当通过payload弧引用到场景中时,被payload的 prim 上的可修改元数据参数就会被传输到文件格式插件中,并允许它们被重新估值。这提供了一定程度的用户导向程序化。

Schemas

USD 包括一个工具,用于从模式的简单 usda 文本描述中生成新Schemas(C++ 类、python 绑定和所有必需的样板文件)。这可用于将新的 USD prim Schema类型和 API 添加到您的流程或包中,您将能够在应用程序级插件中与它们进行交互,就像它们是原生 USD Schemas一样。对于概念上可成像的Schemas类型,您还可以指定 Hydra 如何对它们进行成像。

USD不能做什么

无GUID

USD 使用文本的、分层的命名空间来标识其数据,这意味着它是通过“命名空间路径”来覆盖它们定义的 prims/properties上的绑定。因此,当被引用资产的内部命名空间发生变化时,先前记录在引用资产中的更高级别的覆盖将消失。此问题的一种解决方案是通过“全局唯一标识符”(GUID) 来识别数据,然后将覆盖与与定义 prim 相同的 GUID 相关联。这在解决命名空间编辑问题的同时,GUID 将其他问题引入了制作流程,并可能限制了组合的灵活性。在过去的USD迭代中,皮克斯在模型/资产粒度上使用了一种形式的 GUID,在仔细权衡利弊之后,我们决定对我们来说,在资产集中偶尔出现的“命名空间修复”操作的成本值得为资产构建和聚合的便利性以及我们通过命名空间路径作为标识符获得的可读文本资产表示让出道路。

不是执行或绑定系统

USD 提供轻量级、优化的场景图,以促进对组合场景描述的创作和高效提取。但是,除了命名空间层次结构和属性值解析的组合,它没有提供其他行为,并且在“低内存占用、高延迟数据访问”和“高内存占用、低延迟访问数据”之间的权衡中,USD 场景图更倾向于前者,而高性能执行引擎则需要后者。

此外,我们添加到 USD 中的绑定行为和执行语义越多,在 DCC 之间成功交换数据就越困难,因为目前供应商之间没有就这些行为应该是什么达成广泛共识。

USD 及其Schemas生成工具应该适用于对特定应用程序或自定义流水线中的往返绑定数据进行编码绑定,并且 USD 确实提供了客户端可以用来在 UsdStage 之上构建更通用的内存缓存的设施,以提供对USD编码的数据进行低延迟访问。 但就目前而言,这些并没有在我们认可的 USD 主要目标中发挥重要作用,USD的主要目标是:在 3D 内容创建流水线中 ,DCC 之间的几何、着色和照明数据的可扩展交换。

在Pixar中USD的历史

USD 基本是皮克斯开发的第四代“组合场景描述”。 在完成玩具总动员(其中每个镜头都由一个单一的线性程序文件描述)之后,皮克斯研发团队开始在其专有动画系统的背景下添加和发展引用、分层、编辑和变化的概念——在此基础上开发了工具Marionette(内部称为 Menv),从虫虫的生活开始使用,并在接下来的十部故事片中延续。

到 2004 年,很明显,尽管 Marionette 已经变得非常强大,但其有机进化的起源正成为持续稳定开发和我们利用诸如多核系统等重要工具的能力的障碍。该工作室致力于设计和开发一个全新的第二代动画系统,现在称为 Presto,该系统首次用于 Brave 以及此后的所有功能。 Presto 着手解决的 Marionette 的问题之一是,它用于合成和覆盖 3D 场景描述的各种功能并不总是能够有效地结合使用,因为它们分布在三种不同的格式和“合成引擎”中。Presto 提供了统一的第二代场景描述,支持从单网格模型到整个模型、环境或镜头的所有粒度的引用、覆盖、变化和其他操作,以单一文本格式编码并使用单个合成引擎。

然而,与此同时,皮克斯以及许多电影和特效行业都发现,从动画和绑定在渲染之前一直保持运行的流水线过渡到动画和绑定被烘焙到包含动画姿势点和变换的高效“姿势缓存”中的流水线是有利的,以便照明、效果和渲染可以减少对应数据访问的延迟(和内存占用)。因此,在 2008-2009 年,流水线开发团队开始构建 TidScene,由二进制数据库 (Berkeley DB) 支持的几何Schema,使用轻量级场景图作为创作和读取时间采样数据的机制。TidScene 的关键元素包括一个(在当时)高性能 的OpenGL 渲染插件,它可以在所有流水线应用程序中直接从 TidScene 进行预览渲染,以及原生引用功能的开发,它被用来(可能被滥用)实现分层、场景图“隔离”(即仅加载场景的一部分)、资产引用和对变量的一部分支持。

TidScene 姿势缓存的速度、可扩展性和通用流水线访问是成功的,但也让 Pixar 回到了我们拥有多个竞争系统来创建组合场景描述的地方,这些系统具有不同的语义、API以及流水线中不同的使用地方。

USD 项目于 2012 年启动,其任务是将 Presto 的(最近重新设计和改进的)合成引擎和低级数据模型与 TidScene 的惰性访问、时间采样数据模型和轻量级场景图结合起来。USD 提供了一个全新的场景图,它位于 Presto 使用的相同合成引擎之上,并将并行计算引入到场景描述和合成核心的所有级别。

USD 项目的一个关键组成部分是开发了一个现代的、可扩展的渲染架构,称为 Hydra,最初部署了后来被称为 Storm 高性能光栅化渲染器的东西。Hydra 作为 USD 项目的一部分发布,因为它为 USD 在流水线中的采用增加了巨大的价值,并在我们所有的插件中使用;它还为如何利用 USD 的多线程实现快速场景加载和成像以及响应UsdStage 的动态编辑地有效更新提供了基准和参考。然而,Hydra 本身就是一个产品,并且已经拥有了除 USD 之外的其他直接前端耦合(包括 Presto 和 Maya、Katana 和 Houdini 插件),并且已经超越了其最初的受 OpenGL 启发的架构以服务于其他的渲染代理,例如路径跟踪器。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值