关于学习老师的有点科幻的特效小人shader的学习
其主要是通过三角波函数作为动态的纹理进行透明和不透明的过度变换,然后通过在该基础上叠加噪声纹理,从而使其过度的更加多样化。最后通过smoothstep函数来改变其x的范围来达到不同的突变过渡程度。在该遮罩的基础上,将顶点加上法线的方向从而产生向外膨胀的效果。
float4 EffectAnim(float noise, float mask, float3 normal, inout float3 vertex){float baseMask = abs(frac(vertex.y * _EffectParams.x - _Time.x * _EffectParams.y) - 0.5) * 2.0;//计算基础纹理baseMask = min(1.0, baseMask * 2.0);baseMask += (noise - 0.5) * _EffectParams.z; //将噪声纹理叠加到前面所创建的程序纹理中//特效遮罩的各级别扭曲程度float4 effectMask = float4(0.0,0.0,0.0,0.0);effectMask.x = smoothstep(0.0,0.9, baseMask); //把突变约束在0-0.9之间effectMask.y = smoothstep(0.2, 0.7, baseMask);effectMask.z = smoothstep(0.4, 0.5, baseMask); //把突变约束在0.4-0.5之间//顶点色存入遮罩中effectMask.w = mask;vertex.xz += normal.xz * (1 - effectMask.y) * _EffectParams.w * mask;return effectMask;}
该函数作用在顶点shader之中,并且在使用之前要先对噪声纹理进行采样从而得到噪声的信息。
在像素shader中,先是要把特效的纹理用uv1来进行采样,因为要实现整个小人是从下往上进行特效过渡,如果是用原本的把小人分为头、身的uv0坐标则会产生头和身子同时出现光带,不太符合所想要的效果,所以另外开一个uv空间来存储整个小人的信息。
设置参数来接收输出结构中使用完上面的函数的不同遮罩突变的信息。使用该透明遮罩的时候,需要对该对应的透明度进行归一化处理。
发光则是通过得到中间变换的区域乘上希望发光的网格线部分来得到,并且乘上自己可以起到pow函数的功能
//特效部分float3 var_EffectTex = tex2D(_EffectTex, i.uv1).xyz;float meshMask = var_EffectTex.x;float randomDisappearMask = var_EffectTex.y;float slopMask = var_EffectTex.z;float smallMask = i.EffectMask.x;float middleMask = i.EffectMask.y;float bigMask = i.EffectMask.z;float baseMask = i.EffectMask.w;float bigOpacity = saturate(floor( randomDisappearMask + middleMask));float middleOpacity = saturate(floor( slopMask + bigMask));float opacity = lerp(1.0, min(bigOpacity, middleOpacity), baseMask);float meshEmission = (bigMask - smallMask)* meshMask ;meshEmission = meshEmission * meshEmission ;emission += _EffectCol * meshEmission * baseMask;
不同x范围的遮罩:
bigMask:
middleMask:
smallMask:
可以看到效果越来越柔和。