Unity Shader 图片模糊效果实现

Unity Shader 图片模糊效果实现

shader源码如下 

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
 
Shader "Custom/GaussianBlur"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _StencilComp("Stencil Comparison", Float) = 8
        _Stencil("Stencil ID", Float) = 0
        _StencilOp("Stencil Operation", Float) = 0
        _StencilWriteMask("Stencil Write Mask", Float) = 255
        _StencilReadMask("Stencil Read Mask", Float) = 255
 
        _ColorMask("Color Mask", Float) = 15
 
        _BlurSize("Blur Size", Float) = 2  //调整模糊强度
    }
 
        CGINCLUDE
 
#include "UnityCG.cginc"
 
        sampler2D _MainTex;
        uniform half4 _MainTex_TexelSize;
        uniform float _BlurSize;
 
        static const half weight[4] = { 0.0205, 0.0855, 0.232, 0.324 };
        static const half4 coordOffset = half4(1.0h, 1.0h, -1.0h, -1.0h);
 
        struct v2f_blurSGX
        {
            float4 pos:SV_POSITION;
            half2 uv:TEXCOORD0;
            half4 uvoff[3]:TEXCOORD1;
        };
 
        v2f_blurSGX vert_BlurHorizontal(appdata_img v)
        {
            v2f_blurSGX o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = v.texcoord.xy;
            half2 offs = _MainTex_TexelSize.xy*half2(1, 0)*_BlurSize;
            o.uvoff[0] = v.texcoord.xyxy + offs.xyxy*coordOffset * 3;
            o.uvoff[1] = v.texcoord.xyxy + offs.xyxy*coordOffset * 2;
            o.uvoff[2] = v.texcoord.xyxy + offs.xyxy*coordOffset;
 
            return o;
        }
 
        v2f_blurSGX vert_BlurVertical(appdata_img v)
        {
            v2f_blurSGX o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = v.texcoord.xy;
 
            half2 offs = _MainTex_TexelSize.xy*half2(0, 1)*_BlurSize;
            o.uvoff[0] = v.texcoord.xyxy + offs.xyxy*coordOffset * 3;
            o.uvoff[1] = v.texcoord.xyxy + offs.xyxy*coordOffset * 2;
            o.uvoff[2] = v.texcoord.xyxy + offs.xyxy*coordOffset;
 
            return o;
        }
 
        fixed4 frag_Blur(v2f_blurSGX i) :SV_Target
        {
 
            fixed4 c = tex2D(_MainTex,i.uv)*weight[3];
            for (int idx = 0; idx < 3; idx++)
            {
                c += tex2D(_MainTex,i.uvoff[idx].xy)*weight[idx];
                c += tex2D(_MainTex,i.uvoff[idx].zw)*weight[idx];
            }
 
            return c;
        }
 
            ENDCG
 
            SubShader
        {
            // No culling or depth
            Cull Off ZWrite Off
            Stencil
            {
                Ref[_Stencil]
                Comp[_StencilComp]
                Pass[_StencilOp]
                ReadMask[_StencilReadMask]
                WriteMask[_StencilWriteMask]
            }
            Fog{ Mode Off }
            Blend SrcAlpha OneMinusSrcAlpha
            ColorMask[_ColorMask]
 
                Pass
            {
                ZTest Always
                CGPROGRAM
                #pragma vertex vert_BlurHorizontal
                #pragma fragment frag_Blur
 
 
                ENDCG
            }
 
                Pass
            {
                ZTest Always
                CGPROGRAM
                #pragma vertex vert_BlurVertical
                #pragma fragment frag_Blur
 
 
                ENDCG
            }
        }
}

 

你可能感兴趣的:(Unity,shader,unity3d)