欢迎光临散文网 会员登陆 & 注册

MMD联动Unity学习笔记 Vol.18 ShaderGraph制作飘动的巨龙

2019-05-26 16:07 作者:NXL2  | 我要投稿

前言 

    这期我们的主题继续学习ShaderGraph。这期是Unity官方达哥制作的视频《Unity如何制作飘动的巨龙》。Up记录下来方便复习。下面是视频链接。

具体操作

   首先在PackageManager安装LightweightRP和ShaderGraph这两个套件,如果把LWRP改为HDRP也可以,在资源文件夹中然后切到Edit->Project Settings,里面的Graphic找到这个Scriptable Render Pipeline,并指定刚刚生成的文件。

    设置准备完成之后,我们开一个新场景来说明。准备一条龙的模型(没有的话我们可以在Blender新建长条形状来替代),一般来说就是美术从3D Max或Maya画好,连同纹理一起转过来的,它身上带有一个最基本的材质球,目前指定的是Lightweght Render Pipeline/Lit这个着色器,然后什么纹理都没有。

新建PBR着色器

    首先我们先帮它把着色器换成新的,在Project点右键选Create ->Shader ->PBR Shader Graph,选择PBR Shader Graph,它会产生一个新的Shader,先改个名字,然后我们点一下模型,把材质指定的着色器换成这个在Shader Graph里的新的着色器,指定好之后可以选择旁边的齿轮,并点选Edit Shader...就会打开着色器的图形编辑画面。

调整版型

    调整了一下版型,编辑画面放在正中央,然后右下角放一个画面可以马上看到修改结果,预览画面的上面是着色器现在的资料,从这里可以看到一个全新的Shader。除了默认资料之外什么都没有,编辑画面里的PBR Master是这个着色器的主节点,最后输出会从这里呈现。

    上面的设置基本上就是Unity标准着色器上那些设置,Albedo负责表面纹理与颜色,比如我们把颜色改成红色,并按一下Save Asset存档,就会看到模型立马变成红色。

    现在我想新增一个用来放纹理的节点,在空的地方按一下右键,选Create Node ->搜索Sample,找到Sample Texture 2D,这个节点专门用来取样一张纹理,左边的Texture可以指定一张纹理,能常是美术画好的表面纹理,右面则有不同的输出设置,你可以针对纹理的RGBA全部输出,或者是只输出某一个通道,现在我从RGBA拉出一条线连到Albedo。

    因为默认种颜色已被取代,因此存档后物件会变回白色,然后我指定一张纹理给它,原本空空的材质设置会多出一个纹理图,但是Texture 2D显示是灰色的,无法更改这张纹理。

    如果想设计成让别人也能修改这张图,就必须要把这里设置为全域(局)的变量,我们可以在左边的变量检视窗口(黑板),新增一个Texture 2D,我把它命名为Skin_a,并确保Exposed有打勾的状态拉到编辑画面里,系统会自动产生一个节点,这个变量就会负责承接着色器以外的资讯(信息),现在就可以从这里修改设置了,美术准备的法线纹理也可以通过这个方法来指定,这次我用复制节点的方式来复制一个节点和设置,添加另外一个Texture 2D,命名为Skin_n,一样拖到编辑画面上并连到法线纹理节点的Texture栏位,并从RGBA连到Normal,这里的Type要记得改为Normal,Space则要看哪种类型的法线纹理,这里通常是Tangent,存档。

    并指定美术提供的法线纹理,你就会看到凹凸的感觉出现了,数值类型的变量从里面调整必须要存档才能看到改变,如果你想要从外调整立马看到改变的话,就可以添加一个Vector1变量来连接,默认是输入值的方式,你可以把Mode改为Slider并定义最大值和最小值,就可以这样用拉的。

    接下来我们来介绍本次的重点部分,先把版面整理一下,要让龙动起来最重要的节点之一是Position Node,座标节点,他有四种空间可以选择分别是,物件座标,镜头座标,世界座标和切线座标。

