UnityShader開發之徑向模糊(實現鏡頭中間不模糊,四周模糊的效果)


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拖上去即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM