unity3d 经像模糊特效 适用于高速运动物体的运动模糊


shader文件如下


Shader "PengLu/ImageEffect/Unlit/RadialBlur" {
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;
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值