使用unityshader实现图片扭曲效果
实现原理------------------------------------------------------
最近项目中需要使用屏幕扭曲效果,实现原理很简单,
把场景渲染到RT纹理上,再对RT纹理进行扭曲变换,输出到屏幕
扭曲前
扭曲后
Shader源码------------------------------------------------------------------
Shader "zclShader/whirShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Radius ("_Radius",Float) =1
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
float _Radius; //扭曲的弧度
float2 whirl(float2 uv) {
//坐标系从左下角变换到中心
uv += float2(-0.5, -0.5);
//弧度值 X UV点到中心的距离 X 时间变化
float tempRad=_Radius*_Time.y*length(uv);
//旋转矩阵
float2x2 TransMatrix = {
cos(tempRad),sin(tempRad),-sin(tempRad),cos(tempRad)
};
//对UV进行旋转变换
float2 uv2 = mul(TransMatrix, uv);
//映射回原来的坐标空间
uv2 += float2(0.5, 0.5);
return uv2;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, whirl(i.uv));
return col;
}
ENDCG
}
}
}
免责声明:图片素材来源于Unity资源商店免费资源包,仅供学习使用
参考资料:https://edu.manew.com/my/course/443/material?type=material
参考书籍:冯乐乐《unityshader入门精要》
参考书籍:郭浩瑜,张鹤《unity3D shaderLab开发实战详解》