shader之——扭曲

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shader之——扭曲相关的知识,希望对你有一定的参考价值。

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之——扭曲的主要内容,如果未能解决你的问题,请参考以下文章

shader编程-三维场景下SDF建模,对模型进行扭曲弯曲裁剪掏空操作(WebGL-Shader开发基础12)

shader编程-三维场景下SDF建模,对模型进行扭曲弯曲裁剪掏空操作(WebGL-Shader开发基础12)

shader编程-三维场景下SDF建模,对模型进行扭曲弯曲裁剪掏空操作(WebGL-Shader开发基础12)

shader编程-三维场景下SDF建模,对模型进行扭曲弯曲裁剪掏空操作(WebGL-Shader开发基础12)

流光shader 和 流光+扭曲shader

Cg入门14:Vertex Shader - 几何变换 —顶点扭曲