Shader Graph学习(二)

这篇文章我们将通过一个简单的案例来深入的学习一下Shader Graph的一些Node以及对应的功能。

首先安利一个视频:https://www.bilibili.com/video/BV1Db411e7Ag

本文也是按照视频中的案例进行简单的描述。

首先先来看下我们做好的Shader Graph的内容:

实现的效果如图所示,通过shader使一个物体上下摆动,同时贴图流动的效果。

Node介绍

动手之前,我们先来了解几个Node,其实只要知道了所有Node的功能,再复杂的ShaderGraph都能够读得懂了。

Time Node:

提供对shader中各种时间参数的访问,一共有五种输出

  

Time 当前的时间值
Sine Time 当前时间的sin值
Cosine Time 当前时间的cos值
Delta Time 当前帧时间,前一帧到后一帧的时间
Smooth Delta  平滑后的当前帧时间

UV Node:

可以获取到mesh的顶点或者片段的UV坐标,可以在Channel中选择你所需要的uv类型进行输出

   

有关UV0-UV3,可以看上右图,unity一共支持四套uv,在Shader中分别叫UV0,UV1,UV2,UV3,UV0用于主纹理, UV1用于光照贴图, UV2用于实时动态光照, UV3可进行自定义。

Position Node:

可以获取到mesh的顶点或者片段的位置信息,可以在Space中选择输出的空间坐标系。

  

Object 模型空间
View 观察空间
World 世界空间
Tangent 切线空间
Absolute World 绝对的世界空间

注:在不同的SRP中,世界空间可能是不同的,例如在HDRP中默认的世界空间是取决于摄像机关系的,因此我们可以使用Absolute World来获取绝对的世界空间位置。

Tiling And Offset Node:

可以用于对输入的uv进行平铺和偏移的操作,通常可以和Time Node结合制作滚动纹理的效果(也就是我们例子中的效果)

剩下一些比较简单的Node就不过多介绍了,例如加法运算的Add Node,乘法运算的Multiply Node,求正弦值的Sine Node,拆分多维向量的Split Node,以及对应的Combine Node用于将一维向量合并,等等。以及一些暂时还没介绍到的重要节点,大家可以先查阅官方文档:https://docs.unity3d.com/Packages/[email protected]/manual/Node-Library.html

介绍完这些节点,最开始的ShaderGraph就很好理解了,下面就简单的描述一下。

流动效果

我们先来看下流动贴图的实现原理

首先我们需要一个Sample Texture 2D Node来进行贴图采样,然后创建一个Texture 2D Asset Node来用于贴图的选择,将其输出关联到我们的Sample Texture 2D Node的Texture 输入上即可。此时若将Sample Texture 2D Node的RGBA输出关联到我们Master的Albedo的输入上,mesh就会显示我们所选择的贴图了。

那么如何让其流动起来呢,这时候我们就要从UV来入手。所谓的流动其实就是贴图一直在做偏移操作,那么我们可以利用Tiling And Offset Node来给uv坐标施加偏移效果,如何使偏移量一直随着时间而增长呢,Time Node的Time输出正好符合这一要求,因为Time是一个递增的值,我们将其赋值到Offset上,就可以实现随着时间一直偏移的流动效果了。

至于改变贴图的颜色,我们只需要利用Color Node 和 Multiply Node即可,利用Multiply Node将Color Node输出的颜色与Sample Texture 2D Node输出的颜色值相乘即可。

拓展:

1.如果想要来回流动的效果,可以使用Sine Time。

2.若要改变流动速度,我们可以添加一个Vector 1 Node,然后利用Multiply Node将其和Time相乘,然后将输出的值赋值到Offset上。

摆动效果

接着我们来看看相对比较复杂的摆动效果的实现原理(由于自己莫得模型,用的Cube,顶点只有两头有,因此无法像视频中的“龙”那样摆动)

同样的,我们要了解怎样才能实现上下摆动的效果,既然是上下摆动,那么肯定是顶点的Y轴位置偏移。结合前面的流动效果,利用Sine Time来实现上下摆动。

首先利用Position Node,Space选择Object来获取顶点的位置,由于输出是Vector3的值,而我们只想改变Y的值,所以需要利用Split Node来进行拆分,然后我们将Y的值与Sine Time相加,再利用Combine节点合并原本的XZ和新的Y值,最后将新的位置信息关联到Master的Vertex Position上,如图:

不过现在我们的物体是整体的进行上下移动,因为我们现在所有顶点的偏移量都是相同的,并没有达到像“龙”那样的摆动效果。由于我们的“龙”是随着Z轴摆动的,也就是随着顶点Z的不同,Y的偏移量也不同,而Z轴相同的顶点,Y的偏移量相同。根据这个特征,我们可以将顶点位置Z的值进行Sine计算作为Y的偏移量。这样我们的“龙”就可以扭曲了,但是还并不会动,因此我们需要将Z的值和Time值相加再进行Sine计算,来作为Y 的偏移量。这样我们的龙就真正的摆动起来了。

最后讲解下三个可配置参数的理解:

Frequency:摆动的频率,这个值与Z轴相乘,缩放Z的值,相同时间下会改变Sine后峰值的个数,也就改变了“龙”的扭曲程度。

Speed:摆动速度,这个值与Time相乘,例如增加这个值,会使相同时间间隔下,偏移量变化的更大,使其摆动的更快。

Distance:摆动的距离,这个值很好理解了,与偏移量相乘,直接改变Y轴的偏移效果。

猜你喜欢

转载自blog.csdn.net/wangjiangrong/article/details/105417900