1.
分析:
让一个图片扭曲起来需要对他的uv做改变,正在扭曲的是uv
思路:
1,让一张贴图A 做一个uv动画 或者多张贴图,做不同方向的uv动画
2.主贴图采样的时候,uv加上A的某个通道值,因为A在移动的时候,他的值会由0到1不停的变化 然后就可以扭曲起来了
0到1的数值太大了,所以可以乘上一个系数,让它的幅度变小。这种情况有个缺点,0到1会让它的uv扭曲的同时会往一边
偏移,所以最好是先把它变成-0.5到0.5 或者-1到1,这样就可以让uv不再偏移,上下左右均衡的晃动
核心代码:
float4 frag(VertexOutput i, float facing : VFACE) : COLOR { float4 time = _Time + _TimeEditor; float2 uvA = (i.uv0+(time.r*float2(_noise_A_U,_noise_A_V))*float2(1,1));//第一张图uv动画 float4 A = tex2D(_noise_A,TRANSFORM_TEX(uvA, _noise_A)); float2 uvB = (i.uv0+(time.r*float2(_noise_B_U,_noise_B_V))*float2(1,1));//第二张图uv动画 float4 B = tex2D(_noise_B,TRANSFORM_TEX(uvB, _noise_B)); float2 MainTexUV = ((i.uv0+((A.r+B.r-1)*_raodong_V))+(time.r*float2(_mianTex_U,_mianTex_V))*float2(1,1));//主贴图的扭曲uv + uv动画 float2 AlphaUV = i.uv0+((A.r+B.r-1)*_raodong_V);//另外加上一扭曲贴图的通道 float4 main_tex = tex2D(_main_tex,TRANSFORM_TEX(MainTexUV, _main_tex));//主贴图扭曲 float4 alpha_tex = tex2D(_tex_alpha,TRANSFORM_TEX(AlphaUV, _tex_alpha));//通道图的扭曲 float3 finalColor = (_main_V*((_Color.rgb*main_tex.rgb)*((alpha_tex.rgb*_alpha_color.rgb)*_alpha_v))); fixed4 finalRGBA = fixed4(finalColor,1); UNITY_APPLY_FOG(i.fogCoord, finalRGBA); return finalRGBA; }
总结:
这里的计算都是放在了片段着色器里,而且好多都是用的float 从效率上面是可以重新优化的,优化的时候还是要把计算放在顶点里,然后多张贴图都只用了一个通道比较浪费,需要把它合并在一张贴图里。