一个提高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 数据库名.表 ...
随机推荐
- PHP7下的协程实现 转
前言 相信大家都听说过『协程』这个概念吧. 但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果你无法准确地表达出一个知识点的话 ...
- oblivious polynomial evaluation
Oblivious polynomial evaluation is a protocol involving two parties, a sender whose input is a polyn ...
- ES概要
ES分布式搜索,依赖了Lucene来提供搜索引擎功能,每个数据节点都是一个Lucene实例,通过将索引进行分片,写入和查询时候操作或查询对应分片,来达到水平扩展的能力 节点 Master node:负 ...
- ES index not_analyzed
在最初创建索引mapping时,未指定index:not_analyzed "exact_value": { "type": "string" ...
- C--迷途指针
简介: 在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情 ...
- 【0】TensorFlow光速入门-序
本文地址:https://www.cnblogs.com/tujia/p/13863181.html 序言: 对于我这么一个技术渣渣来说,想学习TensorFlow机器学习,实在是太难了: 百度&qu ...
- viewpager欢迎页面底部点的滑动效果
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...
- Spring Cloud 学习笔记 (一)-- Eureka 服务器
开局一张图,截取了本人学习资料中的一张图,很好地展示了Eureka的架构. Eureka服务器 管理服务的作用.细分为服务注册,服务发现. 所有的客户端在Eureka服务器上注册服务,再从Eureka ...
- 【CF1445D】Divide and Sum 题解
题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...
- MySQL图形界面客户端
图形界面客户端 使用图形界面客户端操作数据库更直观.方便.下面三个客户端都能操作MySQL,各有各自的优点. 1.Navicat Premium 下载安装包下载 关注公众号[轻松学编程],然后回复[n ...