码迷,mamicode.com
首页 > 其他好文 > 详细

shader之——扭曲

时间:2017-12-16 17:14:03      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:gpo   orm   unit   color   fixed   同方   alc   tran   turn   

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  从效率上面是可以重新优化的,优化的时候还是要把计算放在顶点里,然后多张贴图都只用了一个通道比较浪费,需要把它合并在一张贴图里。

shader之——扭曲

标签:gpo   orm   unit   color   fixed   同方   alc   tran   turn   

原文地址:http://www.cnblogs.com/baicaishisan/p/8046828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!