Unity Shader之径向模糊

转载自:https://blog.csdn.net/qq_33537945/article/details/80785335

Unity 径向模糊效果 多数用于赛车游戏吧!!!

例入极品飞车



未开启效果


开启后的效果


脚本代码

using UnityEngine;

[ExecuteInEditMode]
[AddComponentMenu(“PengLu/ImageEffect/RadialBlur”)]
public class ImageEffect_RadialBlur : MonoBehaviour {
#region Variables
public Shader RadialBlurShader = null;
private Material RadialBlurMaterial = null;

[<span class="hljs-meta">Range(0.0f, 1.0f)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">float</span> SampleDist = <span class="hljs-number">0.17</span>f;

[<span class="hljs-meta">Range(1.0f, 5.0f)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">float</span> SampleStrength = <span class="hljs-number">2.09</span>f;


<span class="hljs-meta">#<span class="hljs-meta-keyword">endregion</span></span>

void Start () {
FindShaders ();
CheckSupport ();
CreateMaterials ();
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">FindShaders</span> (<span class="hljs-params"></span>) </span>{
	<span class="hljs-keyword">if</span> (!RadialBlurShader) {
		RadialBlurShader = Shader.Find(<span class="hljs-string">"PengLu/ImageEffect/Unlit/RadialBlur"</span>);
	}
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">CreateMaterials</span>(<span class="hljs-params"></span>) </span>{
	<span class="hljs-keyword">if</span>(!RadialBlurMaterial){
		RadialBlurMaterial = <span class="hljs-keyword">new</span> Material(RadialBlurShader);
		RadialBlurMaterial.hideFlags = HideFlags.HideAndDontSave;	
	}
}

<span class="hljs-function"><span class="hljs-keyword">bool</span> <span class="hljs-title">Supported</span>(<span class="hljs-params"></span>)</span>{
	<span class="hljs-keyword">return</span> (SystemInfo.supportsImageEffects &amp;&amp; SystemInfo.supportsRenderTextures &amp;&amp; RadialBlurShader.isSupported);
}


<span class="hljs-function"><span class="hljs-keyword">bool</span> <span class="hljs-title">CheckSupport</span>(<span class="hljs-params"></span>) </span>{
	<span class="hljs-keyword">if</span>(!Supported()) {
		enabled = <span class="hljs-literal">false</span>;
		<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
	}
	<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}


<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnRenderImage</span> (<span class="hljs-params">RenderTexture sourceTexture, RenderTexture destTexture</span>)
</span>{	
	<span class="hljs-meta">#<span class="hljs-meta-keyword">if</span> UNITY_EDITOR</span>
		FindShaders ();
		CheckSupport ();
		CreateMaterials ();	
	<span class="hljs-meta">#<span class="hljs-meta-keyword">endif</span></span>

	<span class="hljs-keyword">if</span>(SampleDist != <span class="hljs-number">0</span> &amp;&amp; SampleStrength != <span class="hljs-number">0</span>){

		<span class="hljs-keyword">int</span> rtW = sourceTexture.width/<span class="hljs-number">8</span>;
        <span class="hljs-keyword">int</span> rtH = sourceTexture.height/<span class="hljs-number">8</span>;


        RadialBlurMaterial.SetFloat (<span class="hljs-string">"_SampleDist"</span>, SampleDist);
        RadialBlurMaterial.SetFloat (<span class="hljs-string">"_SampleStrength"</span>, SampleStrength);	

        RenderTexture rtTempA = RenderTexture.GetTemporary (rtW, rtH, <span class="hljs-number">0</span>,RenderTextureFormat.Default);
        rtTempA.filterMode = FilterMode.Bilinear;
        Graphics.Blit (sourceTexture, rtTempA);
        RenderTexture rtTempB = RenderTexture.GetTemporary (rtW, rtH, <span class="hljs-number">0</span>,RenderTextureFormat.Default);
        rtTempB.filterMode = FilterMode.Bilinear;
        Graphics.Blit (rtTempA, rtTempB, RadialBlurMaterial,<span class="hljs-number">0</span>);
        RadialBlurMaterial.SetTexture (<span class="hljs-string">"_BlurTex"</span>, rtTempB);
   		Graphics.Blit (sourceTexture, destTexture, RadialBlurMaterial,<span class="hljs-number">1</span>);
        RenderTexture.ReleaseTemporary(rtTempA);
        RenderTexture.ReleaseTemporary(rtTempB);
	}

	<span class="hljs-keyword">else</span>{
		Graphics.Blit(sourceTexture, destTexture);
	}
}
 <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">OnDisable</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">if</span> (RadialBlurMaterial)
        DestroyImmediate (RadialBlurMaterial);
}

}

Shader部分

Shader “PengLu/ImageEffect/Unlit/RadialBlur” {
Properties {
_MainTex (“Base (RGB)”, 2D) = “white” {}
}
CGINCLUDE

	<span class="hljs-meta">#include "UnityCG.cginc"</span>

	<span class="hljs-keyword">struct</span> appdata_t {
		float4 vertex : POSITION;
		half2 texcoord : TEXCOORD0;
	};

	<span class="hljs-keyword">struct</span> v2f {
		float4 vertex : SV_POSITION;
		half2 texcoord : TEXCOORD0;
	};

	sampler2D _MainTex;
	sampler2D _BlurTex;
	uniform <span class="hljs-keyword">float</span> _SampleDist;
	uniform <span class="hljs-keyword">float</span> _SampleStrength;
	
	<span class="hljs-function">v2f <span class="hljs-title">vert</span> (<span class="hljs-params">appdata_t v</span>)
	</span>{
		v2f o;
		o.vertex = UnityObjectToClipPos(v.vertex);
		o.texcoord = v.texcoord;
		<span class="hljs-keyword">return</span> o;
	}
	
	<span class="hljs-function">fixed4 <span class="hljs-title">fragRadialBlur</span> (<span class="hljs-params">v2f i</span>) : COLOR
	</span>{
		fixed2 dir = <span class="hljs-number">0.5</span>-i.texcoord;
		<span class="hljs-keyword">fixed</span> dist = length(dir);
		dir /= dist;
		dir *= _SampleDist;

		fixed4 sum = tex2D(_MainTex, i.texcoord - dir*<span class="hljs-number">0.01</span>);
		sum += tex2D(_MainTex, i.texcoord - dir*<span class="hljs-number">0.02</span>);
		sum += tex2D(_MainTex, i.texcoord - dir*<span class="hljs-number">0.03</span>);
		sum += tex2D(_MainTex, i.texcoord - dir*<span class="hljs-number">0.05</span>);
		sum += tex2D(_MainTex, i.texcoord - dir*<span class="hljs-number">0.08</span>);
		sum += tex2D(_MainTex, i.texcoord + dir*<span class="hljs-number">0.01</span>);
		sum += tex2D(_MainTex, i.texcoord + dir*<span class="hljs-number">0.02</span>);
		sum += tex2D(_MainTex, i.texcoord + dir*<span class="hljs-number">0.03</span>);
		sum += tex2D(_MainTex, i.texcoord + dir*<span class="hljs-number">0.05</span>);
		sum += tex2D(_MainTex, i.texcoord + dir*<span class="hljs-number">0.08</span>);
		sum *= <span class="hljs-number">0.1</span>;
		
		<span class="hljs-keyword">return</span> sum;
	}

	<span class="hljs-function">fixed4 <span class="hljs-title">fragCombine</span> (<span class="hljs-params">v2f i</span>) : COLOR
	</span>{
		<span class="hljs-keyword">fixed</span> dist = length(<span class="hljs-number">0.5</span>-i.texcoord);
		fixed4  col = tex2D(_MainTex, i.texcoord);
		fixed4  blur = tex2D(_BlurTex, i.texcoord);
		col=lerp(col, blur,saturate(_SampleStrength*dist));
		<span class="hljs-keyword">return</span> col;
	}
ENDCG

SubShader {
  ZTest Always  ZWrite Off Cull Off Blend Off

  Fog { Mode off } 
<span class="hljs-comment">//0  </span>
Pass { 
	CGPROGRAM
	
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> vertex vert</span>
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> fragment fragRadialBlur</span>
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> fragmentoption ARB_precision_hint_fastest </span>
	
	ENDCG	 
	}	
<span class="hljs-comment">//1	</span>
Pass { 
	CGPROGRAM
	
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> vertex vert</span>
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> fragment fragCombine</span>
	<span class="hljs-meta">#<span class="hljs-meta-keyword">pragma</span> fragmentoption ARB_precision_hint_fastest </span>
	
	ENDCG	 
	}				

}	

}

脚本需要挂载在摄像机上面




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值