译者前言
这个原版官方教程的操作内容其实并不多,但是描述的篇幅较长。一方面是因为在某些点上补充了知识,但另一方面是描述非常详细,甚至有些“过于”详细了。因此我删减了少量的内容,主要包括一些重复描述的操作(比如原文选择节点的操作每次都要描述并截图)和过于基础的讲解(比如讲解Switch节点的用法)。
另外,本教程的起点并不是空白文件,而是Houdini安装目录\help\files\pdg_tutorials\intro_to_pdg\fxworkflow_tutorial.hip
。这个文件里已经存在些基础节点,包括建立简单的几何体和场景,以及基础的特效模拟。不过,教程中的所有操作将不会改动它们,所有操作都会是在TOP网络下的,毕竟教程的重点是PDG。
关于本教程
在 Houdini 中,你可以使用 TOP节点 生成 work item来为你做任务或存储信息。使用 TOP 节点网络,你可以创建一个有伸缩性的“菜谱”来生成 work item ,在本地或农场上运行它们,并在所有 work item 之间建立依赖关系网络,然后找出尽可能高效完成所有工作的方法。而这个“菜谱”称为 PDG。
在本教程中,你将学习如何创建一个线性 TOP 网络,将几何体与“渲染”和“影像合成”连接在一起,然后将最终所有的帧放入到 MP4 中(译注:如果没有安装FFmpeg,建议先参考附录进行安装再进行教程,因为安装并设置环境变量后应该需要重启Houdini)。为了让事情变得简单,你将 不会 需要使用脚本节点或执行任何复杂的网络。本教程将为学习更复杂PDG之前打些基本概念的基础。
Tip
要了解有关 TOP 和 PDG 的更多信息,可参阅 翻译Houdini官方文档:PDG/TOPs介绍。
先决条件
- 没有先前的 PDG 知识。
- 有对 Houdini 中特效的基本理解。
- 一些使用 SOP、DOP 和 ROP 创建特效网络的经验。
你会学到什么
- PDG 的基础概念。
- 最常用的TOP节点。
- 特效的基本 TOP 网络设置和 PDG 工作流程。
步骤 0 - 复制教程 HIP 文件
在开始之前,请建立一个自己的位置,然后复制将在本教程中使用的 Houdini HIP 文件:
Houdini安装目录\help\files\pdg_tutorials\intro_to_pdg\fxworkflow_tutorial.hip
可以打开它并观察下其中的内容:
- \obj上下文:
- Smoke Sourcing and Simulation (烟雾源和模拟)
- smoke_src SOP :提供给pyro模拟的源几何体
- smoke_sim DOP :生成烟雾的pyro模拟
- smoke_import SOP :pyro模拟的输出
- Render(渲染)
- render_background SOP:背景的渲染几何体
- render_smoke SOP :pyro模拟输出的渲染
- render_sphere SOP :球体的渲染
- render_light1 和 render_light2 :灯
- render_cam :相机
- Smoke Sourcing and Simulation (烟雾源和模拟)
- \task上下文:
- topnet1:TOP网络
- local_scheduler TOP :执行 work item 的本地调度程序
- opengl_render ROP :渲染帧的OpenGL网络
- mosaic COP2 :加载渲染帧并将它们组装成 2×2 网格的COP2网络。
- topnet1:TOP网络
步骤 1 - 定义烟雾的变化
在该教程的第一步骤中,将使用 Wedge TOP 节点来为下游的Pyro模拟(烟雾)提供一系列 变种,方式是通过 attribute 来设置变化的数目以及该如何变化。
这使你可以在本教程的后面生成和比较烟雾的变化。
1. 打开fxworkflow_tutorial.hip
。
2. 打开\task
上下文并进入topnet1
网络。
3. 创建一个 Wedge 节点(你可以在⇥ Tab菜单中Data类别找到),然后将其重命名为smoke_variations
Wedge 节点上的参数将设置要更改的 attribute 的百分比,并定义要生成的 wedge 的数量。
在本教程中,你将为pyro模拟定义一组四种不同的配置,这些配置将改变施加到烟雾上的力和烟雾源的大小。
4. 选择 smoke_variations
节点,然后配置(或者说 wedge out)force
和size
这两种attribute:
-
将Wedge Count设置为4。
这决定了要生成的变化(或者说 wedge)的数量。 -
将Wedge Attributes设置为2。
这决定了要变化的属性的数量。 -
在第一个 Wedge Attributes 中,执行以下操作:
- 在Attribute Name参数字段中,键入
force
。
这让你可以改变force
wedge 中的属性。 - 在Wedge Type参数下拉菜单中,选择Value List。
这让你可以为force
的每个wedge的属性设置特定值。 - 在Values字段中,键入4。
出现四个Value字段。
在每个值字段中,键入以下数字之一:1、10、20和50。
- 在Attribute Name参数字段中,键入
-
在第二个 Wedge Attributes 中,执行以下操作:
- 在Attribute Name参数字段中,键入
size
。 - 在Wedge Type参数下拉菜单中,选择Range。
这让你为size
的每个wedge设置属性的值范围。 - 在Start字段中键入0.5,在End字段中键入2。
这告诉节点在 Start 和 End 字段值之间为size
属性选择随机值。
- 在Attribute Name参数字段中,键入
-
将其他所有参数保留为默认值。
5. 为节点的 work item 进行 生成 和 cook。
在 TOP 节点可以执行任何工作之前,你首先需要通过生成节点的 work item 来创建你希望它执行的任务。而为了运行这些任务,你需要对TOP节点进行 cook。
-
右键单击
smoke_variations
节点并从出现的菜单中选择 Generate Node
smoke_variations
节点上会出现四个点。每个点代表一个 work item,节点生成的每个 work item 是一组force
和size
属性变种(或者说 wedge)。
-
右键单击
smoke_variations
节点并从出现的菜单中选择Cook Selected Node。
smoke_variations
节点的 work item 点和状态图标会改变颜色以表明它们正在处理,并且当它们完成 cook 时,它们再次变化以表明它们已被运行。
要了解有关各种 TOP 节点 UI 元素的更多信息,请参阅 PDG 节点网络界面。
节点上的每个点现在也代表一个 wedge。
Note
在 TOP 中,有两种类型的节点:静态和动态。静态节点可以在没有任何输入的情况下生成它们的work item,因为它们不依赖于任何上游数据。另一种,动态节点需要来自其上游输入的信息以生成work item。这就是为什么动态节点只能在 cook 后生成work item。
在本教程中,smoke_variations是众多静态节点之一。要了解有关静态和动态 TOP 节点及其在 TOP 网络中的意义的更多信息,请参阅静态与动态。
Tip
cook一个节点也会在该节点上生成任何需要生成的 work item。
6. 右键单击smoke_variations
节点上的 work item 点。
请注意wedgeindex
,force
以及size
属性是怎样在wedge和wedge之间改变的。
Tip
你可以使用[和]键来在节点上的work item之间跳转。
7. 保存场景。
步骤 2 - 缓存烟雾的源几何体
在此步骤中,你将使用 ROP Geometry Output TOP 节点为每个wedge变化缓存pyro模拟的输入(或者说源几何体)。源几何体将在你的场景中发出烟雾。
该节点将缓存pyro模拟的初始烟点,并将源几何体与模拟分离。这样当你改变你的模拟参数值(就像你的 wedge)时,你就不需要重新烘焙它的源几何体。相反,节点将只获取源几何体并运行pyro模拟。
1. 在网络编辑器,创建一个ROP Geometry Output TOP (你可以在⇥ Tab菜单中Geometry类别找到),将其重命名为smoke_src
,然后将其连接到smoke_variations
节点下面。
该smoke_src TOP
将会指向smoke_src SOP
网络。它将生成许多具有你指定的attribute的 work item,以从第 1-120 帧为每个wedge变化 cook(运行)该 SOP 网络。
2. 选择smoke_src TOP
节点,然后配置以下参数:
- 在Evaluate Using参数下拉菜单中,选择Frame Range。
Frame Range参数的默认值是$FSTART
和$FEND
变量。这些变量内置于 Houdini 中,对应于Houdini播放栏的Global Animation Start Frame和Global Animation End Frame值。因此,当你更改播放栏的Global Animation Frame值时,节点上的帧范围值将自动更新。 - 将SOP Path选择为
/obj/smoke_src/create_density_volume
节点现在知道作为模拟的源几何要使用哪个几何体了。 - 指定
smoke_src
的输出路径。
由于你要为每一帧wedge出四个输出文件(每个wedge变化一个),因此需要创建一个包含 wedge number 的唯一文件路径,以便输出文件 不会 相互覆盖。因此在Output File参数中输入:
$HIP/geo/@HIPNAME.$OS.`@wedgeindex`.$F.bgeo.sc
wedgeindex
是由 Wedge 节点自动创建的属性。它标识wedge数目中的每个wedge编号。Note
如果你使用 nested wedging,其中有一个接一个的wedge节点,则每个 wedge 将具有唯一的wedge index
。wedge number
来自wedge数目,它来自wedge节点内部。然而,wedge index
是特定wedge变化的全局唯一序号。因此,wedge number
以 0、1、2、3 等顺序递增,但wedge index
从 0 开始并递增到 work item 的数量。wedge index
保证是唯一的。
对于本教程,wedge number
和wedge index
是一样的,因为你没有使用nested wedging。然而你应该在输出文件名中使用@wedgeindex
,以便你的文件名总是唯一的。 - 将所有其他参数保留为默认值。
3. 检查 smoke_src
生成的 work item。
- 为节点生成 work item。
节点内出现 480 个点。这些点中的每一个都代表一个wedge(120 帧 x 4 wedge)的每一帧的源几何体 work item。
- 查看
smoke_src
节点的所有 work item。
请注意,你无法看到节点上 work item 的所有点。
当网络编辑器中的节点内显示太多 work item 时,你可以打开 work item spreadsheet 或 Task Table Graph 窗口。
要打开 Task Table Graph 窗口,请单击节点右下角的“两列图标”。
你可以使用Task Table Graph以易于浏览和理解的表格形式来检查节点上所有 work item 的状态。
4. 为smoke_src
节点启用批处理。
- 在
smoke_src
节点中,选择ROP Fetch分页。
查看Frames per Batch参数。
如果使用它当前的值,节点会cook并产生你想要的输出,但它会很 低效,因为节点将为每个workitem都创建一个进程。然而由于你正在cook的网络速度非常快,因此大量时间将浪费在生成进程和管理这些进程的调度上,而不是实际的工作。
为了加快速度,你需要增加批量的大小。 - 将Frames per Batch参数设置为10。
批量大小为10意味着节点将在每个进程中 cook 10个workitem,而不是一个。
通过以这种方式收集要cook的workitem,节点可以分担启动进程的一些开销。
5. 对smoke_src
进行Cook
你将看到smoke_src
节点上各种workitem的cook状态出现在网络编辑器中的节点上以及 Task Table Graph 窗口中。
所有workitem的cook状态也会出现在网络编辑器的任务菜单栏中。
要了解有关workitem点颜色和状态图标的更多信息,请参阅 PDG node network interface。
Note
smoke_src节点上的每个点现在也代表动画几何体的一帧。
cook 一个TOP 节点也会 cook 其 TOP 网络中的任何上游未cook的节点。在这种情况下,如果smoke_variations
未cook,则也会对它cook,因为它是一个输入。
6. 启用By Batch任务折叠选项。
当前,smoke_src
节点上的所有workitem都显示为单个点,即使它们是批处理workitem。
要减少你在节点上看到的workitem的数量,你可以打开By Batch任务显示模式。
- 在网络编辑器中,选择 View ▸ Display Options,然后在Task Collapse Mode中选择By Batch。
- 节点上的所有workitem点现在都显示为批处理圆环。由于Frames per Batch设置为10,因此每个环代表一批 10 个workitem。以这种方式可视化workitem可以更轻松地管理和调试节点的workitem中发生的事情。
- 通常,你会保持此显示选项处于打开状态。但是,为了你可以在本教程中看到任务之间的联系,请关闭它。
7. 观察网络中的@
引用。
- 切换到
\obj
上下文。 - 进入
smoke_src SOP
网络。 - 选择
sphere1
节点并查看其Uniform Scale参数的值。
请注意,球体的size
参数使用@变量
引用了PDG 属性。
由于@size
变量是smoke_variations
这个 Wedge 节点workitem上的一个属性,这意味着它引用了你在 PDG 中的属性,并且 SOP 网络也知道如何使用该wedge变量。
此@属性
引用为你提供了一种交互的预览wedge属性外观的方法。如果smoke_src
在视口中显示SOP 网络,则可以通过单击wedge来预览输出几何体wedge的变化。此外,每次@size
变量更改时,Houdini 都会刷新sphere1
节点并显示它相对于wedge属性的新值的状态。
Note
使用@属性
引用来创建这些类型的关系称为拉式wedge。要了解有关不同类型的 TOP wedge技术的更多信息,请参阅拉与推。
- 打开
sphere1
节点的display标志。 - 返回 Object 上下文。
- 打开
smoke_src SOP
的display标志。 - 返回到
\task
上下文。 - 单击
smoke_variations
的wedge以在视口中预览几何体的变化。
8. 保存场景
步骤 3 - 导入烟雾的模拟输出
在此步骤中,你将使用 ROP Geometry Output TOP节点为每个wedge变化导入和运行pyro模拟(烟雾)的输出。
1. 在网络编辑器,创建一个 ROP Geometry Output TOP节点,其重命名为smoke_sim
,然后将其连接到smoke_src
下面。
该smoke_sim TOP
将会指向smoke_sim SOP
网络。它将生成许多具有你指定的attribute的 work item,以从第 1-120 帧为每个wedge变化 cook(运行)该 SOP 网络。
2. 选择smoke_sim TOP
节点,然后配置以下参数:
- 在ROP Geometry分页中,将Evaluate Using参数保留为其默认值Single Frame。
你不需要 配置此参数。由于smoke_sim
节点连接到smoke_src
节点,并该节点已经有workitem,因此smoke_sim
将为输入上的每个 源workitem自动生成一个 模拟workitem。 - 将SOP Path设置为
/obj/smoke_import/import_pyrofields
该smoke_sim
节点需要指向实际的pyro模拟输出,而不仅仅是模拟源。该smoke_sim
节点会拿到DOP模拟网络的输出,并把它放入几何。 - 将Output File设置为:
$HIP/geo/$OS.`@wedgeindex`.$F4.bgeo.sc
就像使用smoke_src TOP
节点一样,您需要创建一个包含 wedge index 的唯一文件路径,以便输出文件不会相互覆盖。@wedgeindex
将让你创建具有唯一文件名的输出文件。
3. 为你的模拟设置缓存。
- 在ROP Fetch分页中,从Cache Mode参数下拉菜单中选择Write Files。
这会写出pyro的模拟帧,以便您可以更快地在视口中播放wedge的模拟帧。
4. 检查由你的smoke_sim
TOP节点生成的workitem。
- 为节点生成workitem。
节点内出现 480 个点。这些点中的每一个都代表一个wedge(120 帧 x 4 wedge)的一帧的pyro模拟workitem。 - 单击
smoke_sim
节点内的一些worktiem点。
请注意smoke_sim
节点上的pyro模拟任务、节点上相关的源几何体以及smoke_src
节点上的相关wedge之间出现的线。这些线以及相应的高亮点表示节点workitem之间的依赖关系。
Note
PDG以通用的特殊格式存储其所有文件路径,已让它可以访问存储在农场中不同平台(Windows、Linux 等)上的文件。这种特殊格式在文件路径中使用特殊的 PDG标记。
- 双击
smoke_sim
TOP 节点上的work点。- 在出现的Task Info弹出窗口中,查看Command、Input和Output的路径。
默认情况下,这些路径以人类可读的格式显示。- 单击“Task Info”弹出窗口顶部的文件夹图标。
路径现在以其原始 标记化格式显示。这就是路径在worktiem上的对应attribute中的存储方式。
5. 对smoke_sim
进行cook
-
在ROP Fetch分页中,启用All Frames in One Batch。
由于smoke_sim
正在导入和运行模拟,并且模拟帧之间存在依赖关系(第二帧依赖于第一帧,依此类推),你需要在单个进程或作业中cook所有节点的工作项。你可以使用All Frames in One Batch参数来执行此操作。
Warning
任何时候运行模拟时,你总是应该启用All Frames in One Batch。否则,你将在模拟中遇到问题,因为你无法在多个进程中运行模拟。 -
对
smoke_sim
进行cook
你将看到smoke_sim
节点上各种workitem的cook状态出现在网络编辑器、任务表图窗口和网络编辑器的任务菜单栏中的节点上。
节点上的每个点现在也代表一个模拟帧。
6. 观察网络中的@
引用。
- 切换到
\obj
上下文 - 进入
smoke_sim DOP 网络。
- 选择
uniformforce1
节点并查看其Force参数的值。
请注意,Force使用@force
,这是你创建的wedge变量。这就是模拟如何让Force从wedge中提取属性并利用它。
就像使用smoke_src TOP
节点一样,此@
属性引用为你提供了一种交互式预览wedge属性在模拟中的外观的方法。如果smoke_sim
在视口中显示DOP 网络,则可以通过单击wedge来预览wedge变化。此外,每次@force
变量更改时,Houdini 都会刷新uniformforce1
节点并显示它相对于wedge属性的新值的新表现。 - 打开
uniformforce1
节点的输出标志。 - 返回
\obj
上下文。 - 打开
smoke_sim
DOP 网络的显示标志。 - 返回到
\task
上下文。 - 播放你的模拟并单击
smoke_variations
的wedge以在视口中预览你的模拟。
7. 保存场景。
步骤 4 - 过滤掉不含烟雾的帧
在此步骤中,你将使用 Filter by Range TOP 节点来过滤掉模拟的前几帧。
smoke_sim
节点导入的 pyro 模拟直到第 25 帧左右才非常明显。过滤掉看起来几乎为空的帧将修剪上游帧范围,以便下游节点(如渲染节点)只需要处理一个子集输入帧范围。
1. 在网络编辑器,创建 Filter by Range TOP 节点(你可以在⇥ Tab菜单中Data类别找到),其重命名为render_range
,然后将其连接到smoke_sim
下面。
2. 选择render_range
节点,然后配置以下参数:
- 在第一个 Filter Range参数字段中,输入25。
这将第 25帧设置为模拟帧范围的第一帧。 - 在最后一个 Filter Range 参数字段中,输入
$FEND
变量。
这会将当前Global Animation Frame Range设置为模拟帧范围的最后一帧。
3. 对render_range
节点进行生成
请注意节点上的workitem数是384(96 帧 x 4 wedge)。这是因为每个wedge变化的前 25 帧已被render_range
节点排除。
4. 单击smoke_sim
节点中的第一个workitem点。
请注意在下面单击的workitem点没有和任何节点workitem之间出现依赖关系线。这是因为你单击的帧已被render_range
节点过滤,因此未为其生成workitem。
5. 对render_range
进行cook
6. 右键单击render_range
节点上的workitem点。
请注意range
属性变为以 25.0, 120.0, 1.0 反映新的输出帧的范围。
7. 保存场景
步骤 5 - 渲染出烟雾
在这一步中,你将使用两个 ROP Fetch TOP节点(一个是高质量 的,另一个是低质量 的)来让 GPU openGL 为每个wedge变化渲染出pyro模拟(烟雾)的帧。
由于Houdini 没有openGL的TOP渲染节点,因此这些节点将指向两个已建立的openGL ROP网络。此外,由于 openGL 只能在 Houdini 的本地图形session中工作,因此对于本教程,你将只能在本地(不能在农场)进行渲染。
Tip
即使TOP的⇥ Tab菜单不支持所有 ROP,你仍然可以使用 ROP Fetch TOP 节点来指向任何行为类似于 ROP 的节点。例如,像Vellum I/O节点或文件缓存节点。
如果你对农场渲染、光线追踪或使用 USD 感兴趣,你可以在本教程之外随时使用ROP Mantra Render TOP节点(Mantra 渲染器支持光线追踪)或USD Render TOP节点(Karma 渲染器支持 USD 和 LOP )。
1. 在网络编辑器,创建一个ROP Fetch TOP节点(你可以在⇥ Tab菜单中Render类别找到),其重命名为gl_render
,然后将其连接到render_range
节点下面。
这将是你的高质量openGL 渲染节点。
2. 选择gl_render
节点,然后配置以下参数:
-
指定ROP Path为
/tasks/topnet1/opengl_render/opengl
现在gl_render
节点知道使用哪个 ROP 网络来渲染你的pyro模拟(烟雾)的帧了。- 你不需要指定openGL渲染输出帧的路径,因为在
opengl
节点里已经帮你设置好了。
- OpenGL 将使用你系统的显卡 (GPU) 来渲染你的帧。
- 你不需要指定openGL渲染输出帧的路径,因为在
-
将Frames per Batch参数设置为40
对于渲染节点,你总是希望运行某种程度的批处理,这样你就不会花费大量时间等待进程启动或帧渲染。
在本教程之外,你选择的批量数目应取决于你的硬件和你正在cook的工作的性质。如果你将批量数目设置得太大,那么你的cook将不会 非常高效,因为你只启动了少量的进程,并且需要很长时间才能完成大量工作。如果你将批量数目设置得太小,那么你将支付很多用于启动进程的开销。Tip
选择批量数目的一个好规则如下:将批量数目设置为 “workitem数目” 除以 “你渲染机器的核心数”. 例如,如果你有 24 个核,那么理想情况下你需要 24 个进程(每个核一个进程)。
3. 选择gl_render
节点,按⌃Ctrl + c,然后按⌃Ctrl + v
一个新的复制的渲染节点命名gl_render1
出现在网络编辑器,其输入已经连接到了render_range
节点之后。将其命名为gl_render_preview
这将是你的低质量openGL渲染节点。
4. 选择gl_render_preview
节点,然后配置以下参数:
- 将ROP Path设置为
/obj/topnet1/opengl_render/opengl_preview
- 将Frames per Batch参数设置为20。
5. 对gl_render
和gl_render_preview
节点进行cook。
预览版 openGL 渲染器会相当快地处理你的workitem,但更高质量的 openGL 渲染器将需要更多时间来处理。
渲染节点完成后,你将获得最终渲染的帧。
6. 查看你的渲染帧
查看gl_render
或gl_render_preview
的节点信息,点击Output里的.exr链接:
随后视频将会出现的MPlay中:
请注意opengl.exr视频质量将高于opengl_preview.exr.(译注:原文是这么说的,但我自己没看出来二者有啥区别,不知道是不是渲染器本身的参数设置有问题?)
步骤 6 - 为渲染器设置切换开关
在这一步中,你将使用 Switch TOP节点设置一个切换开关,让你可以选择在 TOP 网络中使用哪个输入渲染器gl_render
(高质量)或gl_render_preview
(低质量)。
Tip
- 添加此开关会将你的网络分成两个分支。在本教程之外,可能会出现你需要以不同分辨率输出帧的情况(例如,用于自己的审查、回合或样片)。
- 即使 Switch 节点只会 cook 网络的一个分支,你仍然可以手动cook任何渲染节点。
1. 在网络编辑器,创建一个Switch TOP节点(你可以在⇥ Tab菜单中Utility类别找到),其重命名为select_render
,然后将其连接输入到输出的gl_render
和gl_render_preview
节点。
现在,你可以在二者之间进行切换
Note
- 当你在渲染器之间切换时,如果之前未cook这些节点,则需要为切换到的渲染器分支重新cook下游节点。
- 如果上游节点先前已经被cook,则切换渲染器不会导致变脏。
2. 将select_render
节点的输入切换为gl_render_preview
节点。
在本教程的其余部分,你将使用gl_render_preview
节点的渲染帧。
3. 保存场景
步骤 7 - 为渲染帧添加字幕
在此步骤中,你将使用名为 Overlay Text 的特殊预配置 ROP Composite Output TOP节点在渲染帧的顶层添加文本。此文本将提供有关每个帧的重要wedge变化信息,例如它们的帧编号、Force
值和Size
值。
当你查看和比较wedge变体(例如,来自四个不同wedge变体的第 50 帧)时,这种文本是有用的参考。它将帮助你快速识别用于生成你喜欢的帧的设置,并且在你调试特效时,它也是非常有用的信息。
1. 在网络编辑器,创建一个 Overlay Text 节点(你可以在⇥ Tab菜单中Images类别找到),其重命名为wedge_overlay
,然后将其连接到select_render
节点后面。
2. 选择wedge_overlay
节点,然后配置以下参数:
- 在Overlay分页中,在Text字段中键入以下表达式:
Frame: $F3
Size: `@size`
Force: `@force`
$F3
是 3 位的帧号,@size
引用size
这个wedge的workitem的属性,并且@force
同理。
每个workitem都计算此表达式。它接受一个输入渲染帧,计算该帧workitem的属性,然后确定要在渲染帧中放置的文本。
- 在ROP Composite分页中,在Output Picture参数字段中输入以下内容:
$HIP/comp/$HIPNAME.$OS.`@wedgeindex`.$F4.exr
- 在ROP Fetch分页,启用All Frames in One Batch。
该节点其实是受益于批处理的。但是在本教程中,因为这个COP节点很快,在几乎实时的速度cook,所以你不会需要用批处理。
3. 对wedge_overlay
节点进行cook
4. 查看效果
注意视频中的文字:
5. 保存场景
步骤 8 - 收集图像
在此步骤中,你将使用 Partition by Frame TOP 节点来收集图像并将其组织到 partitions 中。
你的图像需要按帧编号进行组织,然后才能将它们传递到将在 “步骤 9” 中创建的 mosaic 节点。
1. 在网络编辑器,创建 Partition by Frame TOP 节点(你可以在⇥ Tab菜单中Partitioner类别找到),其重命名为collect_frames
,然后将其连接到wedge_overlay
节点之后。
2. 将collect_frames
的参数保留为默认值
你不需要 改变此节点的任何设置。
3. 对collect_frames
进行cook。
该collect_frames
节点产生所有叠加的图像,并把他们的workitem基于帧放入对应的partition。每个partition有四个workitem,每个wedge变体各一个。
因此节点中会出现 96 个小矩形(384 / 4个wedge)。
collect_frames
将图像收集到其partition中。
每个collect_frames
的workitem仅在其所有四个相同编号的wedge_overlay
图像完成cook时才完成cook。
4. 右键单击collect_frames
节点上的workitem点。
查看每个workitem的输出。请注意节点如何在每个partition中对 4 个帧进行分组——来自每个wedge的相同帧。
5. 保存场景。
步骤 9 - 将partition的图像组装成 2×2 网格图像
在此步骤中,你将使用 ROP Composite Output TOP节点将每个帧编号的图像的所有四个wedge变化组合为 2×2 网格。
这些网格将允许你比较每个wedge的每一帧。比如,你可以同时观察来自所有四个wedge分别的第 50 帧。
1. 在网络编辑器,创建一个ROP Composite Output TOP节点,其重命名为wedge_mosaic
,然后将其连接到collect_frames
节点之后。
2. 选择wedge_mosaic
节点,然后配置以下参数:
- 在ROP Composite分页,打开Composite分页中的Use External COP。
- 将COP Path设置为
/tasks/topnet1/mosaic/mosaic1
现在wedge_mosaic
节点知道该用哪个COP网络来处理组合图像的任务了。
- 将Output Picture保留为默认值。
由于此节点将获取图像的所有四种变体,然后将它们转换为单个图像,因此不需要再使用@wedgeindex
来确保文件不会覆盖了。
3. 对wedge_mosaic
节点进行cook。
节点内出现 96 个点。每个点代表一个组合网格图像workitem。
4. 查看效果
请注意,视频将包含按帧号顺序排列的所有 2×2 网格图像。
5. 保存场景
步骤 10 - 等待所有图像处理完
在此步骤中,你将使用 Wait for All TOP节点来收集单个partition中的所有输入图像。
你需要拥有所有完整的图像,然后才能将它们传递到将在 “步骤 11” 中创建的视频节点。
1. 在网络编辑器,创建一个Wait for All TOP节点(你可以在⇥ Tab菜单中Dependencies类别找到),保持默认waitforall1
名称,然后将其连接到wedge_mosaic
节点后面。
2. 对waitforall1
进行cook。
节点的workitem将显示为一个矩形。
该节点将所有图像收集到一个partition中,其将显示为一个矩形。
在将图像传递到下游 FFmpeg编码视频节点 之前,waitforall1
节点将等待来自wedge_mosaic
节点的所有合成完成。
这很重要,因为视频节点需要所有合成图像才能生成和输出视频。
3. 保存场景
步骤 11 - 将图像变成视频
在这最后一步中,你将使用 FFmpeg Encode Video TOP 节点将所有图像组合成单个 MP4 视频。
为了能够使用此节点,你需要安装FFmpeg程序,如果没有安装,可以参见【附录:安装FFmpeg】(安装之后应该需要重启Houdini)。
1. 在网络编辑器,创建一个FFmpeg Encode Video TOP 节点(你可以在⇥ Tab菜单中Images类别找到),将其重命名为make_movie
,然后将其连接到waitforall1
节点后面。
2. 将节点参数保留为默认值
3. 对节点进行cook(如果有报错,可能是安装FFmpeg并配置环境变量后没有重启Houdini导致的,也可能是附录中记录的问题,可以查看)
4. 看看最终的效果
5. 保存场景
译者附录:安装FFmpeg
FFmpeg Encode Video TOP节点其实就是ffmpeg
命令行工具的封装,因此所谓的“安装FFmpeg”其实就是从FFmpeg官网上下载exe,然后放到节点可以找到的位置。
而FFmpeg Encode Video TOP节点将根据参数可以从三个位置中找到exe:
- 系统的Path环境变量中
- 环境变量
PDG_FFMPEG
中 - 直接在节点中指定FFmpeg二进制文件的路径。
其默认值是系统的Path环境变量,所以设置Path变量是最方便的方式,因为配置好以后都不需要在节点上做任何配置了。
首先,可以在cmd中查看ffmpeg是否已经在系统Path环境变量中了。我这里没有
因此,需要从官网下载页面进行下载。
这里我选择了Windows,gyan.dev的Build(不知道和下面的Build有没有区别)
然后选择了release builds 中的 ffmpeg-release-essentials.zip。
下载解压后,我将文件放在了C盘。因此我的ffmpeg.exe
的路径为C:\dev\ffmpeg-4.4-essentials_build\bin
。
下面,将此路径填入系统Path环境变量中:
现在,再次在cmd中输入ffmpeg
将不会出现找不到的提示了:
(应该需要重启cmd才可以)
译者问题记录:FFmpeg失败问题
第一次配置好后,我的FFmpeg节点不能输出视频,有报错:
我在这里: FFmpeg problem, doesn’t find the cooked item. 也找到了对相关问题的讨论,并找到了一种回答:
我按照其的描述,将 localschedulaer
的 Location改为Working Directory
之后确实没有报错并生成视频了。
不过看讨论,似乎也有别的说法。
另外,在设置环境变量后似乎也必须重启Houdini。所以这个报错并不一定是由上面的操作解决的。
总之这个问题后续可以关注。
译者后记:测试使用缓存
原文教程中将很多缓存都保存了文件,但似乎并没有真正派上用场。
我想做个测试使用缓存,比如直接导入Pyro模拟的结果而跳过模拟计算。
我在相同的HIP文件路径下建立一个新的HIP。
然后添加了一个File节点用于读取缓存文件。
由于模拟的缓存的文件参数是$HIP/geo/$OS.`@wedgeindex`.$F4.bgeo.sc
其中$OS
是那个节点的名字,即smoke_sim
。而@wedgeindex
的0~3是四个wedge。
File节点参数的路径我填入:
$HIP/geo/smoke_sim.3.$F4.bgeo.sc
这将表示第四个wedge的缓存文件
效果确实成功读取到了缓存: