如何在 2022 LTS 中使用着色器图形制作自然着色器

TRACY CHEN / UNITYContributor
Jul 28, 2023|15 Min
如何在 2022 LTS 中使用着色器图形制作自然着色器
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

在本博客中,我们将探讨如何在 2022 LTS 中使用通用渲染管道 (URP) 创建两种不同的自然着色器。我们还将仔细研究风格化的水着色器和半写实的沙着色器。这些资产与新的URP 3D 示例场景一起发布。

这些视觉效果乍看之下很复杂,但我们将深入探讨这些功能背后基于设计的思考过程,并逐步分解使它们栩栩如生的技术。让我们一起探索着色器开发的复杂性,制作出令人惊叹的自然着色器。

水着色器

正如上面视频中描述的那样,我们的目标是在日式花园场景中创造一条流淌的风格化小溪。在其他环境的基础上,这里的氛围宁静而富有禅意,艺术风格更偏向于动画而非写实。

从场景中嵌入的地形来看,水由两部分组成:瀑布和桥下流淌的小溪。吉卜力工作室的水景非常鼓舞人心,经常有三种截然不同的元素:

1.有助于确定水流的流线

2.边缘高亮显示水与周围地形的相互作用

3.泡沫效果有助于销售瀑布或瀑布

最终的水着色器将使用所有这些元素。现在,让我们来探讨一下如何实现这一造型的细节。

瀑布泡沫和飞溅物

瀑布有两个不同的网格--主瀑布网格和一个产生涟漪的圆盘状平面。为波纹使用单独的非光照着色器,可以平铺一个噪点节点,并将其作为着色器的 Alpha 值。这样就可以遮住其余区域,确保波纹出现在预定位置。

用于产生波纹的主瀑布网和圆盘状平面的分解

最重要的是确保网格的每个区域都能执行不同的行为。您可以通过在红色 (R)、绿色 (G) 和蓝色 (B) 通道中为网格预涂顶点颜色来实现这一目的。然后将顶点颜色用作遮罩,将某些区域的操作分开。

在着色器图形中,使用顶点颜色节点访问预绘制的顶点颜色数据。如下图右侧所示,您可以使用顶点颜色中的红色通道作为 T 值,在瀑布的垂直和水平部分之间进行插值(lerp),从而实现平滑过渡。要创建瀑布效果,可将两个 沃罗诺节点组合在一起,每个 节点都有不同的平铺和偏移。这就产生了水流下落的动态视觉效果。

着色器图形中顶点颜色节点的分割视图,显示红色(R)通道中的顶点颜色

在真实的瀑布中,水流从上层水平面倾泻而下的地方和水流冲击下层水平面的地方,往往有较厚的泡沫层和飞溅的水花。在场景中,您可以预先在蓝色通道中绘制顶点颜色,以确保只在特定区域显示效果。使用顶点颜色遮罩,您可以将多达四种不同的效果组合到一个数据块中。与为每种效果创建单独的灰度遮罩纹理相比,这种方法更为高效。

为了营造多层水流从边缘落下的假象,可利用不同规模和速度的噪音节点。通过以较慢的速度滚动较大比例的噪点节点,同时以较快的速度滚动较小比例的噪点节点,可以达到理想的效果。为了与瀑布的水平部分保持一致,请重复使用流水的数据。关于溪水的更多细节,我们稍后再详述。

着色器图形中顶点颜色节点的分割视图,显示蓝色(B)通道中的顶点颜色
流:倒影、边缘泡沫和水迹

现在,您已经创建了一个平静的瀑布,让我们来看看小溪吧。动画风格的水通常有几个主要特点。与现实世界中湍急的海岸线泡沫不同,吉卜力风格的溪流在靠近海岸的地方通常泡沫很稀薄。此外,水尾的出现也会给水面带来灵动活泼的印象。由于场景设置在夜间,因此还需要令人信服的反光效果。让我们仔细看看如何在着色器图形中实现这些效果。

思考

拍摄水面倒影有多种方法。最有效的选择是调用 URP 内置的GlossyEnvironmentReflection 函数的自定义函数节点。此函数返回从场景中的箱形投影反射探头采样的反射颜色。您只需输入函数所需的世界空间位置、视图方向、法线和屏幕位置。

编辑器中的反射节点设置分视图,以及花园场景中最终的水着色器反射图

如果您需要更高的视觉质量和更接地气的反射效果,URP 的平面反射技术会是一个很好的选择。平面反射能在平面上产生镜面反射,由于水网是平面结构,因此非常适合水网。

要实现平面反射,需要设置单独的摄像机和渲染纹理来存储反射数据。其基本概念是在反射平面(本例中为场景中的流媒体)下方放置一个反射摄像机,并根据播放器摄像机的位置和方向进行更新。渲染纹理也会实时更新。

这样做的好处之一是可以将反射相机的近平面设置为反射平面。这样就不需要剪切出位于反射面下方的对象,从而简化了执行过程。在着色器图形中,你可以创建一个纹理属性,然后在脚本中将之前创建的渲染纹理分配给它。

为了成功链接渲染纹理,请确保在设置着色器属性时,所设置的属性与您在着色器图中创建的纹理属性的引用 ID 相匹配。确保脚本在更新渲染纹理时调用了准确的属性 ID。然后,使用屏幕位置作为 UV 对纹理进行采样。现在你已经在着色器中成功实现了平面反射。

平面反射示例场景

实现平面反射需要考虑一些技术因素和细节。如需更深入地了解URP 及其实施示例,请参阅此URP 示例。值得注意的一点是,与使用反射探针相比,平面反射的计算成本更高,因为它会对物体进行两次渲染。

边缘效应

