转载自:https://blog.youkuaiyun.com/qq_33537945/article/details/80785335
Unity 径向模糊效果 多数用于赛车游戏吧!!!
例入极品飞车
未开启效果
开启后的效果
脚本代码
using UnityEngine;
[
[ ]
public class ImageEffect_RadialBlur : MonoBehaviour {
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 && SystemInfo.supportsRenderTextures && 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> && 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
}
}
}
脚本需要挂载在摄像机上面