shader文件如下
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
sampler2D _BlurTex;
uniform float _SampleDist;
uniform float _SampleStrength;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
return o;
}
fixed4 fragRadialBlur (v2f i) : COLOR
{
fixed2 dir = 0.5-i.texcoord;
fixed dist = length(dir);
dir /= dist;
dir *= _SampleDist;
fixed4 sum = tex2D(_MainTex, i.texcoord - dir*0.01);
sum += tex2D(_MainTex, i.texcoord - dir*0.02);
sum += tex2D(_MainTex, i.texcoord - dir*0.03);
sum += tex2D(_MainTex, i.texcoord - dir*0.05);
sum += tex2D(_MainTex, i.texcoord - dir*0.08);
sum += tex2D(_MainTex, i.texcoord + dir*0.01);
sum += tex2D(_MainTex, i.texcoord + dir*0.02);
sum += tex2D(_MainTex, i.texcoord + dir*0.03);
sum += tex2D(_MainTex, i.texcoord + dir*0.05);
sum += tex2D(_MainTex, i.texcoord + dir*0.08);
sum *= 0.1;
return sum;
}
fixed4 fragCombine (v2f i) : COLOR
{
// fixed2 dir = 0.5-i.texcoord;
fixed dist = length(0.5-i.texcoord);
fixed4 col = tex2D(_MainTex, i.texcoord);
fixed4 blur = tex2D(_BlurTex, i.texcoord);
col=lerp(col, blur,saturate(_SampleStrength*dist));
return col;
}
ENDCG
SubShader {
ZTest Always ZWrite Off Cull Off Blend Off
Fog { Mode off }
//0
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment fragRadialBlur
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
//1
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment fragCombine
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
}
C#文件的代码如下
using UnityEngine;
using System.Collections;
using System;
[ExecuteInEditMode]
[AddComponentMenu ("PengLu/ImageEffect/RadialBlur")]
public class ImageEffect_RadialBlur : MonoBehaviour {
#region Variables
public Shader RadialBlurShader = null;
private Material RadialBlurMaterial = null;
// private RenderTextureFormat rtFormat = RenderTextureFormat.Default;
[Range(0.0f, 1.0f)]
public float SampleDist = 0.17f;
[Range(0.0f, 5.0f)]
public float SampleStrength = 2.09f;
private float targetStrength = 0f;
#endregion
void Start () {
FindShaders ();
CheckSupport ();
CreateMaterials ();
targetStrength = SampleStrength;
}
void FindShaders () {
if (!RadialBlurShader) {
RadialBlurShader = Shader.Find("PengLu/ImageEffect/Unlit/RadialBlur");
}
}
void CreateMaterials() {
if(!RadialBlurMaterial){
RadialBlurMaterial = new Material(RadialBlurShader);
RadialBlurMaterial.hideFlags = HideFlags.HideAndDontSave;
}
}
bool Supported(){
return (SystemInfo.supportsImageEffects && SystemInfo.supportsRenderTextures && RadialBlurShader.isSupported);
// return true;
}
bool CheckSupport() {
if(!Supported()) {
enabled = false;
return false;
}
// rtFormat = SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.RGB565) ? RenderTextureFormat.RGB565 : RenderTextureFormat.Default;
return true;
}
public void FadeIn(float target)
{
targetStrength = target;
}
public void FadeOut()
{
targetStrength = 0;
}
void Update()
{
SampleStrength = Mathf.Lerp(SampleStrength, targetStrength, Time.deltaTime * 5);
}
void OnRenderImage (RenderTexture sourceTexture, RenderTexture destTexture)
{
//#if UNITY_EDITOR
// FindShaders ();
// CheckSupport ();
// CreateMaterials ();
//#endif
if(SampleDist != 0 && SampleStrength != 0){
int rtW = sourceTexture.width/4;
int rtH = sourceTexture.height/4;
RadialBlurMaterial.SetFloat ("_SampleDist", SampleDist);
RadialBlurMaterial.SetFloat ("_SampleStrength", SampleStrength);
RenderTexture rtTempA = RenderTexture.GetTemporary (rtW, rtH, 0,RenderTextureFormat.Default);
rtTempA.filterMode = FilterMode.Bilinear;
Graphics.Blit (sourceTexture, rtTempA);
RenderTexture rtTempB = RenderTexture.GetTemporary (rtW, rtH, 0,RenderTextureFormat.Default);
rtTempB.filterMode = FilterMode.Bilinear;
// RadialBlurMaterial.SetTexture ("_MainTex", rtTempA);
Graphics.Blit (rtTempA, rtTempB, RadialBlurMaterial,0);
RadialBlurMaterial.SetTexture ("_BlurTex", rtTempB);
Graphics.Blit (sourceTexture, destTexture, RadialBlurMaterial,1);
RenderTexture.ReleaseTemporary(rtTempA);
RenderTexture.ReleaseTemporary(rtTempB);
}
else{
Graphics.Blit(sourceTexture, destTexture);
}
}
public void OnDisable () {
//if (RadialBlurMaterial)
//DestroyImmediate (RadialBlurMaterial);
// RadialBlurMaterial = null;
}
}