原理
利用卷积计算,使用的卷积核叫高斯核
使用一个N x N的高斯核对图像进行卷积滤波,就需要N x N x W x H次纹理采样,当N的大小不断增加时,采样次数会变得非常巨大,不过我们可以把这个二维高斯函数拆分成两个一维函数.
得到的结果是一样的。
实现
我们会先后调用两个Pass,第一个Pass使用竖直方向的一维高斯核进行滤波,第二个Pass使用水平方向的一维高斯核,得到最终的目标图像.
首先,创建一个脚本:
public class GaussianBlur : PostEffectsBase
声明需要的Shader,并创建相应的材质:
public Shader gaussianBlurShader;
private Material gaussianBlurMaterial = null;
public Material material
{
get
{
gaussianBlurMaterial = CheckShaderAndCreateMaterial(gaussianBlurShader, gaussianBlurMaterial);
return gaussianBlurMaterial;
}
}
然后提供调整高斯模糊迭代次数、模糊范围、缩放系数的参数:
[Range(0, 4)]
public int iterations = 3;//高斯模糊迭代次数
[Range(0.2f, 3.0f)]
public float blurSpread = 0.6f;//模糊范围
[Range(1, 8)]
public int downSample = 2;//缩放系数
downSample越大,需要处理的像素数越少,同时也能进一步提高模糊程度,但过大有可能造成图像像素化.
最后定义关键的OnRenderImage
函数:
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
if (material != null)
{
int rtW = src.width / downSample;//利用缩放对图像进行降采样,从而减少需要处理的像素个数提高性能
int rtH = src.height / downSample;
//GetTemporary分配一块与屏幕图像大小相同的缓冲区,高斯模糊需要