BACK TO ARCHIVE
houdini solaris copernicus compositing pipeline dcc mechanics

Houdini 20.5 Copernicus Slap Comp:在 Solaris Hydra 里实时预览多渲染层合成

08.26.2024 ADUCG RESEARCH

原文:https://www.andreaskj.com/live-multi-layer-slap-comps-with-copernicus-and-solaris-in-houdini-20-5/

Houdini 20.5 中,SideFX 通过 Copernicus 对 COPS 上下文进行了更新。Copernicus 的目标是逐步成为一个完整的合成(compositing)上下文,让你可以在 Houdini 内完成最终的 2D 合成。过去虽然也能在一定程度上做到,但旧版 COPS 的能力相对有限。

Copernicus 目前仍处在较早期阶段,第一阶段主要聚焦于建立类似 Substance Designer 的高效程序化贴图工作流。不过,还有一个同样很有趣、但容易被忽略的新增点:你可以在 Solaris 的 Hydra viewport 里直接预览合成结果。SideFX 将这个功能称为 Slap Comp

在 Houdini 20.5 的默认配置下,Slap Comp 基本只用于在 viewport 里给渲染做一些 2D 级别的调色/调整,并叠加 backplate。它当然很有用,但我真正想要的是:实时预览多个 render layers 的叠加结果,并在切换 active layer 时,仍然能在最终合成的上下文中观察当前层的改动

遗憾的是:当前版本 Copernicus 并没有开箱即用地支持这一点。为此,我做了一个 HDA:可以动态叠加多个 render layers,并通过一个 context option 切换当前 active render layer。如果你想直接看这个 HDA,可以在左侧目录里选择 Multi-Layer Slap Comp HDA。不过我建议先看完基础部分,因为这个节点需要一些前置设置。

Copernicus Slap Comps

基础搭建

在进入自定义 HDA 之前,先看看如何用 SideFX 提供的内置工具搭一个基础 slap comp。

这个 setup 稍微有点“特殊”,但 SideFX 提供了一个 Recipe,可以快速生成正确结构。

首先在 /stage(Solaris)里放一个 COP Network(请确保选新的那个,不要选 COP Network - old)。然后进入 COP 网络,放下名为 Slap Comp Block 的 recipe。它会自动搭好 slap comp 所需的网络结构。

Slap comp block

一开始你会在 Slap Comp Import 节点上看到报错。先不用管——它只是在抱怨缺少 C AOV;之所以缺,是因为我们还没有在 Solaris 里真正渲染出任何东西。

下面拆解一下 slap comp block 的组成与作用:

Slap Comp Import
Slap Comp Import 负责从 Solaris 获取渲染结果。你可以把它理解为“当前活跃渲染的容器”。它会动态拉取所有可用 AOV,并把它们连接到网络的其它部分。

Block Begin/End
Block Begin/End 看起来像 SOPs 里的那套 block 节点:可以被用于很多用途,包括 for-loop。你可以把它理解为“定义一个带输入/输出的函数”。在 slap comp 场景里,这个 block 定义了一段可被 Solaris 调用的合成网络:任何你希望参与 slap comp 的节点,都应该放在这个 block 内(也就是 Block BeginBlock End 之间)。

对于 slap comp 来说,最重要的选项在 Block End 节点上:Register as Slap Comp Block。它会告诉 Solaris:这个 block 的输出可以作为 Hydra viewport 的 slap comp 使用。如果你用 recipe 搭建,这个选项应该已经打开了。

Register as Slap Comp Block

示例:做一个最小可用 slap comp

快速做个能跑的示例:添加一个 Over 节点,把 Block BeginC(beauty)接到 FG;再加一个 Constant 节点作为背景色,Signature 设为 RGBA。同时,需要把 Block Begin 接到 Constantsource 输入,确保它使用与渲染相同的分辨率。

示例:给 slap comp 加一个背景(生产里可能会换成 plate)

接下来回到 /stage(Solaris)测试:随便放个 sphere 或你想渲的物体,然后在 viewport 中切换到 Karma CPU 或 XPU。注意 slap comp 不支持 Houdini GL。

开始渲染后,需要在 Hydra viewport 中启用 slap comp:点击右侧工具栏上的 Slap Comp 图标(看起来像一组紫色建筑)。

在 Hydra viewport 中启用 slap comp

现在 slap comp 就生效了。只要你保持 slap comp toggle 开启,Slap Comp block 内的任何修改都会实时出现在 Hydra viewport 里。

Multi-Layer Slap Comp HDA

我第一次测试 Slap Comp 功能时,直觉就是:它需要一种方式来同时预览多个 render layers。因为在生产里,一个镜头通常不止一个 layer。比如你可能会把环境、载具、FX 等拆成独立 layer,以便在合成中更好地控制,同时也能提升渲染迭代效率。

但这样拆层之后,在没有进入 Nuke 等 2D 合成软件之前,你往往无法直接在 Houdini 里看到“所有层叠加的最终画面”。

我做这个 HDA 的目的就是提出一种基于 Houdini 20.5 新 Slap Comp 的解决思路:动态叠加多个 render layers,并在切换 active layer 时保持上下文预览。我希望 SideFX 未来能更原生、更集成地提供类似能力;在那之前,希望它能成为一个不错的起点。

下面会先说明如何下载并安装我的 HDA 仓库,然后介绍如何在 Solaris 中使用 Multi-Layer Slap Comp 节点。它需要一点点前置设置,请务必跟着做一遍。

下载并安装 akjTools

我把这个 HDA 打包到了一个 GitHub 仓库:akjTools。后续我会持续更新这个仓库。当前它包含上一篇文章里的 feather 工具,以及本文的 multi-layer slap comp 节点(只是为了让你更方便获取与更新)。

