在本教程中,我们将研究 Blender 中两个用于合成的 Render Pass,也就是 Depth 和 Mist 的功能、设置、共同点与差异。它们都可以在后期制作中为我们提供物体距离信息或场景深度信息。


本教程不提供中文配音。您可以在下方观看英语配音的视频,并选择中文、英文或其他语言的字幕。视频下方提供了翻译成中文的文字稿。


视频文字稿

大家好!在本教程中,我们将研究 Blender 中两个用于合成的 Render Pass,也就是 Depth 和 Mist 的功能、设置、共同点与差异。它们都可以在后期制作中为我们提供物体距离信息或场景深度信息。

两者都可以用来生成一种图像:距离摄像机最近的位置显示为黑色,最远的位置显示为白色。这样我们就可以通过将这些图像直接与渲染结果混合,或者把它们作为蒙版来创建其他效果。例如,我在关于 Atmospheric Perspective 的视频教程系列中就展示过这种用法。

不过,它们之间存在一些差异,不仅仅是虚拟场景中数值范围的计算方式不同,生成图像的其他特性也有所不同。这些差异会使它们在某些用途上更适合或不适合。为了更好地解释这些区别,在整个教程中,我会使用两个 3D 场景,并在每次修改设置后向大家展示结果上的差异。

简单来说,Depth 与 Mist 的区别在于:Depth 返回的是物体与虚拟摄像机之间的真实距离值,而 Mist 会从距离摄像机某个指定距离开始添加雾效,并在一定深度范围内逐渐增强,超过这个范围后所有内容都会变成白色。

因此,Depth 更适合那些需要使用真实距离值的应用,例如 Defocus 节点和 Z-Combine 节点。

Defocus 可以让你对距离摄像机某个特定距离的元素进行对焦,同时模糊其他元素,也就是实现景深效果。

而 Z-Combine 则允许你混合两个场景。它会根据每个场景或图像中 Z 或 Depth 通道里保存的距离值,决定哪些像素显示、哪些像素隐藏。

不过,这并不意味着 Depth 不能用于其他情况。我自己在 Atmospheric Perspective 系列中就使用过它,但在那里我必须对 Depth 返回的信息进行归一化。稍后我们会看到,Depth 的归一化是什么意思,以及这样做会对数据产生什么影响。

在 Properties 编辑器的 View Layers 标签页中,Depth Render Pass 默认是启用的。在该标签页里,这个 Render Pass 被称为 Z,而在合成器的 Render Layers 节点中,它被称为 Depth。

Depth 返回的最小距离值由 Camera 对象的 Clip Start 数值决定,因为所有距离摄像机比 Clip Start 更近的物体都不会被渲染。所以,如果 Depth 输出没有被归一化,那么这就是它能够返回的最小值。

而 Depth 返回的最大距离值则由 Camera 对象的 Clip End 数值决定,因为所有超出该距离的物体都不会被渲染。虚拟宇宙的背景被视为无限远,因此它会在 Depth 蒙版中具有最大值。

你可以选择虚拟摄像机,并在 Properties 编辑器的 Data 标签页中的 Viewport Display 部分启用 Limits 选项,这样就能在 3D 场景中显示 Clip Start 与 Clip End 的位置。

这样会更方便你正确设置 Clip End 数值。

而 Mist 返回的是一张随着与摄像机距离增加而逐渐变白的图像。不过在这种情况下,雾效的起始点并不是由 Clip Start 决定,而是由一个可以自由指定的数值决定,这个数值叫做 Mist Start。

与默认启用的 Depth 不同,Mist Render Pass 需要在 Passes 部分中手动启用。这一步必须在开始渲染之前完成,否则相关信息不会被计算,你就需要重新渲染才能使用它。

启用 Mist Render Pass 后,World 标签页中会出现一个新的 Mist 区域,我们可以在那里设置 Mist Start 以及其他参数。

Mist 与 Depth 还有另一个区别:Mist 不使用 Clip End 来决定从哪个距离开始所有物体都显示为白色。相反,它使用一个名为 Mist Depth 的参数。因此,所有位于 Start + Depth 距离上的物体都会被渲染成白色。

你也可以在 3D Viewport 中显示 Mist Start 和 Mist Depth,只需要在 Data 标签页中的 Viewport Display 部分启用 Mist 复选框即可。如果你同时启用了 Limits,最好将其关闭,因为两者的显示会重叠。

在再次渲染之前,我会设置 Mist Start 和 Mist Depth,使其效果与 Clip Start 和 Clip End 的范围相对应。

在 World 标签页的 Mist 区域中,还有另一个参数:Falloff。它用于决定雾效随距离变化的方式。默认模式是 Quadratic,但还有 Inverse Quadratic 和 Linear 等选项。

Quadratic 会采用与灯光相同的衰减方式,因此从 0 到 1 的过渡会更平滑。Linear 的过渡会比 Quadratic 稍微锐利一些。最后,Inverse Quadratic 会非常快速地从 0 过渡到 1,因此即使是前景元素也会出现非常浓厚的雾效。

Z-Depth 没有这个参数,因为它并不是一个按照公式实现的效果,而是直接返回物体的真实距离值。你可以说它始终是线性的,但这样解释其实意义不大。

正如我之前提到的,Z-Depth 更适合获取真实距离信息,而 Mist 更适合创建它名字所代表的雾效,因为它允许我们自由设置效果特性。

现在进行渲染,并在 Compositor 窗口中查看这些 Pass,我们会发现 Mist 输出结果很有意思,而来自 Depth 的蒙版至少表面上看起来是无法使用的。

现在我们来看看“归一化 Depth”是什么意思,以及为什么很多教程都会使用 Normalize 节点。

