您需要 登录 才可以下载或查看,没有账号?注册
x
我是一名入行快"两个巴掌"的老特效了,从一个小白摸爬滚打到现在,见证了页游到精品手游的不同时代,使用的引擎和参与过的项目也是要"两个巴掌"才数得过来。但还是觉得自己懂太少,要不断学习,不然就会被时代狠狠的甩下,它才不会管你入行多少年。 市场上每年都有琳琅满目的教程不断的涌现出来,也买了不少,看了不少,被坑的也不少。很多炫技的确实很厉害,效果也非常好;但学完之后发现,这些技术用在个人作品上是挺好的,但如果放到项目中去用,可能会被程序大哥们集体围殴吧!哈哈~开个玩笑下面认真一点。 由于近两年都在用Unity开发项目,自然遇到的问题也是层出不穷,其中一个最大的痛点应该就是关于Shader方面了吧,说实话也学了不少这方面的知识,但基本都是教我们连连看。项目组也有懂Shader的程序大佬,但你的需求和他们写出的总感觉哪里不对,又不能随时叫他修改和添加功能,使用起来很憋屈,但也只能忍了(谁让咱自己不会嘞)。有时候他们得一句:‘这个加不了!’怼得我也是哑口无言。于是继续在教程海洋里不断寻找着!有一次一个朋友无意间给我推荐了一门教程,说是专门讲Shader的,问我有没兴趣。我开始以为又是连连看,没有太在意。直到有一天我打开了课程目录,天哪~!一堆我认知以外的专业名词,瞬间让我起劲了,想立刻就拥有的冲动。毕竟价格还是不便宜的,冷静下来后,上网找了一些关于目录的资源,发现这门教程真的是从很基础和底层开始教我们如何一步步的深入,理论和实践相结合。最后用我吃了一周泡面省下来的钱,我成功报名了。说实话,刚开始学习是有些小吃力,太多新名词、新知识、新概念,看了就想睡,听了就忘。感觉有点受挫,中间有持续了差不多两个月没打开过。但后来项目中遇到的问题依旧还在,再想想我当初是如何下定决心要买它的,现在又怎么对得起那一周的泡面。于是我看了一遍不会,看两遍,再加上老师的私人耐心指导,几天下来,发现效率明显提高了很多。直到做出自己的第一个纯代码写的Shader,虽然功能很简单,但成就感确是满满的。到目前我已经学了一大半,也已经能独立编写一个复杂的特效通用Shader合集了。现在在公司打开VS Code在敲代码的时候,时不时有同事走过来,不管是美术还是程序看到都会感叹一句:‘厉害呀~你居然还会写代码’。其实我也不想在他们面前显摆,但感觉实力已经藏不住了(老脸一红)。现在课程还在不断的更新内容,感觉可以学的知识真的还有很多很多。现在回头看,这个教程真是太值得了!离我的TA梦又近了一步。牛也吹完了,接下来我就分享下我最近的学习成果吧。
课程中也有教用C#如何去自定义化材质界面,但是我还没学,所以暂时放个原生版的~
这里根据整个Shader的参数面板,大致说明下各模块功能。
1.渲染模块(Render) 包含:混合模式、面剔除、深度写入、深度测试。
2. 模板缓冲区(Stencil) 这里面也是将整个‘模板缓冲区’的参数都暴露出来提供使用。
3.主纹理区(Base) 这里除了基本的颜色、UV流动速度、颜色强度外;还加了UV是否平铺、去色、UV反转和旋转功能。这样可以让一张贴图的可用性最大化。另外还加了一个遮罩的颜色调节功能。
4.扭曲模块(Distortion) 这个模块看去比较简单,只有一个贴图属性加一行四维参数,前两个是UV速度,Z值是控制主纹理,W值用来控制溶解纹理(因为溶解的参数都用满了,为了省资源才放到这)。但后面流光和遮罩图片也都会受这到扭曲的影响,当然这个模块不勾选,所有扭曲都失效。
5.流光模块(Streamer) 这个确实是最简单的模块,只有纹理、UV速度、强度、扭曲强度可以调节。
6.遮罩模块(Mask) 这里面也加入了和主纹理一样的UV平铺、反转、旋转等功能。除此之外还有一项遮罩类型可以选,可以是它自身做遮罩,也可以将它和主纹理去色后相乘的结果做遮罩。
7.溶解模块(Dissolve) 这无疑是功能最复杂的一个模块,为了做出好的溶解效果,功能也是一加再加。按顺序分别是:亮边颜色、纹理,软硬边、整体溶解范围、亮边宽度、亮边强度、纹理溶解范围,UV速度的过渡、两次采样的UV速度,溶解纹理和遮罩纹理的过渡(未开启遮罩模块,会和去色后的主纹理进行过渡)。大家看到这可能会对这些功能一头雾水或充满疑惑,后面用实际案例向大家演示效果。
8.边缘光(Rim) 也就是我们熟知的菲涅尔效果,这里除了常用的颜色、边缘亮度、范围、里面亮度,还加了个反向的开关。
接下来我就根据每个模块,挑一些功能来比较详细的说明下实现思路和效果展示。
一、主纹理区(Base)
- Wrap Mode:这里实现的思路就是将uv.xy小于0的值都为0、大于1的值都为1。
- UV Reverse:UV反转比较简单只要将uv.x = (1-uv.x); 即可。
- Luminance:去色有一个专门的内置函数,再用一个Lerp来做。
- Rotate:关于旋转的话,这里还要注意一下,我这里做出来的结果不是以360为一圈,主要是为了节省计算量,省去了把弧度转角度的计算。
二、扭曲模块(Distortion)
- 扭曲:对主纹理、流光、遮罩和溶解四处都有产生影响,但必须在勾选时它们才有效果。
- 一开始是用Lerp来实现扭曲的效果,但发现数值太大或太小时,会对UV重复度产生明显的变化。后面就采用了(uv + 扭曲贴图 * 强度系数)的方式实现。
三、流光模块(Streamer)
- 这个模块相对比较简单,就是将流光的纹理乘到主纹理上,再加上颜色,UV速度,强度和扭曲参数。
四、遮罩模块(Mask)
- 在遮罩模块里,也加入了和主纹理一样的几个功能,具体实现方式可以参考上面的内容。
- Mask Type:这个功能也是从实际项目中总结出来的。实现原理也很简单,只要将主纹理去色后,取一个通道和遮罩的一个通道相乘,就得到了它们交集的部分做遮罩。
五、溶解模块(Dissolve)
- 溶解的部分稍微会复杂一些。整体思路就是我们根据贴图和调节参数计算出三个区域,我们按范围从大到小先分别用a、b、c来命名,下面分别带入讲解。
- Mask Color:这里可以改变遮罩的颜色,这样在溶解时,底色就不永远是纯黑色。这个的实现方式只需要在最后把(a - b)* Mask Color的值加到最终的结果里即可。
- Clip:这个是整体的溶解范围,也就是a的值。
- Main_Clip:这个是纹理部分的溶解范围,也就是b的值,它和最终的纹理相乘就是中间显示的纹理。
- Edge:亮边宽度,也就是(b - c)的值,用(b - c)* Intensity * Dissolve Color,就可以调边的粗细、亮度和颜色了。
- Dissolve Range:这个是用来调节遮罩的软硬边,具体思路的话就是把a 除以Dissolve Range的值。当Dissolve Range等于1时,a为本身;当Dissolve Range的值越接近0,a的多大于1的面积越大。然后再用clamp把最终的值控制在0~1之间。由于分母不能为0,就把Dissolve Range控制在0.01~1之间,这样就实现了软硬边和调节。
- UV Range:我在制作效果的时候发现,溶解的纹理静止不动显得比较死板,但如果只是匀速运动也不够优美,于是我给它采样了两组的UV,分别调速度,并让它们通过Lerp来融合,并形成了生动的效果。
- Mask Range:对于溶解的纹理也是,让它和Mask Tex进行过渡融合,可以让融解变得更生动,但发现如果没有勾选Mask时,这个功能会出问题。于是我把主纹理引入,并可以在没勾选Mask时与它过渡。
- 上面就展现了Clip配合Mask Range一起使用,可以制作出更丰富的效果。
六、边缘光(Rim)
- 这个功能也比较常用,就是大家熟知的‘菲涅尔’效果,把公式搬过来,加入对应的参数就可以实现了。对于Invert的话,我的实现方式就是(1 - fresnel),做了个取反的效果,让它可以中间亮。
关于这个特效Shader的主要功能就讲解完了。然后这里面的每个模块功能都是用’shader_feature’来控制开关,在不用的情况下直接不勾选,对功能和性能方面能兼顾到。上面的分享也是一些自己尚潜的思路,具体在把它们串起来的过程当中还是遇到了不少问题,每个模块的开启或关闭对其它模块是否会产生错误的影响,都要不断测试和修改才能完成的。如果大家有更好的方法或对以上内容有不同的看法也欢迎一起探讨。
|