今天就跟大家聊聊有关使用shader怎么实现屏幕高斯模糊,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
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怎么实现屏幕高斯模糊有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4589456/blog/4614942