简单概括: 区别于直接对区域内所有像素的颜色做平均,利用高斯函数曲线(正态分布)的最高点作为当前像素的权重,相邻像素权重根据曲线递减。这样就可以实现距离当前像素越近的像素权重相对更大,越远的像素权重较小,从而产生更好更自然的模糊。
步骤
高斯模糊,假如我们模糊卷积核采用的是9x9的
- 我们不直接对相当像素的周围81个像素进行采样,然后把他们颜色值拿来乘以响应权重后相加
- 而是采用
两步高斯模糊 的方法,即先对图像做水平/垂直方向的模糊,再对该单向模糊后的纹理图像做另一个方向的模糊。在两次单向模糊后就得到了与直接采样81个像素做高斯模糊的几乎一样的模糊图像。
这样的好处是: 节省了极大量的采样次数。两步高斯模糊分两次进行,每一次采样当前像素以及周围的一共9个像素,一共采样18次,每个像素节省了63次那么最终可以节省图像分辨率*63次采样数 - 如果需要模糊效果更强,那就循环进行上面两步即可,整个步骤:对原图像做水平模糊
→
\to
→垂直模糊(对上一步得到的结果图像。后同)
→
\to
→水平模糊
→
\to
→垂直模糊
→
\to
→水平。。。。。。循环次数越多,模糊效果越强
bool horizontal = true, first_iteration = true;
unsigned int amount = 10;
shaderBlur.use();
for (unsigned int i = 0; i < amount; i++)
{
glBindFramebuffer(GL_FRAMEBUFFER, FBO[horizontal]);
shaderBlur.setBool("horizontal", horizontal);
glBindTexture(GL_TEXTURE_2D, first_iteration ? scene: Colorbuffers[!horizontal]);
renderQuad();
horizontal = !horizontal;
if (first_iteration)
first_iteration = false;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
这一行代码 glBindTexture(GL_TEXTURE_2D, first_iteration ? scene : Colorbuffers[!horizontal]);
- 判断是不是首次模糊,首次模糊的采样纹理是场景纹理,存放在
scene中 - 首次做水平模糊后,得到图像存放到帧缓存
FBO[1]的颜色附件Colorbuffers[1]中 - 第二次循环做垂直模糊,取
Colorbuffers[1]的图像,做垂直模糊,结果存到Colorbuffers[0]中 - 循环直到退出,即可得到最终高斯模糊图像