您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页OpenGL实现高斯模糊

OpenGL实现高斯模糊

来源:叨叨游戏网

简单概括: 区别于直接对区域内所有像素的颜色做平均,利用高斯函数曲线(正态分布)的最高点作为当前像素的权重,相邻像素权重根据曲线递减。这样就可以实现距离当前像素越近的像素权重相对更大,越远的像素权重较小,从而产生更好更自然的模糊。

步骤

高斯模糊,假如我们模糊卷积核采用的是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]);	// 先绑定了帧缓存1
    		shaderBlur.setBool("horizontal", horizontal);	// 指定着色器进行水平模糊(因为true)
    		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]
    • 循环直到退出,即可得到最终高斯模糊图像

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务