一个提高GPU模糊算法的速度的方法

我们知道,模糊算法,比如高斯模糊是卷积算法的一种应用。计算图像中一个像素的模糊颜色值需要通过采样周围像素的颜色值来计算。

对于GPU应用,比如OpenGL,在shader中进行纹理采样是一个比较费时的操作,所以当我们进行模糊运算时,模糊值越大,需要进行的纹理采样操作就越多,对速度的影响也就越严重。

网上有很多对从算法上进行模糊速度优化的方法,其中Daniel Rákos在他的博文中给出的一种通过利用GPU硬件纹理采样插值的特性优化纹理采样次数的方法是一种很棒的优化。

但是当我们需要进行大范围,高强度的模糊时,特别是在移动设备上时,我们还是很快就会遇到性能瓶颈。本文介绍一种适用于这种情况的简单好用的方法。

在使用OpenGL的纹理对象时,我们经常会使用mipmap。mipmap可以对纹理进行降分辨率处理,并通过level来访问同一个纹理的不同分辨率版本。这样做可以优化纹理采样的速度,并且在很多情况下可以优化纹理采样的效果。

具体mipmap的使用如果不太熟悉的话,网上有很多教程可以参考,这里就不再详细描述了。

当我们知道mipmap的用法时,我们就可以利用mipmap来对模糊算法进行优化。mimap会将纹理进行不同等级的缩放,其中level1会将纹理尺寸缩小当原尺寸的一半,所以当我们将level1的纹理放大到原尺寸时,图像会变得模糊,而这 同样是利用GPU对纹理的硬件采样功能,这种硬件插值采样的速度很快。

具体做法时,当我们进行模糊运算时,我们可以通过降级纹理分辨率的方式来降低模糊采样的的次数。比如,当我们需要进行20个像素的模糊时,我们可以通过对level1的mipmap进行10个像素的模糊,然后把结果放大到原分辨率,这样一来,我们需要计算的像素变成了原来的四分之一,而降低模糊值,同样大幅度减少了像素采样的次数,同样能对性能有大幅度提升。

当然,这种方法的缺点是,当我们对纹理降低分辨率时,我们同时也失去了图像的一些细节,所以过度的缩放会导致模糊的结果的值和实际结果有差异。所以我们只推荐在进行高强度缩放时使用这种方法。

另外在具体实施的过程中,这里有几点提示

  1. Mipmap的生成

    OpenGL 3.0以前,OpenGL只运行对宽高为2的次方的纹理生成mipmap,比如宽高为512或者1024,如果宽高为300或者400之类的纹理是不可以生成mipmap的。这种情况下,我们可以通过绘制多边形和绘制到纹理的方式来绘制一个尺寸为原尺寸二分之一的纹理。

    对应OpenGL 3.0及更新版本,我们可以直接对任何尺寸的纹理生成mipmap。

  2. 纹理采样方式的设置

    当我们在生成纹理和生成纹理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模糊算法的速度的方法的更多相关文章

  1. 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。

    这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...

  2. 如何提高ASP.NET页面载入速度的方法

    前言 本文是我对ASP.NET页面载入速度提高的一些做法,这些做法分为以下部分: 1.采用 HTTP Module 控制页面的生命周期. 2.自定义Response.Filter得到输出流stream ...

  3. 提高ASP.NET页面载入速度的方法

    前言 本文是我对ASP.NET页面载入速度提高的一些做法,这些做法分为以下部分: 目录 1.采用 HTTP Module 控制页面的生命周期. 2.自定义Response.Filter得到输出流str ...

  4. PID控制算法的C语言实现十一  模糊算法简介

    在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...

  5. 移植FastBlur模糊算法至SDL

    FastBlur是Android标配的模糊算法,这也在当时引起了一股毛玻璃热潮.IOS7就采用了此算法(这有抄袭Android之嫌,因为Android1.5就在标库中加入了此函数).算法效率很高,这也 ...

  6. 通过预编译头文件来提高C++ Builder的编译速度

    C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...

  7. 如何提高Lucene构建索引的速度

    如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...

  8. 最快速的“高斯”模糊算法(附Android源码)

      这是一个外国人的算法,本人是搬运工.参考:http://blog.ivank.net/fastest-gaussian-blur.html   1:高斯模糊算法(参考:http://www.rua ...

  9. MySQL 检索数据及提高检索速度的方法

    检索数据 mysql> SELECT [DISTINCT] 表名.列名,表名.列名,表名.列名 -- 使用通配符*表示所有列 DISTINCT表示返回不同的值 -> FROM 数据库名.表 ...

随机推荐

  1. ansible通过yum/dnf模块给受控机安装软件(ansible2.9.5)

    一,使用yum/dnf模块要注意的地方: 使用dnf软件安装/卸载时,需要有root权限, 所以要使用become参数 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnb ...

  2. Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法

    前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...

  3. UI-个人作品集

    前言 现在需要将之前做过的UI设计集起来,并做些好看的设计 设计思路 开头>技能>作品>结束 开头 我使用线条来构图 以及比较融合的背景进行衬托主题 技能 通过文字与图形搭配展示出我 ...

  4. apktool重新打包添加签名

    一.生成apk apktool b 反编译后项目目录 -o 新apk名称.apk 二.生成签名 keytool -genkeypair -alias 新apk名称.apk -keyalg RSA -v ...

  5. mybatis 架构及基础模块

    1. mybatis整体架构 基础支撑层详解 1.日志模块 mybatis日志模块没有实现类,需要接入第三方的组件,问题是第三方的组件有各自的log级别,为了能接入第三方组件,mybati日志模块定义 ...

  6. 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

    一:背景 1. 讲故事 前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常

  7. 使用Volley获取验证码

    时间紧张,直接上代码 public class MainActivity extends AppCompatActivity { private RequestQueue queues ; Strin ...

  8. LruCache缓存bitmap(三)

    应用在网络连接上,onrestart后不会重新联网获取图片,省去了流量, public class MainActivity extends AppCompatActivity { ImageView ...

  9. 关于GIT配置公私钥

    问题:pull代码时显示 原因:公钥与私钥对不上,或者没有配置导致 解决: 1.生成私钥:TortoiseGIT → PuttyGen → Generate(点击后鼠标晃动会加速)→Save Priv ...

  10. GPRS DTU的工作原理和应用场景有哪些

    GPRS DTU是属于物联网无线数据终端设备的中一种,它主要是利用公用运营商的GPRS网络(又称G网)来为用户提供无线长距离数据传输的功能.一般都是采用的高性能工业级8/16/32位通信处理器和工业级 ...