Unity背景模糊图片高斯模糊高性能的实现方案

本文详细描述了如何在Unity2021.3.x中使用SubShader实现高斯模糊效果,包括垂直和水平模糊的顶点着色器以及固定函数片段着色器的编写过程。
摘要由CSDN通过智能技术生成

环境:

unity2021.3.x

效果:

模糊前:

模糊后:

模糊前:

模糊后:

实现核心思路(shader):

 SubShader {
     CGINCLUDE
     
     #include "UnityCG.cginc"
     
     sampler2D _MainTex; // 主纹理
     half4 _MainTex_TexelSize; // _MainTex的像素尺寸大小, float4(1/width, 1/height, width, height)
     float _BlurSize; // 模糊尺寸(纹理坐标的偏移量)
       
     struct v2f {
         float4 pos : SV_POSITION; // 模型空间顶点坐标
         half2 uv[5]: TEXCOORD0; // 5个邻域的纹理坐标
     };
       
     v2f vertBlurVertical(appdata_img v) { // 垂直模糊顶点着色器
         v2f o;
         o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
         half2 uv = v.texcoord;
         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 vertBlurHorizontal(appdata_img v) { // 水平模糊顶点着色器
         v2f o;
         o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
         half2 uv = v.texcoord;
         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 fragBlur(v2f i) : SV_Target {
         float weight[3] = {0.4026, 0.2442, 0.0545}; // 大小为5的一维高斯核,实际只需记录3个权值
         fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];
         for (int j = 1; j < 3; j++) {
             sum += tex2D(_MainTex, i.uv[j * 2 - 1]).rgb * weight[j]; // 中心右侧或下侧的纹理*权值
             sum += tex2D(_MainTex, i.uv[j * 2]).rgb * weight[j]; // 中心左侧或上侧的纹理*权值
         }
         return fixed4(sum, 1.0);
     }
         
     ENDCG
     
     ZTest Always Cull Off ZWrite Off
     
     Pass {
         NAME "GAUSSIAN_BLUR_VERTICAL"
         
         CGPROGRAM
           
         #pragma vertex vertBlurVertical  
         #pragma fragment fragBlur
           
         ENDCG  
     }
     
     Pass {  
         NAME "GAUSSIAN_BLUR_HORIZONTAL"
         
         CGPROGRAM  
         
         #pragma vertex vertBlurHorizontal  
         #pragma fragment fragBlur
         
         ENDCG
     }
 }

github地址:高斯模糊 Github地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路随云00000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值