首页 > 技术文章 > UnityShader开发之径向模糊(实现镜头中间不模糊,四周模糊的效果)

qq2351194611 2021-11-26 16:44 原文

1.因为项目中需要中间清晰四周模糊的效果

对场景模型有效果对UI没有效果

实现效果

效果图(这是拖出来的3D图片)没模糊前

 

 

 效果图 模糊后(中间清晰,四周模糊,中间大小可调节)

 

 

首先是shader脚本

Shader "Custom/GaoShiMoHu"
{
    Properties{
        _MainTex("纹理",2D) = "while"{}
        _Level("强度",Range(1,100)) = 10
        _CenterX("中心X坐标",Range(0,1)) = 0.5
        _CenterY("中心Y坐标",Range(0,1)) = 0.5
        _BufferRadius("缓冲半径",Range(0,1)) = 0
    }
        SubShader{
            Tags { "RenderType" = "Opaque" }

            Pass{
                CGPROGRAM
                #pragma vertex vert  
                #pragma fragment frag  

                #include "UnityCG.cginc"  

                sampler2D _MainTex;
                float _Level;
                float _CenterX;
                float _CenterY;
                float _BufferRadius;

                struct v2f {
                    fixed4 vertex : POSITION;
                    fixed2 uv : TEXCOORD;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = v.texcoord;
                    return o;
                }

                fixed4 frag(v2f i) :COLOR
                {

                    fixed4 finalColor;
                    fixed2 center = fixed2(_CenterX,_CenterY);
                    fixed2 uv = i.uv - center;
                    fixed3 tempColor = fixed3(0,0,0);
                    fixed blurParams = distance(i.uv,center);

                    for (fixed j = 0;j < _Level;j++) {
                        tempColor += tex2D(_MainTex,uv*(1 - 0.01*j*saturate(blurParams / _BufferRadius)) + center).rgb;
                    }

                    finalColor.rgb = tempColor / _Level;
                    finalColor.a = 1;
                    return finalColor;
                }

                ENDCG
                }
        }
            FallBack "Diffuse"
                
}

第二步 是C#脚本

挂在Camera上面 

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

//什么模式都可以运行  ExecuteInEditMode
[ExecuteInEditMode]
public class ImageEffect_GaussianBlur : MonoBehaviour
{
    public Shader RadiaBlurShader;
    [HideInInspector]
    public Material RadiaBlurMaterial;

    [Range(1, 100)]
    public float Level = 10;

    [Range(0, 10)]
    public float BufferRadius = 0.5f;

    [Range(0, 1)]
    public float CenterX = 0.5f;

    [Range(0, 1)]
    public float CenterY = 0.5f;

    private void Awake()
    {
        RadiaBlurMaterial = new Material(RadiaBlurShader);
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (RadiaBlurMaterial != null)
        {
            RadiaBlurMaterial.SetFloat("_Level", Level);
            RadiaBlurMaterial.SetFloat("_CenterX", CenterX);
            RadiaBlurMaterial.SetFloat("_CenterY", CenterY);
            RadiaBlurMaterial.SetFloat("_BufferRadius", BufferRadius);

            Graphics.Blit(src, dest, RadiaBlurMaterial);
        }
        else
        {
            Graphics.Blit(src, dest);
        }
    }
}

最后shader拖上去即可

 

推荐阅读