实现效果展示:
效果说明:
基本效果很简单,MainTexture + Normal贴图,另外做了一个雪覆盖的效果叠加上去(直转链接),本篇主要针对顶点动画部分做说明。
前提原理:
y = a * Sin (b*x+c);
“y” 值是输出的结果;
“a” 控制整体的振幅强度;
“b” 控制函数的周期(说人话就是波峰波谷距离);
“c” 控制函数位移,左加右减。当周期大的时候,用来微调 波 的状态,周期小就显示不重要了,可以省略。
实现思路:
模型空间的 “VertexPos” 分散成 x y z三个值,分别对应三个轴向;
保留(这里后续会详细说明注意事项)x z 轴的顶点数据,只在 y 轴产生动画;
y 轴动画就是在原来顶点位置的基础上 “Add” 一个计算好的 “Sin()” 值;
开始实践:
代码就比较基础了,不做详细介绍,直接看着节点图就可以逆转出来(反过来同理)。
参数详细说明:
(1)VertexPosition:就是代码中 “float4 vertex : POSITION; float4 pos : SV_POSITION;” 这里需要在模型空间进行操作。
(2)整体流程(从左向右):
常规计算一个 “Sin( )” 的值,中间需要将 “VertexPosition” 的 “Y” 轴坐标作为基础算子,然后使用常数+Time的方式制作循环动画;
计算出来的 “Sin()” 值,做一个整体的振幅调整;
最后加上原本的 “Y” 值;此时整个 “Y” 轴的位移已经计算完毕;
最后用 “Append” 节点混合没有参与计算的 “X” 和 “Z”。
输出的时候可以使用一张黑白贴图(实际就是0-1阈值)控制哪个地方产生顶点动画,哪些不产生。
注意点:
(1)图上的 " Float 0" 节点不是一个 “ProPertiy” 属性节点,在这里只用作Y轴的坐标修正处理。
原因就是当所有参数为零时,用上述这个方法出来的结果会使得整体的Y方向向下偏移很多,此时 “Add” 上一个修正值,使得没有效果的时候结果“看起来是正确的”。
(2)“Append” 节点:X、Z两个轴的默认值为0,这就足够了。
如果不适用此节点可以尝试使用两个 “Float” 凑成一个三维向量再输出。着重需要注意的是,如果此时不对 X、Z 两轴做限制,默认输出的向量其实是 “Float3 (Sin(…) , Sin(…) , Sin(…))” 而不是 “Float3 (0, Sin(…), 0)”。
写在最后:
本文其实是简单的一个皮毛做法,旨在用最简单的原来实现效果,关于顶点动画其实有许许多多的优秀算法,除去 “Sin()” 等这一类三角函数,可以使用矩阵创建更多的效果,以后有机会再和大家分享。
建议大家代码和 “连连看” 都做一下。
目前节点式构建Shader的方式有三种,大家酌情使用:Shader Graph、ASE、Shader Forge(GitHub上有最新的1.40版本)。
如果大家有更好玩儿的算法和主意,欢迎留言,本文如有任何错误之处,敬请指点。