MMD联动Unity学习笔记 Vol.19 Shader Graph制作能量护盾

前言
这期我们的主题继续学习ShaderGraph。这期是Unity官方达哥制作的视频《Unity Shader Graph第二期:制作能量护盾》。Up记录下来方便复习。下面是视频链接。


具体操作
我们这期利用拉节点的方式来制作一个能量护盾的着色器。之前有介绍过使用Shader Graph要准备哪些插件和设置,所以这期不再赘述,没有看过的小伙伴先去看一下之前的笔记(视频)。因为接下来会省略很多之前有介绍过的操作说明。

达哥准备的是一只机械蜘蛛(我们随变找个模型),它身上原本就带有一个材质,上面的着色器是Lit着色器,就是LWRP管线的标准着色器,上面该有的纹理都有了。

接下来新增一个PBR Shader Graph ,然后把材质上的Shader换成这个着色器,新的着色器默认什么效果都没有,接下来我们要在编辑器内把那些栏位加回来。物件本身带的纹理上一期有介绍过了。如何用Sample Texture 2D来指定回这些纹理,这里也不是本期的重点。所以这里我快速的把这些节点添加进来。

我们边播放边调整会看的比较清楚。要制作能量护盾之前,我想先介绍一个节点叫做,Frenel Effect(菲涅尔效果),它有点像是Outline的连线效果,但又没有那么锐利,它的原理是基于View视角面向网格,如果 反射角度越大,回传的值就越大,这样的特性我就可以从摄像头去推算出模型的边缘在哪。我把它直接连到主节点的Emission,就是发光通道。

它就会作为自发光信息反映在模型上,你可以看到现在模型开始发出白光,而且越接近边缘的话越白,菲涅尔是可以调整强度的,所以Power的值越大效果就会越锐利,虽然这个节点没有颜色信息,但Emission是可以接收颜色信息的,所以我们可以新增颜色节点,但要记得一个输入不能够接受两个输出,所以这边我们得用乘法节点,把两组信息合并起来才送到Emission去。

如果想要从外面可以调适数值,你可以把这两个变量改为全域(局)变量,让他们可以从外面去修改,新增一个Vector1,改为Slider大小值改1-10好了,把他拉到图面上,连到Power栏位,Color在这里本身就是个变量了。所以你可以在它上面直接按右键,选Convert to Property直接转成全域(局)变量,现在可以从外面的代码直接调整这两个值了。

了解了菲涅尔效果的做法之后,我们可以试着在这个人物身上用相同原理来制作护盾。首先添加一个Capsule胶囊模型在人物上,然后调整大小让它可以包住这个人物。

为了避免碰撞可以先把Capsule Collider碰撞体先关掉,跟刚刚一样生成一个材质给这个胶囊,然后也生成一个着色器,这里由于不需要表面纹理我们可以试试用Unlit Graph。

把胶囊体的着色器改为这个新的着色器,打开着色器编辑,Unlit的节点比PBR少很多,能画的层比较少当然性能也比较好。很适合护盾这种不需要太多效果的着色器,这次我们只会用到Color和Alpha这两个通道,然后跟前面一样,把菲涅尔特效实现在这里,并指定给Color通道。如果要有颜色就要加上颜色节点,并用乘法节点连起来。

然后把要做为外部的变量值设置一下,我们现在有个便宜版的护盾效果,如果你要这样就出了也可以,没氪金大概就长这样。233

如果有氪金的话呢再给他透明度就好啦。那你要制作透明度要传值给Alpha透明通道。

虽然我们刚刚有讲输入无法同时接收两个输出来源,但是输出却可以同时输出给多个不同的输入节点。

如果目的节点还没生成的情况下,你也可以直接从输出节点拉出一条线到空白的地方,系统会直接询问你要产生的新节点是什么,并且自动连上,这里我产生一个乘法节点,终点接到Alpha通道,然后Master节点按一下(齿轮),把第一个Surface的值改为Transparent,让它变成接受透明度。

存档就可以看到你的护盾变成透明了。

接下来我想让护盾除了发光之外也可以有点纹理,所以我刚刚预留一个乘法节点,就是为了要添加一层纹理。你可以添加一个Sample Texture 2D连到乘法节点,并且指定一个纹理,你就可以看到护盾有效果,但是我还希望再多做一点设置,所以我另外添加一个Position节点来影响UV通道。上次我们已经介绍过世界座标和物件座标,这次我们用View这个座标系从摄像头的方向来绘制这个纹理。你可以看到纹理效果有中断的感觉,没有像瓷砖一样无限循环,所以我可以加一个Tilling and Offset这个节点来处理循环还有平移的效果,你把它接到UV通道,并且生成一个Vector1来作为调适强度的值,然后连到Tilling。

现在从外面可以调整纹理的循环数量,我把纹理也改成外面可以调试的,然后换一张纹理来比较看看,虽然替换新纹理了,但是胶囊本身的阴影影响了视觉,我把颜色Mode模式改为HDR,就可以透过强化颜色来解决黑黑脏脏的问题。

阴影的部分你可以从Mesh Renderer把Cast Shadows改为Off把它关掉。

这种做法不管你的摄像头怎么动,画面都会保持画出一个封闭的护盾,纹理也会依照你的方向来绘制,不同的护盾形状,只要用这个着色器放到不同的物件就可以解决。

你可以指定到不同的材质,然后换不同的纹理就感觉换不同的护盾。

比对World和View设置差异,可以感觉一下哪一种比较适合你的游戏类型。

如果你直接应用这个着色器到任何没有纹理的模型,它就会变成是有点像隐形怪的作法,是不是很方便。

最后要分享的是,关于Shader Graph是否能用在Unity传统的Built-in的渲染管线,虽然官方的答案是不行的。如果你从新的Shader Graph做完之后,想要拿回旧的Built-in Pipeline去运行的话,基本上你要自已去修改代码,把那些不兼容的部分通通移除掉,所以这代表是必须有一定的程序基础的,这样子的话你就可以从Shader Graph里面去把整个Shader的代码拷贝出来,然后自己把它排除掉。

最后感谢达哥带来的视频分享,非常受益。