12.6 運動模糊

轉載自  馮樂樂 代碼入門精要

 

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyMotionBlur : PostEffectsBase
{
    public Shader myMotionBlurShader;
    private Material material = null;

    public Material MyMotionBlurMaterial
    {
        get
        {
            material = CheckShaderAndCreateMaterial(myMotionBlurShader, material);
            return material;
        }
    }

    [Range(0.0f, 0.9f)]
    public float blurAmount = 0.5f;

    private RenderTexture accumulationTexture;

    private void OnDisable()
    {
        DestroyImmediate(accumulationTexture);
    }

    private void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (MyMotionBlurMaterial != null)
        {
            if (accumulationTexture == null || accumulationTexture.width != src.width ||
                accumulationTexture.height != src.height)
            {
                DestroyImmediate(accumulationTexture);
                accumulationTexture = new RenderTexture(src.width, src.height, 0);
                accumulationTexture.hideFlags = HideFlags.HideAndDontSave;
                Graphics.Blit(src, accumulationTexture);
            }
            
            accumulationTexture.MarkRestoreExpected();
            
            MyMotionBlurMaterial.SetFloat("_BlurAmount",1.0f - blurAmount);
            
            Graphics.Blit(src,accumulationTexture,MyMotionBlurMaterial);
            Graphics.Blit(accumulationTexture,dest);
        }
        else
        {
            Graphics.Blit(src,dest);
        }
    }
}

 

 

Shader "Unlit/myMotionBlurShader"
{
	Properties
	{
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_BlurAmount("Blur Amount",Float) = 1.0
	}
	SubShader{
		CGINCLUDE

		#include "UnityCG.cginc"

		sampler2D _MainTex;
		fixed _BlurAmount;

		struct v2f{
			float4 pos : SV_POSITION;
			half2 uv : TEXCOORD0;
		};

		v2f vert(appdata_img v){
			v2f o;

			o.pos = UnityObjectToClipPos(v.vertex);

			o.uv = v.texcoord;

			return o;
		}

		fixed4 fragRGB(v2f i) : SV_Target{
			return fixed4(tex2D(_MainTex,i.uv).rgb,_BlurAmount);
		}

		half4 fragA(v2f i) : SV_Target{
			return tex2D(_MainTex,i.uv);
		}

		ENDCG

		ZTest Always Cull Off ZWrite Off

		Pass{
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMask RGB

			CGPROGRAM

			#pragma vertex vert
			#pragma fragment fragRGB

			ENDCG
		}
		
		Pass{
			Blend One Zero
			ColorMask  A

			CGPROGRAM

			#pragma vertex vert
			#pragma fragment fragA

			ENDCG

		}

	}
   Fallback Off
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章