使用shader怎么实现屏幕高斯模糊

今天就跟大家聊聊有关使用shader怎么实现屏幕高斯模糊,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

秦都ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

1.新建一个C#脚本,改脚本必须挂在摄像机上

using UnityEngine;
using System.Collections;
/// <summary>
/// 高期模糊
/// </summary>
public class GaussianBlur : PostEffectsBase {
 
	//调整高斯模糊迭代次数
	[Range(0, 4)]
	public int iterations = 3;
	//模糊范围
	[Range(0.2f, 3.0f)]
	public float blurSpread = 0.6f;
	//缩放系数
	//downSample越大,需要处理的像素越少,同时也能进一步提高模糊程序,
	//但过大的downSample可能会使图像像素化。
	[Range(1, 8)]
	public int downSample = 2;
 
	public Shader gaussianBlurShader;
	private Material gaussianBlurMaterial = null;
 
	public Material material {
		get {
			gaussianBlurMaterial = CheckShaderAndCreateMaterial(gaussianBlurShader, gaussianBlurMaterial);
			return gaussianBlurMaterial;
		}
	}
 
	void OnRenderImage(RenderTexture src, RenderTexture dest) {
		if (material != null) {
			//利用缩放对图像进行降采样,从而减少需要处理的像素个数,提高性能。
			int rtW = src.width / downSample;
			int rtH = src.height / downSample;
 
			//分配一块缓冲区,这是因为,高斯模糊需要调用两个Pass,我们需要使用一块中间缓存来
			//存储第一个Pass执行完毕后得到的模糊结果。
			RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);
			//将该临时渲染纹理的滤波模式设置为双线性。这样,在调用第一个Pass时,我们需要处理的
			//像素个数就是原来的几分之一。对图像进行降采样不仅可以减少需要处理的像素个数,提高性能,
			//而且适当的降采往往还可以得到更好的模糊效果。
			buffer0.filterMode = FilterMode.Bilinear;
 
			Graphics.Blit(src, buffer0);
 
			//高斯模糊迭代次数
			for(int i=0; i<iterations; i++){
				material.SetFloat("_BlurSize", 1.0f + i * blurSpread);
 
				RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);
 
				//执行第一个Pass
				Graphics.Blit(buffer0, buffer1, material, 0);
 
				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
				buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);
 
				//执行第二个Pass
				Graphics.Blit(buffer0, buffer1, material, 1);
 
				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
			}
 
			Graphics.Blit(buffer0, dest);
			//释放临时缓存
			RenderTexture.ReleaseTemporary(buffer0);
 
		} else {
			Graphics.Blit(src, dest);
		}
	}
}

2.新建一个顶点着色器的shader,实现高斯模糊的shader代码如下:

using UnityEngine;
using System.Collections;
/// <summary>
/// 高期模糊
/// </summary>
public class GaussianBlur : PostEffectsBase {
 
	//调整高斯模糊迭代次数
	[Range(0, 4)]
	public int iterations = 3;
	//模糊范围
	[Range(0.2f, 3.0f)]
	public float blurSpread = 0.6f;
	//缩放系数
	//downSample越大,需要处理的像素越少,同时也能进一步提高模糊程序,
	//但过大的downSample可能会使图像像素化。
	[Range(1, 8)]
	public int downSample = 2;
 
	public Shader gaussianBlurShader;
	private Material gaussianBlurMaterial = null;
 
	public Material material {
		get {
			gaussianBlurMaterial = CheckShaderAndCreateMaterial(gaussianBlurShader, gaussianBlurMaterial);
			return gaussianBlurMaterial;
		}
	}
 
	void OnRenderImage(RenderTexture src, RenderTexture dest) {
		if (material != null) {
			//利用缩放对图像进行降采样,从而减少需要处理的像素个数,提高性能。
			int rtW = src.width / downSample;
			int rtH = src.height / downSample;
 
			//分配一块缓冲区,这是因为,高斯模糊需要调用两个Pass,我们需要使用一块中间缓存来
			//存储第一个Pass执行完毕后得到的模糊结果。
			RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);
			//将该临时渲染纹理的滤波模式设置为双线性。这样,在调用第一个Pass时,我们需要处理的
			//像素个数就是原来的几分之一。对图像进行降采样不仅可以减少需要处理的像素个数,提高性能,
			//而且适当的降采往往还可以得到更好的模糊效果。
			buffer0.filterMode = FilterMode.Bilinear;
 
			Graphics.Blit(src, buffer0);
 
			//高斯模糊迭代次数
			for(int i=0; i<iterations; i++){
				material.SetFloat("_BlurSize", 1.0f + i * blurSpread);
 
				RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);
 
				//执行第一个Pass
				Graphics.Blit(buffer0, buffer1, material, 0);
 
				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
				buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);
 
				//执行第二个Pass
				Graphics.Blit(buffer0, buffer1, material, 1);
 
				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
			}
 
			Graphics.Blit(buffer0, dest);
			//释放临时缓存
			RenderTexture.ReleaseTemporary(buffer0);
 
		} else {
			Graphics.Blit(src, dest);
		}
	}
}

看完上述内容,你们对使用shader怎么实现屏幕高斯模糊有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。

分享名称:使用shader怎么实现屏幕高斯模糊
分享网址:https://www.cdcxhl.com/article48/iedhep.html

成都网站建设公司_创新互联,为您提供网站建设小程序开发建站公司网站策划品牌网站设计关键词优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设