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
            }
        }
}

转载于:https://www.cnblogs.com/grassgarden/p/9784519.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值