正如之前提到的,Z-Depth 返回的数值并不在 0 到 1 的范围内,而是真实表示与虚拟摄像机之间的距离。因此,如果你想在距离摄像机某个特定距离的位置引入效果,这会非常有用。

存储的数值可能非常大,因此 Z-Depth 通道会使用比 JPG 或 PNG 等大多数图像文件的 8 位或 16 位更多的内存。我几乎可以确定它实际上使用的是 32 位。

此外,在 Backdrop 中,所有大于 1 的值都会被截断,也就是 Clamp 到 1,对应的像素会显示为白色。而 Z-Depth 的数值通常由 Clip End 决定,这个值一般远大于 1。

正因为如此,Depth 返回的值无法在 Compositing 编辑器的 Backdrop 中正确显示,因为那里所有大于 1 的数值都会被渲染成白色。因此,大多数情况下,生成的图像会显得非常亮,并且缺乏细节。

实际上,在我使用的场景中,Clip Start 的值是 1,而 Clip End 是 20000,所以整个 Depth Pass 看起来完全是白色的!

因此,人们经常使用 Utilities 组中的 Normalize 节点,把这些值映射到 0 到 1 的范围。不过在这里,我们需要特别说明一个重要问题。

Normalize 节点并不会把 Clip Start 与 Clip End 之间的值映射到 0 到 1。相反,它会根据它所处理图像中实际存在的最小值与最大值进行映射。

不过,这并不是我们在 Backdrop 中看到的图像,因为正如之前所说,Depth 通道中存储的数据远比可见内容多得多。

所以,如果我们在 Depth 输出与 Viewer 之间连接一个 Normalize 节点,渲染底部的元素就会显示为黑色。这是因为这些点距离虚拟摄像机最近,因此在 Depth 蒙版中具有最暗的数值,所以在归一化版本中会被映射为黑色,尽管它们显然并不位于 Camera 的 Clip Start 距离上。

对于更远处的物体,以及那些在归一化后的 Depth 蒙版中显示为白色的像素,也可以做出类似的分析。

为了进一步证明 Normalize 是根据图像中的最小值和最大值进行工作的,我们来看看如果对 Mist 信息也使用 Normalize 会发生什么:底部那些最暗的像素会被重新映射到 0,因此显示为黑色,而最远元素的像素原本已经是白色,所以保持不变。

我再给大家展示另一个例子,以便更好地理解这个概念。在现在这个场景中,摄像机和一些物体位于一个房间内部。

摄像机的 Clipping End 值被设置成刚好能够渲染房间中最远箱子的前表面,但无法渲染房间后墙。

实际上,甚至最远的箱子也没有完全显示出来,但这是由于透视效果造成的。

场景中没有任何物体位于 Clip Start 附近,而 Clip Start 被设置为距离摄像机 10 厘米。即使是画面边缘处的房间墙壁,也比这个距离更远。

如果现在开始渲染,并查看未归一化的 Depth Render Pass,后墙会完全变成白色。因为实际上,Depth Pass 无法看到最远箱子之后的内容,因此会把后面的所有内容渲染成白色。

不过画面中并没有黑色区域,因为正如之前所说,没有任何物体位于 Clip Start 的位置。

但是如果我们使用 Normalize 节点,底部就会出现一条黑色区域。这也是我们之前在另一个场景渲染中看到的现象:那部分地板显然距离摄像机最近。

我们可以把一侧墙壁向内移动,使它们更接近摄像机,然后重新渲染,以验证刚才所说的内容。

理解 Normalize 如何改变 Depth 蒙版非常重要。

这个节点不应该用于 Mist,而对于 Depth,也必须谨慎决定是否使用。它适合用来为特殊效果创建蒙版,例如之前提到的 Atmospheric Perspective,但在其他情况下则不应该使用。

所以,你可能会问:有没有办法把 Clip Start 与 Clip End 映射到 0 到 1 的范围,从而在 Backdrop 中正确查看 Depth 蒙版呢?

当然有:在 Compositor 中添加一个 Utilities 组里的 Map Range 节点,然后将节点中的 From Min 和 From Max 设置为 Camera 的 Clip Start 与 Clip End 数值。

这样你会得到一个类似 Mist Pass 的蒙版,但当然,你也会失去真实的深度数值。

在结束本教程之前,还有最后一个重要区别需要强调:用于计算场景中物体距离值的采样数量。

Mist 实际上实现了 Anti-Aliasing,而 Z-Depth 不会计算这一点。

更具体地说,Z-Depth 只使用一个采样,因此在不使用 Motion Blur 或 Depth of Field 等效果时,它可以正常工作,也就是说,在不需要混合深度值的情况下没有问题。而当需要混合深度值时,使用 Mist 会更加合适。

最后,再谈一下渲染的 Color Management 设置,以及 Z-Depth 与 Mist 蒙版在 Backdrop 中的显示方式。

根据 View Transform 参数所选择的模式不同,无论是 Mist 还是 Depth,无论是否经过归一化,它们在屏幕上的显示结果都可能有很大差异。

不过,这些变换应该只会影响数据在 Backdrop 中的显示方式,因此不应该改变它们本身的实际数值。

好了,本教程就到这里!希望它对你有所帮助!我们下次见!

搜索教程

输入短语,或输入多个用逗号分隔的关键词进行搜索。

本站提供 Francesco Milanese 制作的 3D 模型、教程及计算机图形相关资源。3D 模型的使用许可可通过各模型页面上的链接前往第三方商店购买,并须遵守适用的许可条款。 Francesco Milanese — 意大利增值税号:06321250877。 联系方式:info@francescomilanese.com


高级隐私策略信息和cookie文件的使用