Blender 3D:从菜鸟到专业/Cycles 中的萤火虫,续
适用 Blender 版本:2.68。 |
你 之前阅读过 有关在使用 Blender Cycles 进行渲染时控制萤火虫的技术,以及当所有其他方法都失败,调整渲染器参数也无济于事时,是时候推出去噪滤镜了。有时在整个图像上应用去噪可能过于生硬,导致图像中没有萤火虫的部分出现不希望有的效果。
但不要害怕。Blender 的合成器中还有更多我们尚未探索过的选项,可以让我们更精细地控制去噪的应用,并希望避免最后的手动修复(震惊!恐怖!)图像编辑程序中各个瑕疵的措施。
基本原理是,萤火虫是由特定类型的材料和照明的相互作用引起的,因此它们只会出现在图像的特定部分。通过将有问题的材料/照明情况分离出来,我们可以有选择地仅将滤镜应用于它们,从而最大程度地减少对图像中看起来很好的部分的副作用。
我们将介绍一种进行分离的方法。
Cycles 渲染器能够将不同类型的灯光路径分离到单独的通道中以进行单独处理。考虑 Blender Wiki 上的图表,展示了直接照明、间接照明和颜色计算是如何通过漫反射、镜面反射和透射灯光路径分解的,然后与发射和环境照明组合在一起。我们可以拆分所有这些通道,并使用合成器节点来重新创建如上面所述的标准组合。但我们也可以将自己的处理过程穿插到特定通道中,而其他通道保持不变。
要告诉 Blender 我们想要提取灯光通道,请转到属性 窗口中的渲染层 上下文,并查找通道面板。注意“漫反射”、“镜面反射”、“透射”和“次表面”下分别有四组三个按钮,分别对应“直接”、“间接”和“颜色”?(根据您的 Blender 版本,“次表面”组可能不存在。) 单击所有这些按钮,并选中下面“发射”和“环境”框。
现在,如果您回到合成器窗口,您应该会看到 RenderLayers 节点生成了许多额外的输出端点,每个端点对应您单击的按钮/复选框。
接下来,我们想要重新组合这些节点,以模拟 Blender 默认提供的行为。如果您回到上面的 Blender Wiki 图表,您会看到,对于每种着色器类型(漫反射、镜面反射等),直接和间接灯光通道加在一起,然后将总和乘以颜色计算结果。然后将所有通道的结果加在一起。
Blender 合成器有用于添加和乘以颜色的标准节点类型。有了这些信息,您可能立即开始着手组建一个复杂的节点设置来实现该图表中描述的公式,最终可能得到类似右侧的结果。
向经验丰富的计算机程序员展示它,他们会做出一个被称为“facepalm”的手势。是的,从技术上讲,这将起作用,但它看起来相当复杂而且容易出错。假设您连接错误:您将如何找到它?您将如何调试您的节点程序?
因为,不要搞错,节点是一种编程语言。组装一个节点设置非常类似于编写一个计算机程序。其中一个重要的原则是不要重复自己。也就是说,如果您发现自己重复执行相同的步骤不止一次,那么将它写出来一次,然后下次告诉计算机再次执行相同的操作是有意义的。
在编程中,懒惰是一种美德。程序员将大量时间花在想办法避免工作上,通过让计算机来完成它。 |
那么让我们看看程序员将如何处理同样的问题。首先,考虑最基本的操作,即:添加直接和间接分量,然后乘以颜色。因此,创建一个 Mix 节点对,一个用于 Add,另一个用于 Multiply,并将它们适当地连接起来。将它们变成一个组 CTRL + G ,并像图中一样添加组输入和输出。
要更改输入和输出的名称,可以在节点编辑器窗口中的属性架 N 中出现的列表中选择它们,然后在列表下方相应的字段中输入新的名称。
完成所有布线后, TAB 退出组,以便您可以为它命名。在这里,我称之为“通道合并”。看看命名输入和输出如何帮助澄清节点的作用?如果您想查看详细信息,只需 TAB 进入节点以了解更多。这种技术称为抽象,您从只看到概述开始,但您可以逐渐剥开层级以查看更多细节,但仅限于您想要查看的地方。这是一种处理复杂性的重要技术,程序员每天都在使用它。
我们将需要四个该组的实例,以及另一堆 Mix 节点将它们全部加在一起。我们正在添加 6 个量,因此我们需要 5 个 Mix 节点。同样,我创建一个组来合并所有这些加法器,只是为了使事情更整洁。
我将结果组命名为“Add6”。Blender 只提供节点以一次添加两个量,但我们在这里创建了自己的自定义节点,可以一次接收 6 个输入。整洁吧?
因此,现在我们将我们的构建块组合成一个新的构建块,计算所有通道的组合,看起来像这样。
注意组输入的排序,以确保我们在下面连接此节点时排列整齐。您可以通过从属性架 N 中的列表中选择一个输入并使用列表旁边的向上和向下箭头按钮来更改其位置来重新排列输入。
然后,当我们将该构建块(在这里称为“Combine All”)连接到所有 RenderLayers 输出时,我们的完整节点设置现在看起来像这样。
将此与最初简单地重现通道组合算法的结果进行比较:当您打开 Blender 文档时,您更愿意看到哪一个?
组中包含组:当您在一个组中包含另一个组时,您可能会对 TAB 键的行为感到困惑:它会退出当前组,还是带您进入内部组?如果您选择一个内部组,它当然会进入该组。但是,如果您试图退出,单击一个不是组的节点。您始终有两个这样的节点,即组输入和组输出节点,它们方便地用黄色的标题栏标记出来。因此,在按 TAB 之前,单击其中一个,这会让您退出该组。 |
无论如何,现在我们已经将照明通道分离出来,以便我们可以重新组合它们以生成原始图像,那么我们究竟如何解决萤火虫问题呢?
首先,我们必须确定哪些通道产生了萤火虫。单击合成器节点编辑器窗口标题中的“背景”复选框。现在, CTRL + SHIFT + LMB 单击 RenderLayers 节点,您应该会看到一个新的 Viewer 节点自动出现并连接到该节点的第一个输出端点。同时,窗口的背景会改变,显示该输出端点产生的图像。第一个端点应该显示完整的图像,包括萤火虫。
持续按下 CTRL + SHIFT + LMB ,查看器节点将依次连接到每个输出端。一些输出端可能全黑或全白,别担心,继续操作即可。当您到达 Diffuse Indirect 输出时,您应该会看到类似于右侧的图像,大部分是黑暗的,但有明显的萤火虫。记下这一点并继续操作;我发现 Glossy Indirect 输出在这种情况下的另一个问题来源。
因此,我们需要在 RenderLayer 节点的 Diffuse Indirect 输出和 Combine All 节点的对应 Diffuse Indirect 输入之间插入一个 Despeckle 节点。但与其只创建一个简单的 Despeckle 节点,不如创建一个自定义节点组。为什么?因为我们将在两个地方都需要它。所以与其设置两次,不如只设置一次,并插入两个实例。这样,我们只需在一个地方调整去斑点设置,它就会自动生效,无论哪里有实例。此外,我们可能想尝试在 Despeckle 之外或代替 Despeckle 使用其他滤镜;同样,我们只需要在一个地方进行更改,它就会自动影响所有实例。
“不要重复自己”,还记得吗?
所以现在,我们已经将自定义的“Fix Fireflies”节点组的几个实例插入到最麻烦的光线路径中。
这是渲染后的结果。
萤火虫可能很麻烦,特别是没有一种 100% 万无一失的方法可以消除它们。毕竟,如果有,为什么不直接将其作为每个渲染的自动部分内置进去呢?这两页介绍了一系列处理萤火虫的技术,从简单到复杂。当然,先尝试简单的方法是合理的,只有当这些方法不够好时,才值得花时间在更复杂的方法上。
- Bartek Skorupa 的这段 视频,它启发了这篇文章。