首页 > 其他分享 >unity 高斯模糊shader

unity 高斯模糊shader

时间:2022-10-14 16:24:02浏览次数:56  
标签:Ratio MainTex float vertex shader unity float4 Sigma 高斯

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

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

  

效果:

 

标签:Ratio,MainTex,float,vertex,shader,unity,float4,Sigma,高斯
From: https://www.cnblogs.com/Jason-c/p/16791947.html

相关文章

  • Unity 在模型上展示标签UI
    voidUpdate(){this.transform.LookAt(Camera.main.transform);}   在主摄像机下设置一个子摄像机,主摄像机CullingMask去掉显示UI。子摄像机Cul......
  • Unity应用在手机息屏或切入后台时与正常运行之间的区别
    1)Unity应用在手机息屏或切入后台时与正常运行之前的区别​2)PSD转Prefab方案的流程3)HUDUI的资源加载问题4)2021.3Android从AssetBundle中加载视频播放失败问题这是第310......
  • unity3d 对接 workerman 实现联机游戏
    前言:    Unity3D,相信很多人都知道是用来做游戏的。网上也有很多这类视频的教程,我也试着学习过。但是当要实现多人实时对战的教例比较少,而用PHP来做Unity3d的......
  • 有效解决steamcommunity端口占用问题
    端口查找(使用Windows自带的CMD命令行工具):查找80端口:netstat-ano|findstr80  [涉及80,不建议修改.]查找443端口:netstat-ano|findstr443 [经验证,改这一处即......
  • Unity---2020版本连接Mysql报错
    连接Mysql需要Mysql.data打包发布后无法连接数据库需要导入I18N.dll,I18N.CJK.dll,I18N.West.dll导入System.Data.dll2020版本以上不需要导入System.Data.dll如......
  • KodeLife | Shader 实时编辑预览的强大工具使用实践
    公众号回复:666,领取学习资源大礼包经常有朋友在群里面问想学习Shader有什么工具可以推荐?今天它来了~~~推荐一款强大的Shader实时编辑预览的工具——​​KodeLife​​......
  • Unity关于引用.Net或其他C# dll的问题。(我是用的版本是2018.3)
      首先,因为我是用到了.NetWinForm中的中的一个System.Windows.WinForms中的类(OpenFileDialog)就是打开就是选择资源的一个对话框。ALT+Enter可以直接在VS中引用,但是......
  • Matlab pulstran关于高斯脉冲的学习
    高斯脉冲的频带越小,说明带宽越小(在频域观察,而不是时域)在用matlab中调用pulstran时,如果采用gausplus,那么带宽w代表高斯脉冲频率为中心频率的的两倍clearcloseallclcfs=......
  • Unity UGUI Text 添加下划线及超链接文本点击
    usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Text.RegularExpressions;usingUnityEngine;usingUnityEngine.Events;usingUn......
  • Unity使用DOTS开发前准备工作
    该文章发布时使用的unity编辑器版本为2023.1.0该文章用到的DOTS版本为1.0使用DOTS开发前先修改Unity编辑器一些位置Edit->ProjectSettings✔勾上EnterPlayMod......