代码来源于 冯乐乐 shader入门精要

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyGaussianBlur : PostEffectsBase {public Shader gaussianBlurShader;private Material gaussianBlurMat;public Material material{get{gaussianBlurMat = CheckShaderAndCreateMaterial(gaussianBlurShader,gaussianBlurMat);return gaussianBlurMat;}}[Range(0,4)]public int iterations = 3;[Range(0.2f,3f)]public float blurSpread = 0.6f;[Range(1,8)]public int downSample = 2;/// <summary>/// OnRenderImage is called after all rendering is complete to render image./// </summary>/// <param name="src">The source RenderTexture.</param>/// <param name="dest">The destination RenderTexture.</param>void OnRenderImage(RenderTexture src, RenderTexture dest){if(material != null){int rtW = src.width/downSample ;int rtH = src.height/downSample;RenderTexture buffer0 = RenderTexture.GetTemporary(rtW,rtH,0);buffer0.filterMode = FilterMode.Bilinear;Graphics.Blit(src,buffer0);for(int i = 0;i < iterations;i++){material.SetFloat("_BlurSize",1.0f + i * blurSpread);RenderTexture buffer1 = RenderTexture.GetTemporary(rtW,rtH,0);Graphics.Blit(buffer0,buffer1,material,0);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;buffer1 = RenderTexture.GetTemporary(rtW,rtH,1);Graphics.Blit(buffer0,buffer1,material,1);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;}Graphics.Blit(buffer0,dest);RenderTexture.ReleaseTemporary(buffer0);}else{Graphics.Blit(src,dest);}}}
Shader "MyGaussianBlur"{Properties{_MainTex ("Main Tex(RGB)", 2D) = "white" {}_BlurSize ("Blur Size", Float) = 1.0}SubShader{CGINCLUDE#include "UnityCG.cginc"sampler2D _MainTex;half4 _MainTex_TexelSize;float _BlurSize;struct v2f{float4 pos: SV_POSITION;half2 uv[5]: TEXCOORD0;};v2f vertBlurVertical(appdata_img v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2(0,_MainTex_TexelSize.y*1.0) * _BlurSize;o.uv[2] = uv - float2(0,_MainTex_TexelSize.y*1.0) * _BlurSize;o.uv[3] = uv + float2(0,_MainTex_TexelSize.y*2.0) * _BlurSize;o.uv[4] = uv - float2(0,_MainTex_TexelSize.y*2.0) * _BlurSize;return o;}v2f vertBlurHorizontal(appdata_img v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;return o;}fixed4 fragBlur(v2f i):SV_TARGET{float weight[3] = {0.4026,0.2442,0.0545};fixed3 sum = tex2D(_MainTex,i.uv[0]).rgb*weight[0];for(int j = 1; j < 3;j++){sum += tex2D(_MainTex,i.uv[j*2-1]).rgb * weight[j];sum += tex2D(_MainTex,i.uv[j*2]).rgb * weight[j];}return fixed4(sum,1.0); }ENDCGZTest Always Cull Off ZWrite OffPass{NAME "GAUSSIAN_BLUR_VERTTICAL"CGPROGRAM#pragma vertex vertBlurVertical#pragma fragment fragBlurENDCG}Pass{NAME "GAUSSIAN_BLUR_HORIZONTAL"CGPROGRAM#pragma vertex vertBlurHorizontal#pragma fragment fragBlurENDCG}}Fallback "Diffuse"
}















