MENU 导航菜单

Shader Graph 2021.2 新功能,可极大改善艺术创作流程和着色器表现力

奇正资讯 > Unity资讯 更新时间:2021/12/20

随着 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 资源包:

https://assetstore.unity.com/packages/essentials/tutorial-projects/viking-village-urp-29140


水体与着色器样例:

https://drive.google.com/drive/folders/1aY0CWr5Qco2rOlN5KgixWFkKZJhMmj2F

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 来生成多种材质变体。


图片


并且,你还可以在材质检视器中轻松在 Metallic-Roughness 和 Specular-Glossiness 工作流之间切换。下方简表列出了两种工作流的差异,详细的不同可通过以下链接查看。
https://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html


图片


以项目中的 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 演示有些许不同,我们还在水面上加上了一些泡沫。 


图片


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


图片


我们再来看看着色器法线贴图的平铺情况。为了形成更好的波浪效果,原着色器会在两个方向上平铺两张法线贴图,渲染运算以像素为单位。而在 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 手册:

https://docs.unity.cn/Packages/com.unity.shadergraph@12.0/manual/Custom-Interpolators.html

Blackboard Categories(黑板分类)


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


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


图片


图片


本文中所谈及的所有功能目前都以发布于 Unity 2021.2 的最新版 Shader Graph 中,欢迎大家下载试用:

https://unity.cn/releases


本文转载自unity公众号


下一篇:Unity技术年度汇总分享,成熟引擎技术赋能游戏未来开发新需求 上一篇:上海地铁使用 Unity 开发智慧轨交数字孪生综合运维应用