随着 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 资源包。下方的水体与着色器样例可以下载。
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 等常见的属性。让我们在演示项目中仔细看看这个选项。
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 来生成多种材质变体。
以项目中的 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 演示有些许不同,我们还在水面上加上了一些泡沫。
我们再来看看着色器法线贴图的平铺情况。为了形成更好的波浪效果,原着色器会在两个方向上平铺两张法线贴图,渲染运算以像素为单位。而在 Custom Interpolator 的支持下,UV 的平铺现在可以部分转移到顶点阶段(vertex stage)。
为了展示出 Custom Interpolator 对性能的促进作用,我们建立了两个版本的场景进行对照,以水体着色器作为实验变量,在一个着色器上应用 Custom Interpolator,另一个则不使用插值器。我们使用 PIX 截取两版场景的帧,分析 GPU 渲染成本。结果非常明显,在应用了 Custom Interpolator 的着色器上,绘制调用的持续时间减少了 33%。
使用 Custom Interpolator 时需要注意的是,片元阶段(fragmentstage)的运算频率要比顶点阶段(vertexstage)更高。有时,前者的运算在后者之后会造成渲染成果损失一定的细节。Custom Interpolator 最多支持 32 个通道,而不同的平台和 GPU 有着不同的插值器变量上限。详情请参见 Shader Graph 手册。
Shader Graph 手册:
Blackboard Categories(黑板分类)
随着着色器变得复杂,大量的属性堆在黑板上容易让人眼花缭乱。现在,你可以使用分类功能将各个节点划分成组,再到作为可展开的设置暴露到材质检视器中。
我们继续以水体着色器作为例子。在 Shader Graph 的黑板上,所有与法线贴图相关的属性都被归到了一个称作 Wave Normal 的类别。这时我要想在场景的材质检视器里修改属性,就可以很容易地找到这一组属性。一组属性可以折叠起来,让检视器看起来更精简。
本文中所谈及的所有功能目前都以发布于 Unity 2021.2 的最新版 Shader Graph 中,欢迎大家下载试用:
本文转载自unity公众号