今天来学习一下一个简单滤镜使用的流程,经过调节亮度滤镜来了解。先将GPUImage库导入到项目中,引入头文件"GPUImage.h"数组
1、建立亮度滤镜对象ide
GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init],通过alloc init以后,程序为咱们建立了顶点数组以及帧缓冲区,纹理,并绑定为当前使用的对象。学习
1.为顶点着色添加属性this
首先咱们来看一该滤镜的顶点着色器字符串spa
attribute vec4 position; attribute vec4 inputTextureCoordinate; varying vec2 textureCoordinate; void main() { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; }
咱们了解到该顶点有2个须要添加的属性position,inputTextureCoordinate.咱们须要在程序中添加这2个属性,经过下列方法来添加code
- (void)initializeAttributes; { [filterProgram addAttribute:@"position"]; [filterProgram addAttribute:@"inputTextureCoordinate"]; // Override this, calling back to this super method, in order to add new attributes to your vertex shader }
2.片断着色提供uniform
varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; uniform lowp float brightness; void main() { lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w); }
brightnessUniform = [filterProgram uniformIndex:@"brightness"]orm
filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]对象
3.启用顶点数组blog
glEnableVertexAttribArray(filterPositionAttribute);ip
glEnableVertexAttribArray(filterTextureCoordinateAttribute)
4.建立纹理
- (void)generateTexture; { glActiveTexture(GL_TEXTURE1); glGenTextures(1, &_texture); glBindTexture(GL_TEXTURE_2D, _texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _textureOptions.minFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _textureOptions.magFilter); // This is necessary for non-power-of-two textures glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); // TODO: Handle mipmaps }
5.建立帧缓冲区
glGenFramebuffers(1, &framebuffer)
6.帧缓冲绑定纹理
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0);
2、设置亮度值
filter.brightness = value
3、设置纹理尺寸
[filter forceProcessingAtSize:image.size]
4、建立GPUImagePicture对象
GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image]
5、向建立好的GPUImagePicture对象添加target
六,处理图像
[pic processImage]
进行图像渲染并绘制
glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha);
glClear(GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]);
glUniform1i(filterInputTextureUniform, 2); glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices); glVertexAttribPointer(filterTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
7、[filter useNextFrameForImageCapture]
8、获取处理后的图像
image = [filter imageFromCurrentFramebuffer]
GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init]; filter.brightness = value; [filter forceProcessingAtSize:image.size]; GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image]; [pic addTarget:filter]; [pic processImage]; [filter useNextFrameForImageCapture]; image = [filter imageFromCurrentFramebuffer];