一個提高GPU模糊算法的速度的方法
我們知道,模糊算法舍咖,比如高斯模糊是卷積算法的一種應用达箍。計算圖像中一個像素的模糊顏色值需要通過采樣周圍像素的顏色值來計算。
對于GPU應用奢赂,比如OpenGL陪白,在shader中進行紋理采樣是一個比較費時的操作,所以當我們進行模糊運算時膳灶,模糊值越大咱士,需要進行的紋理采樣操作就越多,對速度的影響也就越嚴重轧钓。
網(wǎng)上有很多對從算法上進行模糊速度優(yōu)化的方法序厉,其中Daniel Rákos在他的博文中給出的一種通過利用GPU硬件紋理采樣插值的特性優(yōu)化紋理采樣次數(shù)的方法是一種很棒的優(yōu)化。
但是當我們需要進行大范圍毕箍,高強度的模糊時弛房,特別是在移動設備上時,我們還是很快就會遇到性能瓶頸而柑。本文介紹一種適用于這種情況的簡單好用的方法文捶。
在使用OpenGL的紋理對象時,我們經(jīng)常會使用mipmap媒咳。mipmap可以對紋理進行降分辨率處理粹排,并通過level來訪問同一個紋理的不同分辨率版本。這樣做可以優(yōu)化紋理采樣的速度涩澡,并且在很多情況下可以優(yōu)化紋理采樣的效果顽耳。
具體mipmap的使用如果不太熟悉的話,網(wǎng)上有很多教程可以參考,這里就不再詳細描述了斧抱。
當我們知道m(xù)ipmap的用法時常拓,我們就可以利用mipmap來對模糊算法進行優(yōu)化。mimap會將紋理進行不同等級的縮放辉浦,其中l(wèi)evel1會將紋理尺寸縮小當原尺寸的一半弄抬,所以當我們將level1的紋理放大到原尺寸時,圖像會變得模糊宪郊,而這 同樣是利用GPU對紋理的硬件采樣功能掂恕,這種硬件插值采樣的速度很快。
具體做法時弛槐,當我們進行模糊運算時懊亡,我們可以通過降級紋理分辨率的方式來降低模糊采樣的的次數(shù)。比如乎串,當我們需要進行20個像素的模糊時店枣,我們可以通過對level1的mipmap進行10個像素的模糊,然后把結果放大到原分辨率叹誉,這樣一來鸯两,我們需要計算的像素變成了原來的四分之一,而降低模糊值长豁,同樣大幅度減少了像素采樣的次數(shù)钧唐,同樣能對性能有大幅度提升。
當然匠襟,這種方法的缺點是钝侠,當我們對紋理降低分辨率時,我們同時也失去了圖像的一些細節(jié)酸舍,所以過度的縮放會導致模糊的結果的值和實際結果有差異帅韧。所以我們只推薦在進行高強度縮放時使用這種方法。
另外在具體實施的過程中啃勉,這里有幾點提示
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);