一.效果介绍
原图:
高斯模糊图:
Bloom效果图:
从上面三张图可以直观的看出模糊效果和bloom效果带来的视觉差异,模糊效果可以理解为打了马赛克,至于马赛克的精细程度根据参数可以调节,Bloom效果就是当光线比较亮的地方看起来有亮光模糊效果。
二.基本原理和实现方法介绍
高斯公式:,高斯分布也称正态分布。高斯模糊的基本含义为通过该公式描述了周围各点对当前点的影响程度呈正态分布。比如当前点受周围第一圈的点影响度为30%,第二圈为23% 第三圈点影响改点8%,然后越来越少。这些受影响程度的值就是由高斯公式计算出来的,但是通常在计算过程中,我们就直接套用计算好的值了,而不是全计算高斯公式。
比如:
static const half curve[7] = { 0.0205, 0.0855, 0.232, 0.324, 0.232, 0.0855, 0.0205 }
static const half4 curve4[7] = { half4(0.0205,0.0205,0.0205,0), half4(0.0855,0.0855,0.0855,0), half4(0.232,0.232,0.232,0),
half4(0.324,0.324,0.324,1), half4(0.232,0.232,0.232,0), half4(0.0855,0.0855,0.0855,0), half4(0.0205,0.0205,0.0205,0) };
可以直接将上面的权重数据放在采样点的计算过程中,通常情况下严格的高斯公式指的肯定是计算周围的全部点,那样就会导致采样次数过高导致GPU无法负担,所以通常情况下我们只是象征性的采样水平和竖直方向的点进行采样,可以一次性进行上下左右点的采样进行高斯权重计算,但是二维核进行采样消耗过多,所以通常采用分别进行水平和竖直方向的一维计算,和二维计算效果一样,但是效率会高很多。模糊说到底其实是计算周围点像素读该点的影响程度如下:
Shader:shader比较简单:
- v2f vert(appdata v)
- {
- v2f o;
- o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
- float2 uv = TRANSFORM_TEX(v.uv, _MainTex);
- o.uv = uv;
- return o;
- }
- fixed4 fragVertical(v2f i) : SV_Target
- {
- float gaussweight[3] = { 0.4026,0.2442 ,0.0545 };
- float3 maskcol = tex2D(_MaskTex, i.uv);
- float3 col = tex2D(_MainTex, i.uv).rgb;
- //if ((maskcol.r + maskcol.g + maskcol.b) < 0.1f)
- // return float4(col, 1);
- //这个过滤会大幅降低模糊周围的效果
- //if (Luminance(col)<0.01f)
- // return float4(col, 1);
- col = col.rgb*gaussweight[0];
- col += tex2D(_MainTex, i.uv + _BlurSize*float2(0, _MainTex_TexelSize.y)).rgb*gaussweight[1];
- col += tex2D(_MainTex, i.uv - _BlurSize*float2(0, _MainTex_TexelSize.y)).rgb*gaussweight[1];