在使用PDG的时候,对于一个新的节点,总有一种云里雾里的感觉,看官方文档也是迷迷糊糊的,还好基本上每个节点都有提供相应的Sample,并标注了注意事项。

本篇就记录下PDG的一些重要节点,以及使用过程中的注意点

节点

Wedge

主要有以下几个作用

  • 创建Work Item,驱动PDG

  • 用于生成Attribute(可以多个),对于Wedge的Attribute,可以在整个TOP中通过@xxx来引用,当然,在和常规字符混排的的时候,需要加反向单引号例如:

    1
    $HIP/geo/boxsphere_`@wedgeindex`.bgeo.sc
  • 强制覆写某个参数,可以理解为非侵入式的一种数据注入方案

多个Wedege之前关系为嵌套关系,比如WedgeA的WedgeCount为2,WedgeB的WedgeCount为3,当B连接到A的出口,那么B将会输出2x3 = 6个WorkItem

Partition by Index

它做的事情非常简单,就是将多个WorkItem按照index和一定的规则merge成一个WorkItem,每个WorkItem的index可以通过双击查看

image-20230810232917205

具体的Merge规则可以是一对一,也可以是一对多,多对一

image-20230810233030990

可以将Partition by Index看成一个多线程驱动器,其所有的输入链之间都是并行执行的,并在所有WorkItem执行完毕后将结果按照index收集在一起

Switch

Switch节点在PDG中我称之为古神节点,因为它实在是太过抽象了,在描述中有这样一句:

This node does not generate any work items and does not have access to work item attributes or input files. It gets evaluated before other nodes in the graph produce work items. If you want to branch based on an expression that uses work item attributes, you should use either the Filter by Expression or Split nodes.

意思是它的分支选择在整个PDG中是完全静态的,没法通过任何PDG中的参数进行更改,只能通过将TOP封装成HDA的形式来传参更改执行流程

当你尝试非要这么干的时候,就会出现这种情况:

image-20230810233903323

HDA Processor

相当常用的节点,可以引用HDA文件,并对上游节点的输出进行处理,需要注意的是如果HDA要求了Input输入,需要在HDA Processor的Asset Inputs分类栏中创建输入

Wait for All

收集所有上游输入,并Merge成一个index为0的WorkItem

注意事项

基本概念

PDG全称Procedural Dependency Graph,是Houdini推出的一种基于节点图的工作流程管理工具,通过TOP Network进行实现

PDG运行基本规则

PDG中,输出节点会依赖输入节点,默认情况是输入节点全部cook完成之后才会执行输出节点,可以通过节点配置更改

其他


Q:如何方便调试可视化PDG中每一步的输出?

A:在 Houdini 的 PDG(Procedural Dependency Graph)工作流程中,@pdg_output 是一个特殊的路径变量,用于动态地引用 PDG 输出的文件。PDG 可以将任务的输出数据保存到指定的路径中,并通过@pdg_output 这个路径变量来动态地表示这些输出文件的路径。使用 @pdg_output 变量可以帮助在 PDG 工作流程中灵活地引用输出文件,而无需硬编码固定的文件路径和文件名。

所以只需要新建个HDA,里面内容是File节点,Geometry param引用@pdg_output 即可


Q:PDG中有哪些环境变量

A:

  • @pdg_input - 始终计算为当前工作项的第一个输入。使用 @pdg_input.1、@pdg_input.2 等来引用其他输入。当在计算农场上评估工作项时,可以确保正在评估的网络具有该工作项所需的正确输入。不要将 @pdg_output 用于此目的,因为工作项尚未计算,所以没有输出。
  • @pdg_output - 始终计算为当前工作项的第一个输出。使用 @pdg_output.1、@pdg_output.2 等来引用其他输出。用于可视化目的(例如,File SOP 中的 @pdg_output 将在几何体的情况下显示当前工作项的输出)。不要用于其他目的。
  • @pdg_index - 当前工作项的索引,可能在单个处理器内部不是唯一的。在处理器节点的情况下进行检查。
  • @pdg_name - 当前工作项的唯一名称。
  • @pdg_log - 如果存在日志文件,在工作项完成烹饪后可用。
  • @pdg_frame - 工作项的帧。如果工作项没有帧,则评估为 0。
  • @pdg_loopdepth - 设置为 for 循环的深度。例如,如果有嵌套循环,则内部循环的 @pdg_loopdepth 设置为 1,其他循环为 0。

填充:请注意,任何数字属性都可以用 :number 进行填充。例如,@pdg_index:4 将使用零填充,确保为其补齐 4 位数。


Q:在HDA中使用Python节点修改某个节点参数,然后在PDG中通过HDA Processor进行调用的时候会报出这个错 PermissionError: Failed to modify node or parameter because of a permission error. Possible causes include locked assets, takes, product permissions or user specified permissions

A:我们使用python节点修改了HeightFieldOutput节点的参数,而HDA导出后节点默认是静态的,所以需要进行可编辑节点的注册

image-20230903003230375


Q:Houdini中有没有通用的Log窗口查看模块?

A:有的,新建个窗口,然后修改类型为LogViewer即可,提供强大的Log过滤,查询,展示功能

image-20230903003844363

参考

https://atanvard.github.io/2019/06/16/houdiniTerrain/