一个提高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. 为什么堆化 heapify() 只用 O(n) 就做到了?

    heapify() 前面两篇文章介绍了什么是堆以及堆的两个基本操作,但其实呢,堆还有一个大名鼎鼎的非常重要的操作,就是 heapify() 了,它是一个很神奇的操作, 可以用 O(n) 的时间把一个乱 ...

  2. 【Azure 批处理 Azure Batch】在Azure Batch中如何通过开始任务自动安装第三方依赖的一些软件(Windows环境)

    准备条件 Azure Batch账号 需要安装的软件包(zip)文件,里面包含该软件的msi安装文件, 此处使用python.msi 版本 3.3.3 作为例子(https://www.python. ...

  3. 使用.NET Core创建Windows服务详细步骤

    目录 #创建步骤 1.使用Visual Studio创建 2.使用命令行创建 #项目结构说明 #将应用转换成Window服务 1.引入Microsoft.Extensions.Hosting.Wind ...

  4. pytest-pyppeteer:在pytest中运行pyppeteer

    pytest-pyppeteer pytest-pyppeteer是我写的一个 pytest 插件,支持在 pytest 中运行pyppeteer,起因是为了解决工作中的一个测试需求,现在将其开源并做 ...

  5. was 发布版本的步骤:

    was 发布版本的步骤:实际使用:1.备份应用 (备份应用下的war包,tar -czvf app.20200418.tar.gz app.war)2.停服务(was 控制台停,方便)3.替换该版本文 ...

  6. 在嵌入式设备中实现webrtc的第三种方式①

    最近两年,我对于网络知识,包括底层协议学习比较多,webrtc这种几乎是使用到了所有层面网络协议的技术也逐渐进入我的视野. 之前我提出了两种在嵌入式设备上实现webrtc的方式,一是用官方代码,然后改 ...

  7. 关于sql的随笔(标识列 即自动增长列)

    一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...

  8. Spring入门-------------1

    Spring是一个开源框架,为简化企业级应用开发而生,使用Spring可以使简单的JavaBean 实现以前只有EJB才能实现的功能.Spring 是一个IOC和Aop容器框架. 特性: 轻量级:Sp ...

  9. git每次提交代码都要设置账号密码的问题

    git config --global credential.helper store 待下一次提交代码的时候,输入了正确的用户名和密码,之后 就不需要输入用户名密码

  10. 关于HDFS应知应会的N个问题 | 技术点

    1. Namenode的安全模式 ? 安全模式是Namenode的一种状态(Namenode主要有active/standby/safemode三种模式). 2. 哪些情况下,Namenode会进入安 ...