UnityShader基础案例(四)——模糊效果

一、全屏的模糊。        

        1、高斯模糊 

                这个很常见,在后处理一章中有实现,这里不再赘述。还有基于整体的局部模糊,就是屏幕上某一块地方不受模糊处理。                                            

        2、径向模糊,含模糊半径

                沿纹理采样坐标和模糊中心点的方向采样,每隔几个采样点采一次样,最后取个平均值

                脚本:                

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

[ExecuteInEditMode]
public class RenderImage : MonoBehaviour
{
    public Shader shader;
    [Header("径向模糊迭代次数")] [Range(1, 10)]public int _BlurIteration = 1;
    [Header("径向模糊强度")] [Range(0, 1)] public float _BlurStrength = 0.2f;

    [Header("径向模糊半径")] [Range(0,0.2f)]public float _BlurArea = 0.1f;

    private Material _material;

    // Start is called before the first frame update
    void Awake()
    {
        if (shader == null)
        {
            Debug.Log("Shader为空");
        }

        _material = new Material(shader);
    }

    private void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (_material != null)
        {
            _material.SetFloat("_BlurIteration", _BlurIteration);
            _material.SetFloat("_BlurStrength", _BlurStrength);
            _material.SetFloat("_BlurArea", _BlurArea);
            Graphics.Blit(src, dest, _material);
        }
        else
        {
            Graphics.Blit(src, dest, _material);
        }
    }
}

                Shader:      

Shader "Custom/Test0"
{
    Properties
    {
        _MainTex("渲染纹理",2D)="white"{}
        _BlurCenter("径向模糊中心",Vector)=(0.5,0.5,0,0)
        _BlurIteration("径向模糊迭代次数",Float)=1.0
        _BlurStrength("径向模糊强度",Float)=1.0
        _BlurArea("径向模糊半径",Float)=0.2
    }
    SubShader
    {
        Pass
        {
            Tags
            {
                "LightMode"="ForwardBase"
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
     
            sampler2D _MainTex;
            float4 _BlurCenter;
            float _BlurIteration;
            float _BlurStrength;
            float _BlurArea;

            struct a2v
            {
                float4 vertex:POSITION;
                float2 texcoord:TEXCOORD0;
            };

            struct v2f
            {
                float4 pos:SV_POSITION;
                float2 uv:TEXCOORD0;
            };

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

            fixed4 frag(v2f i):SV_Target
            {
                float2 dir=_BlurCenter.xy-i.uv.xy;
                
                float area=saturate(distance(_BlurCenter.xy,i.uv.xy)-_BlurArea);
                
                fixed3 color=0;
                
                for (int j = 0; j < _BlurIteration; ++j)
                {
                    float2 uv=i.uv+dir*_BlurStrength*j*area*0.2;
                    color+=tex2D(_MainTex,uv);                    
                }
                color/=_BlurIteration;
                return  fixed4(color,1);
            }
            ENDCG
        }
    }
}

             

         结果还行只能说,毕竟这也不是啥大场景,效果具体怎么样也看不出

        3. 不同模糊用到了不同的公式,模糊效果也各不相同,看需求,网上大佬有文章写的很全。

二、单个物体的模糊。     

       针对于某些物体的模糊,虽然上面已经提到了基于模糊半径的模糊,但是那种仍然属于整体上的范畴,要做的针对某一物体要用到分层模糊。

        在物体描边一章中有应用。效果在文章末尾,描边效果是使用高斯模糊叠加出来的。         (65条消息) UnityShader基础案例(五)——物体描边_implosion98的博客-CSDN博客_unity 描边        

猜你喜欢

转载自blog.csdn.net/SliverAsh_/article/details/127172488