最近在做視頻處理方面的工作蘸鲸,然后接觸到了GPUImage這個開源庫,這是庫使用的是OpenGLES這套圖像處理方案。初使用時氮唯,一臉懵逼,雖然大學(xué)時學(xué)過一些圖像處理方面的知識驰坊,因為不是主課程,老師講得也比較粗糙哮独,再加上當(dāng)時也沒有認(rèn)真研究拳芙,所以基本是都還給老師了察藐。
首先熟悉下基本的概念
- CPU 與 GPU
電腦或者手機上做圖像處理有很多方式,但是目前為止最高效的方法是有效地使用圖形處理單元舟扎,或者叫GPU分飞。你的手機包含兩個不同的處理單元,CPU和GPU浆竭。CPU是個多面手浸须,并且不得不處理所有的事情惨寿,而GPU則可以集中來處理好一件事情邦泄,就是并行地做浮點運算。事實上裂垦,圖像處理和渲染就是在將要渲染到窗口上的像素上做許許多多的浮點運算顺囊。
通過有效的利用GPU,可以成百倍甚至上千倍地提高手機上的圖像渲染能力蕉拢。如果不是基于GPU的處理特碳,手機實時高清視頻濾鏡是不現(xiàn)實,甚至不可能的晕换。
- 著色器(shader)
著色器(shader)是我們利用這種能力的工具午乓。著色器是用著色語言寫的小的,基于C語言的程序≌⒆迹現(xiàn)在有許多種著色語言益愈,但你如果做OS X 或者iOS開發(fā)的話,你應(yīng)該專注于OpenGL著色語言夷家,或者叫GLSL蒸其。你可以將GLSL的理念應(yīng)用到其他的更專用的語言(比如Metal)上去。這里我們即將即將介紹的概念與和Core Image中的自定義核矩陣有著很好的對應(yīng)库快,盡管它們在語法上有一些不同摸袁。
什么是著色器
在OpenGL ES 中你必須創(chuàng)建兩種著色器“頂點著色器(vertex shaders)和片段著色器(fragment shaders)。這兩種著色器是一個完整程序的兩半义屏,你不能僅僅創(chuàng)建其中任何一個靠汁;想創(chuàng)建一個完整的著色程序,兩個都是必須存在的闽铐。
頂點著色器定義了在2D或者3D場景中幾何圖形是如何處理的蝶怔。一個頂點指的是2D或者3D空間中的一個點。在圖像處理中阳啥,有四個頂點:每一個頂點代表圖像的一個角添谊。頂點著色器設(shè)置頂點的位置,并且把位置和紋理坐標(biāo)這樣的參數(shù)發(fā)送到片段著色器察迟。
然后GPU使用片段著色器在對象或者說圖片的每一個像素上進(jìn)行計算斩狱,最終計算出每個像素的最終顏色耳高。圖片,歸根結(jié)底所踊,實際上僅僅是數(shù)據(jù)的集合泌枪。圖片的文檔包含每一個像素的各個顏色分量和像素透明度的值。因為對每一個像素秕岛,算式是相同的碌燕,GPU可以流水線作業(yè)這個過程,從而更加有效的進(jìn)行處理继薛。使用正確優(yōu)化過的著色器修壕,在GPU上進(jìn)行處理,將使你獲得百倍于在CPU上用同樣的過程進(jìn)行圖像處理的效率遏考。
http://www.bkjia.com/IOSjc/1089406.html
類型說明
然后源碼里面一堆的變量類型就夠我無從下眼了慈鸠,這是神馬神馬呢?于是開始一點點的啃灌具,下面就來學(xué)學(xué)基本類型吧青团。
首先參考這篇文章
http://blog.csdn.net/hgl868/article/details/7846269
- 基本數(shù)據(jù)類型
Type(類型) | 中文意思 | Meaning |
---|---|---|
void | 沒有返回值或空參數(shù)列表的函數(shù) | for functions that do not return a value or for an empty parameter list |
bool | 一種有條件的類型,取真或假的值咖楣。 | a conditional type,taking on values of true or false |
int | 一個有符號整數(shù) | a signed integer |
float | 單浮點數(shù)標(biāo)量 | a single floating-point scalar |
vec2 | 雙分量浮點向量 | a two component floating-point vector |
vec3 | 三分量浮點向量 | a three component floating-point vector |
vec4 | 四分量浮點向量 | a four component floating-point vector |
bvec2 | 雙分量布爾向量 | a tow component Boolean vector |
bvec3 | 三分量布爾向量 | a three component Boolean vector |
bvec4 | 四分量布爾向量 | a four component Boolean vector |
ivec2 | 雙分量整數(shù)向量 | a tow component integer vector |
ivec3 | 三分量整數(shù)向量 | a three component integer vector |
ivec4 | 四分量整數(shù)向量 | a four component integer vector |
mat2 | 2x2 浮點矩陣 | a 2x2 floating-point matrix |
mat3 | 3x3浮點矩陣 | a 3x3 floating-point matrix |
mat4 | 4x4浮點矩陣 | a 4x4 floating-point matrix |
sampler2D | 用于訪問2D紋理的句柄 | a handle for accessing a 2D texture |
samplerCube | 訪問立方體映射紋理的句柄 | a handle for accessing a cube mapped texture |
- 存儲修飾符
Qualifier | 中文意思 | Meaning |
---|---|---|
<none:default> | 本地讀/寫內(nèi)存督笆,或函數(shù)的輸入?yún)?shù) | local read/write memory, or an input parameter to a function |
const | 常數(shù),或只讀的函數(shù)參數(shù)诱贿。 | a complied-time constant, or a function parameter that is read-only |
attribute | 頂點著色器與每個頂點數(shù)據(jù)的OpenGL ES之間的鏈接 | linkage between a vertex shader and OpenGL ES for per-vertex data |
uniform | 值不會隨著原始進(jìn)程的變化而變化娃肿,制服構(gòu)成著色器、OpenGL ES和應(yīng)用程序之間的鏈接瘪松。 | value does not change across the primitive being progressed, uniforms form the linkage between a shader,OpenGL ES,and the application |
varying | 用于插值數(shù)據(jù)的頂點著色器和片段著色器之間的鏈接 | linkage between a vertex shader and a fragment shader for interpolated data |
- 精度修飾符
Qualifier | 中文意思 | Meaning |
---|---|---|
highp | 滿足上面所描述的頂點語言的最低要求咸作。 | Satisfies the minimum requirements for the vertex language discribed above.Optional in the fragment language |
mediump | 滿足最低要求以上的片段的語言。它的射程和精度必須大于或小于或在lowP提供同時提供相同highp | Satisfies the minimum requirements ablove for the fragment language.It's range and precision has to be greater than or the same as provided by lowp and less than or the same as provided by highp. |
lowp | 范圍和精度可以小于中等宵睦,但仍然打算代表任何顏色通道的所有顏色值记罚。 | Range and precision that can be less than medium,but still intended to represent all color values for any color channel |
- 在頂點語言中有如下預(yù)定義的全局默認(rèn)精度語句:
precision highp float;
precision highp int;
precision lowp sampler2D;
precision lowp samplerCube;
- 在片元語言中有如下預(yù)定義的全局默認(rèn)精度語句:
precision mediump int;
precision lowp sampler2D;
precision lowp samplerCube;
GPUImage中引用的文件說明
/*? output為輸出源
? intput為輸入源
? filter為濾鏡
*/
// Base classes
#import "GPUImageContext.h" //是GPUImage對OpenGL ES上下文的封裝,添加了GPUImage相關(guān)的上下文壳嚎,比如說Program的使用緩存桐智,處理隊列,CV紋理緩存等
#import "GPUImageOutput.h" //輸出
#import "GPUImageView.h" //GPUImageView是響應(yīng)鏈的終點烟馅,一般用于顯示GPUImage的圖像
#import "GPUImageVideoCamera.h" //攝像頭-視頻流
#import "GPUImageStillCamera.h" //攝像頭-照相
#import "GPUImageMovie.h" //視頻
#import "GPUImagePicture.h" //圖片
#import "GPUImageRawDataInput.h" //原始數(shù)據(jù)輸入
#import "GPUImageRawDataOutput.h" //原始數(shù)據(jù)輸出
#import "GPUImageMovieWriter.h" //電影制作
#import "GPUImageFilterPipeline.h" //濾鏡管道
#import "GPUImageTextureOutput.h" //紋理輸出
#import "GPUImageFilterGroup.h" //濾鏡組合
#import "GPUImageTextureInput.h" //紋理輸入
#import "GPUImageUIElement.h" //UI元素
#import "GPUImageBuffer.h" //緩存
#import "GPUImageFramebuffer.h" //管理紋理緩存格式说庭、幀緩存的buffer
#import "GPUImageFramebufferCache.h" //幀緩存池
// Filters
#import "GPUImageFilter.h" //GPUImage的濾鏡的基類
#import "GPUImageTwoInputFilter.h" //對兩個輸入紋理進(jìn)行通用的處理.兩個輸入紋理默認(rèn)為inputImageTexture和inputImageTexture2。
#import "GPUImagePixellateFilter.h" //像素化濾鏡
#import "GPUImagePixellatePositionFilter.h" //像素化位置濾鏡
#import "GPUImageSepiaFilter.h" //褐色(懷舊)
#import "GPUImageColorInvertFilter.h" //反色
#import "GPUImageSaturationFilter.h" //飽和度
#import "GPUImageContrastFilter.h" //對比度
#import "GPUImageExposureFilter.h" //曝光
#import "GPUImageBrightnessFilter.h" //亮度
#import "GPUImageLevelsFilter.h" //色階
#import "GPUImageSharpenFilter.h" //銳化
#import "GPUImageGammaFilter.h" //伽馬線
#import "GPUImageSobelEdgeDetectionFilter.h"http://Sobel邊緣檢測算法(白邊郑趁,黑內(nèi)容刊驴,有點漫畫的反色效果)
#import "GPUImageSketchFilter.h" //素描
#import "GPUImageToonFilter.h" //卡通效果(黑色粗線描邊)
#import "GPUImageSmoothToonFilter.h" //相比上面的效果更細(xì)膩,上面是粗曠的畫風(fēng)
#import "GPUImageMultiplyBlendFilter.h" //通常用于創(chuàng)建陰影和深度效果
#import "GPUImageDissolveBlendFilter.h" //溶解
#import "GPUImageKuwaharaFilter.h" //桑原(Kuwahara)濾波,水粉畫的模糊效果;處理時間比較長捆憎,慎用
#import "GPUImageKuwaharaRadius3Filter.h"
#import "GPUImageVignetteFilter.h" //暈影舅柜,形成黑色圓形邊緣,突出中間圖像的效果
#import "GPUImageGaussianBlurFilter.h" //高斯模糊
#import "GPUImageGaussianBlurPositionFilter.h" //高斯模糊位置
#import "GPUImageGaussianSelectiveBlurFilter.h"http://高斯模糊躲惰,選擇部分清晰
#import "GPUImageOverlayBlendFilter.h" //疊加,通常用于創(chuàng)建陰影效果
#import "GPUImageDarkenBlendFilter.h" //加深混合,通常用于重疊類型
#import "GPUImageLightenBlendFilter.h" //減淡混合,通常用于重疊類型
#import "GPUImageSwirlFilter.h" //漩渦致份,中間形成卷曲的畫面
#import "GPUImageSourceOverBlendFilter.h" //源混合
#import "GPUImageColorBurnBlendFilter.h" //色彩加深混合
#import "GPUImageColorDodgeBlendFilter.h" //色彩減淡混合
#import "GPUImageScreenBlendFilter.h" //屏幕包裹,通常用于創(chuàng)建亮點和鏡頭眩光
#import "GPUImageExclusionBlendFilter.h" //排除混合
#import "GPUImageDifferenceBlendFilter.h" //差異混合,通常用于創(chuàng)建更多變動的顏色
#import "GPUImageSubtractBlendFilter.h" //差值混合,通常用于創(chuàng)建兩個圖像之間的動畫變暗模糊效果
#import "GPUImageHardLightBlendFilter.h" //強光混合,通常用于創(chuàng)建陰影效果
#import "GPUImageSoftLightBlendFilter.h" //柔光混合
#import "GPUImageColorBlendFilter.h" //顏色混合
#import "GPUImageHueBlendFilter.h" //色彩混合
#import "GPUImageSaturationBlendFilter.h" //飽和度混合
#import "GPUImageLuminosityBlendFilter.h" //光度混合
#import "GPUImageCropFilter.h" //剪裁
#import "GPUImageGrayscaleFilter.h" //灰度
#import "GPUImageTransformFilter.h" //形狀變化
#import "GPUImageChromaKeyBlendFilter.h" //色度鍵混合
#import "GPUImageHazeFilter.h" //朦朧加暗
#import "GPUImageLuminanceThresholdFilter.h" //亮度閾
#import "GPUImagePosterizeFilter.h" //色調(diào)分離,形成噪點效果
#import "GPUImageBoxBlurFilter.h" //盒狀模糊
#import "GPUImageAdaptiveThresholdFilter.h" //自適應(yīng)閾值
#import "GPUImageUnsharpMaskFilter.h" //反遮罩銳化
#import "GPUImageBulgeDistortionFilter.h" //凸起失真础拨,魚眼效果
#import "GPUImagePinchDistortionFilter.h" //收縮失真氮块,凹面鏡
#import "GPUImageCrosshatchFilter.h" //交叉線陰影,形成黑白網(wǎng)狀畫面
#import "GPUImageCGAColorspaceFilter.h" //CGA色彩濾鏡诡宗,形成黑滔蝉、淺藍(lán)、紫色塊的畫面
#import "GPUImagePolarPixellateFilter.h" //同心圓像素化
#import "GPUImageStretchDistortionFilter.h" //伸展失真僚焦,哈哈鏡
#import "GPUImagePerlinNoiseFilter.h" //柏林噪點锰提,花邊噪點
#import "GPUImageJFAVoronoiFilter.h"
#import "GPUImageVoronoiConsumerFilter.h"
#import "GPUImageMosaicFilter.h" //黑白馬賽克
#import "GPUImageTiltShiftFilter.h" //條紋模糊曙痘,中間清晰芳悲,上下兩端模糊
#import "GPUImage3x3ConvolutionFilter.h" //3x3卷積,高亮大色塊變黑边坤,加亮邊緣名扛、線條等
#import "GPUImageEmbossFilter.h" //浮雕效果,帶有點3d的感覺
#import "GPUImageCannyEdgeDetectionFilter.h" //Canny邊緣檢測算法(比上更強烈的黑白對比度)
#import "GPUImageThresholdEdgeDetectionFilter.h"http://閾值邊緣檢測(效果與上差別不大)
#import "GPUImageMaskFilter.h" //遮罩混合
#import "GPUImageHistogramFilter.h" //色彩直方圖茧痒,顯示在圖片上
#import "GPUImageHistogramGenerator.h" //色彩直方圖
#import "GPUImageHistogramEqualizationFilter.h"
#import "GPUImagePrewittEdgeDetectionFilter.h" //普瑞維特(Prewitt)邊緣檢測(效果與Sobel差不多肮韧,貌似更平滑
#import "GPUImageXYDerivativeFilter.h" //XYDerivative邊緣檢測,畫面以藍(lán)色為主旺订,綠色為邊緣弄企,帶彩色
#import "GPUImageHarrisCornerDetectionFilter.h" //Harris角點檢測,會有綠色小十字顯示在圖片角點處
#import "GPUImageAlphaBlendFilter.h" //透明混合,通常用于在背景上應(yīng)用前景的透明度
#import "GPUImageNormalBlendFilter.h" //正常
#import "GPUImageNonMaximumSuppressionFilter.h" //非最大抑制区拳,只顯示亮度最高的像素拘领,其他為黑
#import "GPUImageRGBFilter.h" //RGB
#import "GPUImageMedianFilter.h" //中間值,有種稍微模糊邊緣的效果
#import "GPUImageBilateralFilter.h" //雙邊模糊
#import "GPUImageCrosshairGenerator.h" //十字
#import "GPUImageToneCurveFilter.h" //色調(diào)曲線
#import "GPUImageNobleCornerDetectionFilter.h" //Noble角點檢測樱调,檢測點更多
#import "GPUImageShiTomasiFeatureDetectionFilter.h"http://ShiTomasi角點檢測约素,與上差別不大
#import "GPUImageErosionFilter.h" //侵蝕邊緣模糊,變黑白
#import "GPUImageRGBErosionFilter.h" //RGB侵蝕邊緣模糊笆凌,有色彩
#import "GPUImageDilationFilter.h" //擴展邊緣模糊圣猎,變黑白
#import "GPUImageRGBDilationFilter.h" //RGB擴展邊緣模糊,有色彩
#import "GPUImageOpeningFilter.h" //黑白色調(diào)模糊
#import "GPUImageRGBOpeningFilter.h" //彩色模糊
#import "GPUImageClosingFilter.h" //黑白色調(diào)模糊乞而,暗色會被提亮
#import "GPUImageRGBClosingFilter.h" //彩色模糊送悔,暗色會被提亮
#import "GPUImageColorPackingFilter.h" //色彩丟失,模糊(類似監(jiān)控攝像效果)
#import "GPUImageSphereRefractionFilter.h" //球形折射,圖形倒立
#import "GPUImageMonochromeFilter.h" //單色
#import "GPUImageOpacityFilter.h" //不透明度
#import "GPUImageHighlightShadowFilter.h" //提亮陰影
#import "GPUImageFalseColorFilter.h" //色彩替換(替換亮部和暗部色彩)
#import "GPUImageHSBFilter.h"
#import "GPUImageHueFilter.h" //色度
#import "GPUImageGlassSphereFilter.h" //水晶球效果
#import "GPUImageLookupFilter.h" //lookup 色彩調(diào)整
#import "GPUImageAmatorkaFilter.h" //Amatorka lookup
#import "GPUImageMissEtikateFilter.h" //MissEtikate lookup
#import "GPUImageSoftEleganceFilter.h" //SoftElegance lookup
#import "GPUImageAddBlendFilter.h" //通常用于創(chuàng)建兩個圖像之間的動畫變亮模糊效果
#import "GPUImageDivideBlendFilter.h" //通常用于創(chuàng)建兩個圖像之間的動畫變暗模糊效果
#import "GPUImagePolkaDotFilter.h" //像素圓點花樣
#import "GPUImageLocalBinaryPatternFilter.h" //圖像黑白化欠啤,并有大量噪點
#import "GPUImageLanczosResamplingFilter.h" //Lanczos重取樣鳍怨,模糊效果
#import "GPUImageAverageColor.h" //像素平均色值
#import "GPUImageSolidColorGenerator.h" //純色
#import "GPUImageLuminosity.h" //亮度平均
#import "GPUImageAverageLuminanceThresholdFilter.h"http://像素色值亮度平均,圖像黑白(有類似漫畫效果)
#import "GPUImageWhiteBalanceFilter.h" //白平橫
#import "GPUImageChromaKeyFilter.h" //色度鍵
#import "GPUImageLowPassFilter.h" //用于圖像加亮
#import "GPUImageHighPassFilter.h" //圖像低于某值時顯示為黑
#import "GPUImageMotionDetector.h" //動作檢測
#import "GPUImageHalftoneFilter.h" //點染,圖像黑白化跪妥,由黑點構(gòu)成原圖的大致圖形
#import "GPUImageThresholdedNonMaximumSuppressionFilter.h"http://與上相比鞋喇,像素丟失更多
#import "GPUImageHoughTransformLineDetector.h" //線條檢測
#import "GPUImageParallelCoordinateLineTransformFilter.h" //平行線檢測
#import "GPUImageThresholdSketchFilter.h" //閥值素描,形成有噪點的素描
#import "GPUImageLineGenerator.h" //線條
#import "GPUImageLinearBurnBlendFilter.h" //線性加深混合
#import "GPUImageGaussianBlurPositionFilter.h" //高斯模糊狀態(tài)
#import "GPUImagePixellatePositionFilter.h" //像素化狀態(tài)
#import "GPUImageTwoInputCrossTextureSamplingFilter.h" //兩個輸入交叉紋理采樣
#import "GPUImagePoissonBlendFilter.h" //泊松混合
#import "GPUImageMotionBlurFilter.h" //運動模糊
#import "GPUImageZoomBlurFilter.h" //放大模糊
#import "GPUImageLaplacianFilter.h" //算子
#import "GPUImageiOSBlurFilter.h" //iOS模糊
#import "GPUImageLuminanceRangeFilter.h" //亮度范圍
#import "GPUImageDirectionalNonMaximumSuppressionFilter.h" //定向非極大值抑制
#import "GPUImageDirectionalSobelEdgeDetectionFilter.h" //定向邊界檢測
#import "GPUImageSingleComponentGaussianBlurFilter.h" //單個組件高斯模糊
#import "GPUImageThreeInputFilter.h" //GPUImageThreeInputFilter的邏輯與GPUImageTwoInputFilter類似眉撵,增加了thirdInputFramebuffer作為第三個紋理inputImageTexture3的輸入
#import "GPUImageWeakPixelInclusionFilter.h" //弱像素化
好了侦香,今天先學(xué)到這里。從一臉懵逼到初步了解纽疟。第一階段先把一些基礎(chǔ)的概念弄明白罐韩,后面再做原理分析和源碼分析