内容
- 简介
- 径向模糊
- 均值模糊
- 高斯模糊
1. 简介
模糊是一种常见的图像处理手段,也是一种常见的后处理效果,用于降低图片细节层次。对于清晰的图像来说,像素点保存的颜色信息足够准确,图片也就能表现更多的细节。相反,要达到模糊的效果,自然就是将精准的颜色信息“舍弃”掉。
径向模糊
均值模糊
高斯模糊
2. 径向模糊
径向模糊效果:从某一中心点向外呈幅射状的逐渐模糊的效果 。
径向模糊原理:先选取屏幕坐标的一点作为中心点,选取其它每个像素点与中心点连线之间的几个点作为采样点,计算这几个采样点颜色的求和平均值,就是该像素点的值。因此,有以下几个关键点需要考虑:
- 中心点的选取:一般是屏幕坐标中心点(0.5,0.5),如果实现GodRay的话,需要获取光源的屏幕坐标(世界坐标转屏幕坐标)作为中心点。
- 采样点的选取:常用的方式是给定采样点数量,然后计算当前像素点与中心点的距离,除以采样点数量得到步长,来确定采样点位置。
- 采样值的权重:通常为1,即采样点颜色求和再除以采样点个数。
代码如下:
Shader "Custom/PostProcess/RadialBlur" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
CGINCLUDE
uniform sampler2D _MainTex;
uniform int _BlurSample; //模糊采样个数
uniform fixed _BlurBias; //模糊采样偏移
uniform fixed _BlurFactor; //模糊步长系数
uniform float2 _BlurCenter; //模糊中心点(屏幕空间坐标点)
#include "UnityCG.cginc"
fixed4 frag(v2f_img i) : SV_Target{
float2 bias = (_BlurCenter - i.uv.xy) * _BlurBias; //模糊偏移值:由中心点到像素点的方向的偏移矢量
float2 step = (i.uv - _BlurCenter) / _BlurSample * _BlurFactor; //计算模糊步长:决定了采样点的位置
float2 uv = i.uv + bias;
float4 outColor = 0;
for (int j = 0; j < _BlurSample; j++){
uv += step;
outColor += tex2D(_MainTex, uv);
}
outColor /= _BlurSample;
return outColor;
}
ENDCG
SubShader{
Pass{
ZTest Always
Cull Off
ZWrite Off
Fog{ Mode off }
CGPROGRAM
#pragma fragmentoption ARB_precision_hint_fastest
#pragma vertex vert_img
#pragma fragment frag
ENDCG
}
}
Fallback off
}