美文网首页
高斯模糊——Shader屏幕后处理效果

高斯模糊——Shader屏幕后处理效果

作者: LEO_青蛙 | 来源:发表于2020-06-22 17:20 被阅读0次
    高斯模糊

    GitHub项目地址

    屏幕后处理效果即在渲染完场景得到屏幕图像后,再进行处理的效果。
    Unity Shader中的Pass是按照顺序执行的,如果需要使用一个Pass的处理结果作为另一个Pass的输入,这个时候就需要用到OnRenderImage()函数了。

    高斯模糊的原理:

    //水平方向模糊
    v2f vert_horizontal_blur(appdata v)
    {
      v2f o;
      o.vertex = UnityObjectToClipPos(v.vertex);
      half2 uv = v.uv;
      o.uv[0] = uv;
      o.uv[1] = uv + float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
      o.uv[2] = uv - float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;
      o.uv[3] = uv + float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;
      o.uv[4] = uv - float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;
      return o;
    }
    //垂直方向模糊
    v2f vert_vertical_blur(appdata v)
    {
      v2f o;
      o.vertex = UnityObjectToClipPos(v.vertex);
      half2 uv = v.uv;
      o.uv[0] = uv;
      o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
      o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
      o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
      o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
      return o;
    }
    //按照权重取样
    fixed4 frag (v2f i) : SV_Target
    {
      //0.4026 + (0.2442 + 0.0545) * 2 = 1
      float weight[3] = {0.4026, 0.2442, 0.0545};
      fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];
      for (int it = 1; it < 3; it++) {
        sum += tex2D(_MainTex, i.uv[it*2-1]).rgb * weight[it];
        sum += tex2D(_MainTex, i.uv[it*2]).rgb * weight[it];
      }
      return fixed4(sum, 1.0);
    }
    

    相关文章

      网友评论

          本文标题:高斯模糊——Shader屏幕后处理效果

          本文链接:https://www.haomeiwen.com/subject/gqoetktx.html