Unity Shader - 径向模糊

Saadiya ·
更新时间:2024-09-21
· 632 次阅读

前言

Hello!大家好,这里先说一个题外话哈,话说有没有公司现在招U3D游戏开发的呢?哈哈,最近我也开始重新找工作了,有没有小伙伴推荐一下呀?坐标 深圳 ,感谢!( 我的微信:Li1076984375)

径向模糊

言归正传,前面我们实现了边缘检测,模糊处理等后期效果,今天我们就来实现一下径向模糊!

径向模糊是一种从中心向外呈幅射状的逐渐模糊的效果。

如果经常玩游戏的小伙伴都知道径向模糊其实在游戏中很常用,特别武侠类游戏中,常用来体现速度感,例如角色在施展轻功的时候,视觉效果非常好。

我们来看下最终效果:
在这里插入图片描述

实现原理:

原理其实很简单,就是 在当前像素点 沿着 径向模糊方向( 中心 到 边缘)取几个点作为采样点,最后取这几个采样点平均值就是最终输出值了。

获取方向向量非常简单,A到B的向量 = B点 - A点。 即:中心像素 - 当前像素,即可得到方向向量。

具体Shader代码如下:

// ---------------------------【径向模糊】--------------------------- Shader "lcl/screenEffect/RadialBlur" { // ---------------------------【属性】--------------------------- Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } // ---------------------------【子着色器】--------------------------- SubShader { Pass { ZTest Always Cull Off ZWrite Off Fog{ Mode off } //调用CG函数 CGPROGRAM //使效率更高的编译宏 #pragma fragmentoption ARB_precision_hint_fastest //vert_img 是在UnityCG.cginc中内置的 #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform float _BlurFactor; //模糊强度 uniform float2 _BlurCenter; //模糊中心点 // ---------------------------【片元着色器】--------------------------- fixed4 frag(v2f_img i) : SV_Target { //模糊方向: 中心像素 - 当前像素 float2 dir = _BlurCenter.xy - i.uv ; float4 resColor = 0; //迭代 for (int j = 0; j < 5; ++j) { //计算采样uv值:正常uv值+从中间向边缘逐渐增加的采样距离 float2 uv = i.uv + _BlurFactor * dir * j; resColor += tex2D(_MainTex, uv); } //取平均值(乘法比除法性能好) resColor *= 0.2; return resColor; } ENDCG } } Fallback off }

C#:

PostEffectsBase 基类可以在这里获取,就不再赘述了

using UnityEngine; public class RadialBlur : PostEffectsBase { public Shader gaussianBlurShader; private Material mat = null; public Material material { get { mat = CheckShaderAndCreateMaterial (gaussianBlurShader, mat); return mat; } } //模糊程度 [Range (0, 0.05f)] public float blurFactor = 0.0f; //模糊中心(0-1)屏幕空间,默认为中心点 public Vector2 blurCenter = new Vector2 (0.5f, 0.5f); void Start () { // 找到处理径向模糊的shader gaussianBlurShader = Shader.Find ("lcl/screenEffect/RadialBlur"); } // 后期处理 void OnRenderImage (RenderTexture source, RenderTexture destination) { if (material) { material.SetFloat ("_BlurFactor", blurFactor); material.SetVector ("_BlurCenter", blurCenter); Graphics.Blit (source, destination, material); } else { Graphics.Blit (source, destination); } } } 最后

欢迎来我GitHub点个Star,谢谢!
里面有我平时学习unity shader过程中实现的一些特效demo。


作者:长生但酒狂



shader unity

需要 登录 后方可回复, 如果你还没有账号请 注册新账号