一:效果演示
二:实现
Shader:漩涡着色器
//漩涡着色器
Shader "Custom/Swirl"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Angle ("Rotation", Float) = 0
}
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 _Angle;
fixed4 frag (v2f i) : SV_Target
{
float2 uv = float2(i.uv.x-0.5,i.uv.y-0.5);
float f = distance(uv,float2(0,0));
float s = sin(lerp(0,_Angle,f));
float c = cos(lerp(0,_Angle,f));
// -c s
// s c
uv = float2(-uv.x*c+uv.y*s,uv.x*s+uv.y*c);
uv = float2(uv.x+0.5,uv.y+0.5);
fixed4 col = tex2D(_MainTex, uv);
return col;
}
ENDCG
}
}
}
CS:后处理的基类
using UnityEngine;
/// <summary>
/// 后处理的基类
/// </summary>
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour
{
[Header("后处理着色器")]
public Shader shader = null;
private Material _material = null;
public Material material
{
get
{
if (_material == null)
{
_material = GenerateMaterial(shader);
}
return _material;
}
}
protected Material GenerateMaterial(Shader shader)
{
if (shader == null || shader.isSupported == false)
{
return null;
}
Material material = new Material(shader);
material.hideFlags = HideFlags.DontSave;
if (material)
{
return material;
}
return null;
}
}
CS:漩涡效果(挂载到渲染的相机上)
using UnityEngine;
/// <summary>
/// 漩涡效果
/// </summary>
[RequireComponent(typeof(Camera))]
public class Swirl : PostEffectBase
{
[Header("漩涡值")]
[Space(25)]
public float swirlValue;
private void OnRenderImage(RenderTexture source, RenderTexture dest)
{
if (material)
{
material.SetFloat("_Angle", swirlValue);
Graphics.Blit(source, dest, material);
}
else
{
Graphics.Blit(source, dest);
}
}
}