Unity Shader屏幕后处理高斯模糊

原理

利用卷积计算,使用的卷积核叫高斯核在这里插入图片描述

使用一个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分配一块与屏幕图像大小相同的缓冲区,高斯模糊需要
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值