一个提高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. faker使用

    laravel中faker的方法总结   展开 laravel faker用法总结 安装 composer require fzaninotto/faker   一.基础方法: 随机数:randomD ...

  2. STM32时钟和定时器

    时钟源 STM32包含了5个时钟源,分别为HSI.HSE.LSI.LSE.PLL. HSI是高速内部时钟.RC振荡器,频率为8MHz: HSE是高速外部时钟,即晶振,可接石英/陶瓷谐振器或接外部时钟源 ...

  3. 微信小程序-基于高德地图API实现天气组件(动态效果)

    微信小程序-基于高德地图API实现天气组件(动态效果) ​ 在社区翻腾了许久,没有找到合适的天气插件.迫不得已,只好借鉴互联网上的web项目,手动迁移到小程序中使用.现在分享到互联网社区中,帮助后续有 ...

  4. MVC查询

    前言 最近没什么好写的,所以写个查询来巩固一下知识 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head> & ...

  5. Python基础及爬虫入门

    **写在前面**我们在学习任何一门技术的时候,往往都会看很多技术博客,很多程序员也会写自己的技术博客.但是我想写的这些不是纯技术博客,我暂时也没有这个能力写出 Python 或者爬虫相关的技术博客来. ...

  6. *新阿里镜像maven配置流程

    解决idea中maven仓库下载jar包慢的问题 配置阿里镜像 设置idea 配置阿里镜像参考链接:https://blog.csdn.net/redhat0921/article/details/1 ...

  7. 阿里云ECS磁盘扩容不生效处理办法

    原因 阿里云ECS云盘扩容后,在Linux服务器上没有生效 实际需要几条命令扩容才能正式生效. 处理方法 先看扩容前磁盘空间,/dev/vda1可以看到只有40G. # df -Th Filesyst ...

  8. 渗透测试之nmap

    一,功能介绍 Nmap是网络连接端口扫描软件,用来扫描网上电脑开放的哪些连接端口,并且确定哪些服务运行在哪些端口连接,推断是哪个操作系统,他是网络管理员必备的软件之一,以及用于评估网络系统安全. 二, ...

  9. 020_Typora使用

    目录 Typora使用 下载 安装 设置 使用 Typora使用 Typora插入本地图片为本地路径,网络上无法查看,所以建议只插入网络图片. 下载 百度搜索官网 下载 安装 设置 视图->显示 ...

  10. Android操作系统及APP

    1.   Android操作系统 1.1.  介绍 Android操作系统最初由Andy Rubin开发,主要支持手机.2005年8月由Google收购注资.第一部Android智能手机发布于2008 ...