四种空间选择

    座标输出当然就是XYZ的值,输出的这条线不同颜色代表不同的输出量,分别是1个蓝色,2个的时候是绿色,3个的时候是黄色,4个的时候是粉红色,数量大的连到数量小的代表会有数值被忽略。

数量大的连到数量小的代表会有数值被忽略

    如果像这样直接用世界座标取代物件座标,大概就是像这样看起来偏移了一定的量,如果改为物件座标,当然就是是把相同的值覆盖上去看不出改变,Position的输出有3个,即XYZ,我可以用Split节点来拆成三个值,这个节点支持分离4个值,但因为输入只有三个值,因此只会拆出三个出来,既然有分开节点当然就会有组合节点,即Combine节点。Combine节点可以把输入的4个值组合成一组,如果我原封不动的把所有的座标都组合回来,连回Master节点上的Position,结果当然不会有任何改变。

    有了这层概念,我希望可以通过不断的修正某一个座标的值,来达到扭动的效果,这里我会添加一个Add节点,他是负责把两个值加起来的加法节点,我把X的值改连到这里后在接回组合节点,我就多一个输入可以来影响这个值。如果想要不断的改变值,Time时间的节点是很好的选择,它有很多种时间格式可以选择,我们可以用Sine Time来影响座标试试看,现在你可以看到物件从头到尾并没有改变它的座标,但可以看到龙(物件)在左右的平移。

平移

    接下来我们想要针对不同的节点给不同的值,因此我可以添加另一组Position的节点,一样用Split节点来拆开它的值,我想把这里的座标刚刚的时间加在一起,所以我添加一个Add节点,并且只取物件的Z轴数值和时间节点的Tme做加法运算,我在两个Add中间添加一个三角函数Sine的节点,用来把前面不同时间送过来的顶点座标做角度偏移的计算。

    现在你可以看到龙已经开始扭动了,这张图的Time,Position和Sine所带来影响,白话的说法就是摆放的速度,摆动的频率和摆动的距离。

    接下来我来将这三个变量设计为可以改变的,新增三个Vector1,分别命名为Speed,Frequency,Distance,分别拉到编辑画面和Time下面的Split和Sine配对。

添加三个参数暴露给检查器

    前面介绍结合两个值可以用Add节点,那么要放大一个值可以用Multiply,乘法节点,因为我们做成可以让别人调整的值,如果数值到达100才会有感觉的话,那就很适合用乘法来让它变成从0-1就有感觉,所有输入的类型其实都还蛮适用这个原理,所以我们来新增三个乘法节点,并插入到刚刚添加的三个数值后面串起来,存档。

最终图表

    从外面可以看到三个数值已经被新增上去,稍为调整看看。现在龙开始爬行了。

    如果你是用骨架动画来做的话,这里肯定要重新制作动画了。原本影响的X轴座标我改为影响Y轴座标就可以了。

    由于整条龙共用一个着色器,所以头部当然会变形,想解决这个问题可以把头部改用其他着色器。或是把这个着色器应用在像这种大量且离摄像头远的物件也蛮适合的。

    看到这里也许你想问,这种图形化的着色器能够修改代码吗?答案是可以的。在PBR Master上按右键,点选Copy Shader,就可以把最终不含编辑器的Shader代码复制出来。

复制着色器代码

    这样子你就可以继续依照不同的平台适配性来修改或优化,如果你想要查询这些节点的用法信息,可以在任何节点上点右键选Documentation,系统会转到Shader Graph的Github。

连接外部文档

    这里可以连到文件的页面,你可以从这里搜索所有节点资料和用法,未来会直接连到每一个节点的说明,你可以看到除了节点资料之外,还能看到代码的范例。

    从此美术小伙伴再也不用担心要写代码了。


MMD联动Unity学习笔记 Vol.18 ShaderGraph制作飘动的巨龙的评论 (共 条)

分享到微博请遵守国家法律