一个提高GPU模糊算法的速度的方法
一个提高GPU模糊算法的速度的方法
我们知道,模糊算法,比如高斯模糊是卷积算法的一种应用。计算图像中一个像素的模糊颜色值需要通过采样周围像素的颜色值来计算。
对于GPU应用,比如OpenGL,在shader中进行纹理采样是一个比较费时的操作,所以当我们进行模糊运算时,模糊值越大,需要进行的纹理采样操作就越多,对速度的影响也就越严重。
网上有很多对从算法上进行模糊速度优化的方法,其中Daniel Rákos在他的博文中给出的一种通过利用GPU硬件纹理采样插值的特性优化纹理采样次数的方法是一种很棒的优化。
但是当我们需要进行大范围,高强度的模糊时,特别是在移动设备上时,我们还是很快就会遇到性能瓶颈。本文介绍一种适用于这种情况的简单好用的方法。
在使用OpenGL的纹理对象时,我们经常会使用mipmap。mipmap可以对纹理进行降分辨率处理,并通过level来访问同一个纹理的不同分辨率版本。这样做可以优化纹理采样的速度,并且在很多情况下可以优化纹理采样的效果。
具体mipmap的使用如果不太熟悉的话,网上有很多教程可以参考,这里就不再详细描述了。
当我们知道mipmap的用法时,我们就可以利用mipmap来对模糊算法进行优化。mimap会将纹理进行不同等级的缩放,其中level1会将纹理尺寸缩小当原尺寸的一半,所以当我们将level1的纹理放大到原尺寸时,图像会变得模糊,而这 同样是利用GPU对纹理的硬件采样功能,这种硬件插值采样的速度很快。
具体做法时,当我们进行模糊运算时,我们可以通过降级纹理分辨率的方式来降低模糊采样的的次数。比如,当我们需要进行20个像素的模糊时,我们可以通过对level1的mipmap进行10个像素的模糊,然后把结果放大到原分辨率,这样一来,我们需要计算的像素变成了原来的四分之一,而降低模糊值,同样大幅度减少了像素采样的次数,同样能对性能有大幅度提升。
当然,这种方法的缺点是,当我们对纹理降低分辨率时,我们同时也失去了图像的一些细节,所以过度的缩放会导致模糊的结果的值和实际结果有差异。所以我们只推荐在进行高强度缩放时使用这种方法。
另外在具体实施的过程中,这里有几点提示
Mipmap的生成
OpenGL 3.0以前,OpenGL只运行对宽高为2的次方的纹理生成mipmap,比如宽高为512或者1024,如果宽高为300或者400之类的纹理是不可以生成mipmap的。这种情况下,我们可以通过绘制多边形和绘制到纹理的方式来绘制一个尺寸为原尺寸二分之一的纹理。
对应OpenGL 3.0及更新版本,我们可以直接对任何尺寸的纹理生成mipmap。纹理采样方式的设置
当我们在生成纹理和生成纹理mipmap时候,我们可以设置纹理的采样filter。如果我们想要利用GPU的硬件线性纹理采样,我们需要设置合适的filter。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
但是要注意,当我们需要对纹理生成mipmap时,需要设置纹理的filter为支持mipmap的线性采样模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
一个提高GPU模糊算法的速度的方法的更多相关文章
- 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。
这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...
- 如何提高ASP.NET页面载入速度的方法
前言 本文是我对ASP.NET页面载入速度提高的一些做法,这些做法分为以下部分: 1.采用 HTTP Module 控制页面的生命周期. 2.自定义Response.Filter得到输出流stream ...
- 提高ASP.NET页面载入速度的方法
前言 本文是我对ASP.NET页面载入速度提高的一些做法,这些做法分为以下部分: 目录 1.采用 HTTP Module 控制页面的生命周期. 2.自定义Response.Filter得到输出流str ...
- PID控制算法的C语言实现十一 模糊算法简介
在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...
- 移植FastBlur模糊算法至SDL
FastBlur是Android标配的模糊算法,这也在当时引起了一股毛玻璃热潮.IOS7就采用了此算法(这有抄袭Android之嫌,因为Android1.5就在标库中加入了此函数).算法效率很高,这也 ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- 如何提高Lucene构建索引的速度
如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...
- 最快速的“高斯”模糊算法(附Android源码)
这是一个外国人的算法,本人是搬运工.参考:http://blog.ivank.net/fastest-gaussian-blur.html 1:高斯模糊算法(参考:http://www.rua ...
- MySQL 检索数据及提高检索速度的方法
检索数据 mysql> SELECT [DISTINCT] 表名.列名,表名.列名,表名.列名 -- 使用通配符*表示所有列 DISTINCT表示返回不同的值 -> FROM 数据库名.表 ...
随机推荐
- php-ffmpeg 操作视频/音频文件
php-ffmpeg 是一个php操作视频/音频文件的类库. GitHub地址:https://github.com/PHP-FFMpeg/PHP-FFMpeg/ 使用composer快速安装:com ...
- 第二十四章 IPtables防火墙
一.iptables防火墙基本概述 1.应用场景 1.主机安全2.端口转发/ip转发3.内部共享上网 2.iptables工作流程 1.配置防火墙规则可以添加在下面,也可以添加在前面,是有顺序的2.匹 ...
- 第三十六章 Linux常用性能检测的指令
作为一个Linux运维人员,介绍下常用的性能检测指令! 一.uptime 命令返回的信息: 19:08:17 //系统当前时间 up 127 days, 3:00 ...
- 类型“DbContext”在未引用的程序集中定义。必须添加对程序及“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。using语句中使用的类型必须可隐式转换为”System.IDisposable
其他层引用Model层的ef模型时会发生这个错误 解决方法: 在你要使用EF模型的层下点击添加引用 然后点击浏览 找到Model层文件下的bin>debug文件 引用这两个dll文件 如 ...
- JDBC Statement PrepareStatement
1.JDBC中Statement接口和PrepareStatement接口关系与区别 Statement接口不能使用占位符?,需要拼sql,所以没有setInt,setString等方法:Prepar ...
- Java基础之字面值
概要:什么是字面值 字面值是指在程序中无需变量保存,可直接表示为一个具体的数字或字符串的值.比如在a = b * 2这个语句中,2就是一个字面值,它本身就是一个具体的值. 在Java源代码中,字面值用 ...
- 《JavaScript高级程序设计》——第二章在HTML使用JavaScript
这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...
- 云计算管理平台之OpenStack认证服务Keystone
一.keystone简介 keystone是openstack中的核心服务,它主要作用是实现用户认证和授权以及服务目录:所谓服务目录指所有可用服务的信息库,包含所有可用服务及其API endport路 ...
- python基础三:函数
def name(参数1,参数2,参数3,...) 可以自定义一些自己需要的函数来简化自己的工作. 如:自定义一个计算函数 def mycount(a,b,c): y=a+b-c return y ...
- 【算法】HashMap相关要点记录
在刷leetcode的算法题时,HashMap需要大量使用,而且也是面试的高频问题.这里记录了HashMap一些增.删.改.查的实现细节和时间复杂度,罗列了一些比较有用的方法,以及其它的一些细节. 1 ...