随笔 - 167  文章 - 2  评论 - 38  阅读 - 37万

unity 高斯模糊shader

闲着没事,写了个高斯模糊的shader,有用的到的可以mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Shader "Unlit/GaussionBlur"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        //值越大,正态分布图像越扁,距离远的像素的权重越高,颗粒感越明显
        _Sigma("Sigma", Range(1, 30)) = 20
        //多少倍的Sigma,值越大,采样越多,越细腻,会循环(2n+1)(2n+1)次,所以这个值不要太大,太大也没用
        _Ratio("Sigma Ratio", Range(1, 4)) = 2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
 
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
 
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
 
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
 
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _MainTex_TexelSize;
 
            float _Sigma;
            float _Ratio;
 
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }
 
            fixed4 frag (v2f i) : SV_Target
            {
                float sum=0;
                fixed4 col = fixed4(0,0,0,0);
                for (float j = -_Ratio*_Sigma; j <= _Ratio*_Sigma; j+=_Sigma)
                {
                    for (float k = -_Ratio*_Sigma; k <= _Ratio*_Sigma; k+=_Sigma)
                    {
                        float2 _offset=float2(j,k)*_MainTex_TexelSize.xy;
                        float2 blurUV = i.uv + _offset;
                        if(blurUV.x >= 0 && blurUV.x <= 1 && blurUV.y >= 0 && blurUV.y <= 1)
                        {
                            //二维正态分布,公式:G(x,y)=exp(-(x²+y²)/(2σ²))/(2πσ²)
                            float weight = exp((_offset.x * _offset.x + _offset.y * _offset.y)/(-2 * _Sigma * _Sigma))/(6.2831852 * _Sigma * _Sigma);
                            col += tex2D(_MainTex, blurUV) * weight;
                            sum += weight;
                        }
                    }
                }  
 
                return col/sum;
            }
            ENDCG
        }
    }
}

  

效果:

 

posted on   Jason_c  阅读(446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-10-14 球面点三维坐标到纹理二维坐标的转换
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示