仓库地址:
https://github.com/andreask-j/akjTools

如果你熟悉 git,可以直接 clone。否则也可以点右上角 <> Code,选择 Download ZIP 下载并解压,然后记住这个文件夹路径。

从 GitHub 下载仓库

安装过程很简单,因为它本质上就是一组 HDAs。这里给一个推荐做法:

  1. 打开你的 houdini packages 目录(如果没有就新建)
    macOS: ~/Library/Preferences/houdini/X.Y/packages/
    Linux: ~/houdiniX.Y/packages/
    Windows: %HOME%/houdiniX.Y/packages/
  2. 在该目录里创建 akjTools.json,用文本编辑器打开
  3. 写入如下内容并保存:
{
    "hpath" : "<Path to akjTools>"
 
}

比如在我的机器上,akjTools.json 是这样:

{
    "hpath" : "/Users/andreaskj/Repositories/akjTools"
 
}
akjTools.json

- 记得把路径换成你自己的。

之后重启 Houdini,你就能在 TAB 菜单中访问该仓库里的所有节点了。以后更新也很简单:pull 最新仓库,或重新下载替换即可。

使用 Multi-Layer Slap Comp HDA

下面介绍如何使用 Multi-Layer Slap Comp HDA,并说明一些注意事项。我会先写清楚流程,文末也附了视频演示。

要使用 Multi-Layer Slap Comp,需要两件事:

  1. 每个 layer 至少有一版 render 写到了磁盘(作为输入源)
  2. 每个 layer 有一个唯一的 context option 值

下面用一个更具体的示例说明。

我这套示例场景里有一个飞船在灰色场景中飞行,同时向地面射激光。

它被拆成了 3 个 layers:

  • beauty:包含所有 geo(飞船、地面冲击、背景)
  • fxLasers:只包含激光
  • fxDust:包含额外的地面冲击粉尘体积

从左到右依次为 beauty、fxLasers、fxDust

这是生产里很常见的拆层方式:让合成师能更好地控制元素,也让渲染迭代更快。当然有人会拆得更多,也有人更少——主要取决于你需要多大合成控制。

我的 LOPs 网络大致是这样的:每个 render layer 有一条独立 stream,最后接一个 USD Render ROP。

LOPs 网络中的 render layer streams

下面开始真正的 setup。先给一个不太愉快但很重要的免责声明:

⚠️

目前在 Copernicus/COPs 的 slap comp 里使用 .exr 文件性能非常差。因此我强烈建议你把渲染结果转成 Houdini 自家的图像格式 .pic。你可以在 COPs 网络里做转换。你当然也可以在 render ROP 里直接输出 .pic,但我不推荐这样做,因为 .pic 在 Houdini 之外不通用。我已经把这个问题反馈给 SideFX,他们也将其记录为 bug,希望未来版本能修复。

当你把图片落盘(并转成 .pic)后,就可以开始为每个 render layer 设置 context option。

如果你不熟悉 context options:它们可以理解为一种“全局变量”,你可以在整个场景中通过 @<context option> 引用。你可以在 Context Options Editor(Pane Tab 菜单 -> Solaris 子菜单)里查看与编辑它们。context options 对多镜头(multi-shot)工作流尤其有用。

Context Options Editor

设置 context option 的方法很多,但这里我建议用 Python Script LOP。就算你不熟悉 Python 也没关系,只需要两行代码。

对每条 render layer stream,都放一个独立的 Python Script LOP,并写入:

import hou
 
hou.setContextOption("layer", "layername")

layername 替换为你的 render layer 名称即可。第一个参数 "layer" 必须固定叫 layer,因为我的 HDA 会读取这个 context option 来判断你当前正在查看哪个 layer。

用 Python Script LOP 设置 context option 的示例(每个 layer 一个)

我们之所以需要这些 context options,是为了让 Multi-Slap HDA 能识别当前 active layer,然后把其它 layers 正确叠加到合成里。

如果你遇到切换 render layer 后 context options 没有更新,通常可以通过禁用/启用一次对应的

Python Script

LOP 来强制它重新 cook,从而刷新 context option。

准备完成后,就可以开始使用 Multi-Layer Slap Comp 了。在 TAB 菜单中搜索该节点,或在 akjTools 分类下找到它。注意:它是一个 LOP,需要在 /stage 中创建。

创建好节点后,需要在参数里用 + 手动添加你的 render layers。然后在 Layer Name 里填入你在 Python Script LOP 里使用的名称;同时在 Layer Output 里填入该层的图像输出路径(.pic)。下图里我把路径关联到了我做 .pic 转换网络的输出参数。

Multi-layer Slapcomp 节点示例

注意这里的

Active Layer

字段。它用于检查 HDA 当前认为你正在查看哪一层。每次你切换 layer context,它都应该自动更新。如果它没更新,按前面说的办法,把对应 layer 的

Python Script

LOP 禁用/启用一次。

最后,在 viewport 中使用 Karma CPUKarma XPU 渲染,并点亮 Slap Comp 图标。这样你就能在迭代不同 layers 时,始终以“所有 layers 叠加的最终画面”作为上下文预览。更直观的操作可以看下面视频。

在 Hydra viewport 中启用 Slap Comp

Demo:HDA 效果与设置流程演示

总结

希望你觉得这个工具有用。Copernicus 带来了很多值得探索的新能力,我也很期待继续深入。

等 SideFX 修复 slap comp 对 .exr 的性能问题之后,我也会更新这篇文章。

感谢阅读。如果你觉得内容有帮助、想看更多文章,也欢迎订阅作者的 newsletter,把新内容直接发送到你的邮箱。

本文采用 Creative Commons BY-NC-ND 4.0 协议进行授权。

BY-NC-ND: 署名-非商业性使用-禁止演绎

End of Article