一.简介
所谓模糊,也就是不清楚,清晰的图片,各个像素之间会有明显的过渡,而如果各个像素之间的差距不是很大,那么图像就会模糊了,极端一点的情况,当一张图片所有的像素之间颜色都差不多时,那么这张图片也就是一个纯色的图片了。模糊操作就是让像素间的颜色差距变小,比如A点是红色,A点周围的点是绿色,模糊就像用一把刷子,将A点和周围的点的颜色混合起来,变成最终的颜色。而怎样混合,按照不同的权值进行混合,就可以达到不同的效果了。比如均值模糊,以及著名的高斯模糊。
影响模糊程度的重要因素是模糊半径, 模糊半径越大,模糊程度越大,模糊半径越小,模糊程度越小。那么,模糊半径是什么?所谓模糊半径,也就是我们采样的一个范围,比如我们模糊的半径很小,只是把像素和它周围的一圈定点混合,那么模糊的程度就很小,而如果我们加大模糊半径,极端情况是每个顶点都取了周围所有点,也就是整张图的像素平均值,那么这张图的颜色就会偏向一种颜色。
二.均值模糊
using UnityEngine;
using System.Collections;
//编辑状态下也运行
[ExecuteInEditMode]
//继承自PostEffectBase
public class SimpleBlurEffect : PostEffectBase
{
//模糊半径
public float BlurRadius = 1.0f;
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (_Material)
{
//blur
_Material.SetFloat("_BlurRadius", BlurRadius);
Graphics.Blit(source, destination, _Material);
}
}
}
三.均值模糊的改进
using UnityEngine;
using System.Collections;
//编辑状态下也运行
[ExecuteInEditMode]
//继承自PostEffectBase
public class SimpleBlurEffect : PostEffectBase
{
//模糊半径
public float BlurRadius = 1.0f;
//降分辨率
public int downSample = 2;
//迭代次数
public int iteration = 3;
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (_Material)
{
//申请RenderTexture,RT的分辨率按照downSample降低
RenderTexture rt1 = RenderTexture.GetTemporary(source.width >> downSample, source.height >> downSample, 0, source.format);
RenderTexture rt2 = RenderTexture.GetTemporary(source.width >> downSample, source.height >> downSample, 0, source.format);
//直接将原图拷贝到降分辨率的RT上
Graphics.Blit(source, rt1);
//进行迭代,一次迭代进行了两次模糊操作,使用两张RT交叉处理
for(int i = 0; i < iteration; i++)
{
//用降过分辨率的RT进行模糊处理
_Material.SetFloat("_BlurRadius", BlurRadius);
Graphics.Blit(rt1, rt2, _Material);
Graphics.Blit(rt2, rt1, _Material);
}
//将结果拷贝到目标RT
Graphics.Blit(rt1, destination);
//释放申请的两块RenderBuffer内容
RenderTexture.ReleaseTemporary(rt1);
RenderTexture.ReleaseTemporary(rt2);
}
}
}
四.RenderTexture介绍
五.总结
参考文献:
原文地址:http://blog.youkuaiyun.com/puppet_master/article/details/52547442
1183



被折叠的 条评论
为什么被折叠?



