Shader 代码
Shader "Unlit/Test"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MainColor("Color",COLOR)=(1,1,1,1)
}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _distanceFactor;
uniform float _timeFactor;
uniform float _totaFactor;
uniform float _waveWidth;
uniform float _curwaveDistance;
float4 _MainColor;
fixed4 frag(v2f_img i):SV_Target
{
float2 dv=float2(0.5,0.5)-i.uv;
dv=dv*float2(_ScreenParams.x/_ScreenParams.y,1);
float dis=sqrt(dv.x*dv.x+dv.y*dv.y);
float sinFactor=sin(dis*_distanceFactor+_Time.y*_timeFactor)*_totaFactor*0.01;
float discardFactor=clamp(_waveWidth-abs(_curwaveDistance-dis),0,1);
float2 dv1=normalize(dv);
float2 off =dv1*sinFactor*discardFactor;
float2 uv=off+i.uv;
return tex2D(_MainTex,uv)*_MainColor.xyzw;
}
ENDCG
SubShader
{
Pass
{
ZTest Always
Cull Off
ZWrite Off
Fog{Mode off}
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
FallBack off
}
C# 代码1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour {
public Shader shader = null;
Material _material = null;
public Material _Material
{
get
{
if (_material == null)
{
_material = GetMaterial(shader);
}
return _material;
}
}
Material GetMaterial(Shader shader)
{
if (shader == null)
return null;
if (shader.isSupported == false)
return null;
Material material = new Material(shader);
material.hideFlags = HideFlags.DontSave;
if (material)
return material;
return null;
}
}
C# 代码2
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShuiDi : PostEffectBase {
public float distanceFactor = 60f;
public float timeFactor = -30f;
public float totaFactor = 1.0f;
public float waveWidth = 0.3f;
public float waveSpeed = 0.3f;
float waveStartTime;
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
float curwaveDistance = (Time.time - waveStartTime) * waveSpeed;
if (curwaveDistance >= 1.5)
{
waveStartTime = Time.time;
}
_Material.SetFloat("_distanceFactor", distanceFactor);
_Material.SetFloat("_timeFactor", timeFactor);
_Material.SetFloat("_totaFactor", totaFactor);
_Material.SetFloat("_waveWidth", waveWidth);
_Material.SetFloat("_curwaveDistance", curwaveDistance);
Graphics.Blit(source, destination, _Material);
}
}