要实现边缘泡沫效果,需要计算深度差。对于不透明对象,"场景深度节点"中的Linear01选项会返回一个从 0 到 1 的线性深度值。将该值与 "摄像机远平面距离"相乘,就可以确定摄像机与不透明物体(本例中为岩石)之间的距离。 屏幕位置节点Raw 选项的 z 分量提供了视距深度。然后,您就可以轻松计算出透明水面与不透明岩石之间的深度差,并将深度值传递到发射输出中,以创建类似泡沫的效果。

在编辑器中计算深度值与现场结果的分割视图

为了从场景中获取深度值,请确保在项目设置中启用 "深度纹理"。您可以在渲染管道资产的 "常规 "部分找到 "深度纹理 "选项。可通过"编辑" >" 项目设置 ">" 图形 ">"渲染管道资产 "访问当前的渲染管道资产

Unity 编辑器中 "通用渲染管道资产 "窗口的视图,显示如何找到 "深度纹理 "选项
流线

小径的制作非常简单,它可以显示溪水的流向。通过平铺和偏移两个 Voronoi 节点,并使用顶点颜色遮蔽所需的区域,就可以创建出沿着水面流动的风格化水迹。然后,调整噪音节点的速度,使其与之前的落水速度相匹配。现在,风格化的水迹在水面上流动。这与制作瀑布流线的技术非常相似。

编辑器中使用 Voronoi 节点的流量指示器与现场结果的分割视图
沙子着色器
使用着色器图形中的自然着色器制作的沙地最终场景示例

现在,让我们换个角度,看看一个不那么风格化、更真实的着色器。沙子着色器位于一个逼真的沙漠场景中,这就要求地形在视觉上与真实世界的沙子非常相似。

沙地渲染是一项有趣的挑战。普通的 PBR 着色器无法捕捉到强烈阳光下的沙漠沙粒效果。沙粒着色器有两个主要特征:一是沙粒闪光,这是一个微妙但值得注意的方面;二是吹起的沙尘,这是一个动态特征,可增加生动性。

由于沙子是由无数小颗粒组成的,所以在阳光照射下会闪闪发光。如何实现闪光效果?与镜面反射类似,首先使用表面法线计算反射矢量。从 旅程的启发,不计算法线向量和半程向量的点积,而是计算法线和视线方向的点积。这种调整可确保闪光图案根据视角的不同而变化,从而增强着色器的视觉吸引力。

着色器中有两个噪声贴图。其中一个用于火花采样,另一个用于遮盖主要噪点纹理,以获得更具活力和吸引力的效果。使用之前计算出的反射向量来扭曲用于噪声掩膜采样的 UV。

编辑器中的噪声地图与现场效果的分割视图,显示沙粒闪光效果

吹沙效果由两个元素组合而成:移动沙道和沙浪。概念相当简单明了。您是通过平铺不同的法线贴图来实现所需的效果。沙径的一个关键点是,你需要一个遮罩来遮挡法线贴图,使效果看起来更有活力。不使用默认 UV,而是使用两个具有绝对世界位置的噪声贴图进行采样。

值得注意的一点是,"位置节点"中的 "世界 "选项会根据不同渲染管道的设置而发生变化,因此请选择 "绝对世界 "选项,以避免在切换管道时发生任何行为变化。接下来,将两张地图以对角线方向平铺,这样就会产生类似波纹的效果。然后沿沙浪方向滚动另一张噪音图,以增加沙子移动的感觉。

如何在编辑器中的位置节点内选择 "绝对世界 "选项与场景中的结果对比的分割视图,显示吹尘效果

一个重要的方面是如何在着色器中实现法线混合。在沙地地形中,反照率图可能没有其他地形那么复杂,因此法线对视觉效果起着重要作用。在着色器中混合多个法线贴图。与混合反照率地图不同,法线地图存储的是方向,不同的混合方法会产生截然不同的结果。

让我们以着色器图形中的法线混合节点为例。在混合法线贴图 A 和 B 时,"法线混合 "节点中的默认选项会将两个贴图的 x 和 y 通道相加,同时将 z 通道相乘,以获得混合法线的第三个元素。调整方向方案,顾名思义,涉及到一个更加复杂的过程。这种方法从两个地图中保留了最多的数据,但计算成本也最高。

着色器图形中 "法线混合模式 "的三维混合比较视图 - 场景中的 "调整方向"、"默认 "和 "方法

在着色器中,我们选择了一种简单的法线混合方法。混合法线的主要原因是为了营造出沙漠表面风沙吹动或移动的生动感觉。准确性并不是重中之重。此外,着色器应用于相对较大的地形网格,因此最大限度地降低计算成本非常重要。

考虑到这些因素,这里有一个简单明了的方法:将法线贴图的红色和绿色通道相加,蓝色通道的值为 1。然后,将正常强度放大一点,效果就会很好。

将 Unity 沙地场景样本的最终分割视图与编辑器中的设置进行比较,以显示法线强度更大的方法

除上述功能外,着色器中还实现了其他控制功能。其中一个是通用的渐变控制,它可以根据摄像机的拍摄距离来决定特效在地形上出现的位置。这样,当镜头移到更远的地方时,效果就会逐渐过渡和消失。

您还可以调整远景的平滑度值,使沙丘和背景地形更好地融合在一起。当查看器放大时,详细的颗粒度法线贴图会取代地形法线。这种替代品为您提供了更逼真的沙漠体验,增加了沙面的细节和纹理。

既然你已经了解了这两种着色器的所有功能,那么就不要犹豫,创建你自己的版本吧。如果你热衷于使用 Shader Graph 创建着色器,请加入我们的论坛或在Discord 上找到我们。请务必关注 Tech from the Trenches系列,了解 Unity 开发人员未来的技术细节