搜索 Unity

Image of wooden cottages on a beach near sparkling aqua colored water
Image of wooden cottages on a beach near sparkling aqua colored water
分享

Is this article helpful for you?

Thank you for your feedback!

随着Unity 2021.2的发布,我们为Shader Graph推出了一些非常有用的新功能,包括对通用渲染管线Surface Options(表面选项)的支持、Custom Interpolator(自定义插值器)以及Blackboard Categoties(黑板分类),这些可极大改善艺术创作流程和着色器表现力的功能。

在这篇博文中,我们将以先前发布的Viking Village项目为基础,来介绍怎样重现项目中部分应用了新功能的着色器。

Viking Village资源包

Viking Village URP资源包可从资源商店下载。在这个演示项目中,我使用Unity的2021.2 beta 7版本与URP模板创建了一个新的URP项目。在打开项目后,下载并导入Viking Village URP资源包。下方的水体与着色器样例可以在此处下载

URP Surface Options

我们要展示的第一个功能是URP Surface Options。该功能允许Lit(受光)或Unlit(不受光)的Shader Graph着色器将Surface Options属性暴露在Material Inspector(材质检视器)中。你也可以启用“Allow Material Override(允许覆写材质)”选项,在材质检视器上罗列出Surface Type、Alpha Clipping或Shadows等常见的属性。让我们在演示项目中仔细看看这个选项。 

graph inspector and material inspector in URP

Viking Village URP资源包带有许多种材质,多数材质有着不同的表面选项设置,但所有材质使用的着色器可能没有太大的差异。Graph Inspector新的Allow Material Override选项支持在Shader Graph中为每个材质实例覆写表面选项,因此每个Shader Graph着色器可以有不同的材质设定。

我们来看一些例子。本项目的Mat_fence_02.mat使用的是standard.shadergraph,而Mat_strawroof_01.mat使用的是standard_AlphaClip.shadergraph,由standard.shadergraph启用Alpha Clipping后衍生而来。在Graph Inspector中启用“Allow Material Override”选项后,你可以通过控制着色器材质的Alpha Clip来生成多种材质变体。

Image of Mat_fence_02 vs. Mat-strawroof-01 project settings in shader graph

并且,你还可以在材质检视器中轻松在Metallic-Roughness和Specular-Glossiness工作流之间切换。下方简表列出了两种工作流的差异,详细的不同可在本页面查看。

以项目中的Lit_SSS_Cutout.shadergraph为例。这个着色器主要负责渲染项目中的植被材质,其工作流默认设置为Metallic。如果我们只想把该着色器下的某个材质转换成Specular工作流程,在启用Allow Material Override选项后,我们就能在不影响着色器其它材质的前提下到材质检视器中覆盖工作流。

Custom Interpolator(自定义插值器)

在熟悉了项目和部分着色器资源后,接下来我们想向你展示另一个Shader Graph的新功能,我们起名为Custom Interpolator。

Custom Interpolator能在Vertex Stage(顶点阶段)到Fragment Stage(片元阶段)传入顶点数据或Vertex Stage(顶点阶段)的运算结果等各类数据,让着色器有更强的性能。 

这里,我们将借用Master Stack博文中的水体着色器来演示效果。为了让水体着色器更好地融入环境,我们来为其添加一些反射和折射效果。 

这里的着色器与Master Stack演示有些许不同,我们还在水面上加上了一些泡沫。 

我们还使用了Simple Noise Node来平铺和偏移UV,形成泡沫纹理的扭曲效果。纹理本身的RGB通道上也储存了不同密度的泡沫图案。为了让效果更真实,每条颜色通道上的纹理都会向相反的方向扭曲。为了让泡沫更显生动,我们还以水波的法线贴图作为遮罩,让泡沫能自然地与波纹融合在一起。而为了提高着色器性能,泡沫本体的渲染运算放在了顶点阶段进行。

Process: Distort the UVs in Vertex Stage to the Fragment Stage via Custom Interpolator

我们再来看看着色器法线贴图的平铺情况。为了形成更好的波浪效果,原着色器会在两个方向上平铺两张法线贴图,渲染运算以像素为单位。而在Custom Interpolator的支持下,UV的平铺现在可以部分转移到顶点阶段(vertex stage)。

Normal maps UV tiling: pass to the fragment stage via custom interpolator

为了展示出Custom Interpolator对性能的促进作用,我们建立了两个版本的场景进行对照,以水体着色器作为实验变量,在一个着色器上应用Custom Interpolator,另一个则不使用插值器。我们使用PIX截取两版场景的帧,分析GPU渲染成本。结果非常明显,在应用了Custom Interpolator的着色器上,绘制调用的持续时间减少了33%。 

Pix comparison of water shader without custom interpolator vs water shader with custom interpolator

使用Custom Interpolator时需要注意的是,片元阶段(fragment stage)的运算频率要比顶点阶段(vertex stage)更高。有时,前者的运算在后者之后会造成渲染成果损失一定的细节。Custom Interpolator最多支持32个通道,而不同的平台和GPU有着不同的插值器变量上限。详情请参见Shader Graph手册

Blackboard Categories(黑板分类)

随着着色器变得复杂,大量的属性堆在黑板上容易让人眼花缭乱。现在,你可以使用分类功能将各个节点划分成组,再到作为可展开的设置暴露到材质检视器中。 

我们继续以水体着色器作为例子。在Shader Graph的黑板上,所有与法线贴图相关的属性都被归到了一个称作Wave Normal的类别。这时我要想在场景的材质检视器里修改属性,就可以很容易地找到这一组属性。一组属性可以折叠起来,让检视器看起来更精简。

Normal map properties are grouped into wave normal section, which can be collapsed to save space in the material inspector

本文中所谈及的所有功能目前都以发布于Unity 2021.2的最新版Shader Graph中。如果你有任何反馈或想进一步了解Shader Graph,可以随时加入我们的论坛Discord频道。你也可以在我们的Productboard上了解Shader Graph未来的开发计划和更新。

Is this article helpful for you?

Thank you for your feedback!

相关文章