本篇为系列文章之一,建议先看基础回顾~
在游戏中,有时候可以看到,当你打开一个弹出框式的界面的时候,原本的界面作为背景会变模糊,以突出最上层的弹出框,让玩家视觉观察区域集中起来~或者是,当你受到区别于普通攻击的一次暴击的时候,屏幕会出现一些特效,比如震动,出现红色边框,或者是会模糊一下,以突出被打击的感觉。这两种例子里的模糊都很适合程序实时渲染这些特效。
在基础回顾里我们已经说过,我们主要是重写draw函数和相应的shader,首先我们实现把一张贴图渲染为模糊的效果吧~
实现模糊效果,基本的实现思路是在每渲染一个像素的时候,都取一些周围的像素的颜色信息,这样当前渲染的这个像素就带有临近像素的信息了~但是这些临近点怎么个取法呢~为了实现和自然比较贴近的模糊效果,但是又顾及到程序的渲染效率,我们先使用一种简单的方式去实现这个采样,那就是去当前像素周围一圈的八个像素,然后九个值求平均数。所以在下面的函数中,我们在shader中创建了一个uniform变量vec2 u_BlurDis来设置采样像素间隔。因为贴图的UV坐标是从0到1的,所以在代码中设置了_pixelSpan = 1.0f,并根据贴图大小算出u_BlurDis,来确保采样跨度为1个像素~
#define UniformBlurDis "u_BlurDis"
......
_uniforms[kUniformBlur