GPUImage简单滤镜使用(一)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

今天来学习一下一个简单滤镜使用的流程,通过调节亮度滤镜来了解。先将GPUImage库导入到项目中,引入头文件"GPUImage.h"

一、创建亮度滤镜对象

GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init],经过alloc init之后,程序为我们创建了顶点数组以及帧缓冲区,纹理,并绑定为当前使用的对象。

1.为顶点着色添加属性

首先我们来看一该滤镜的顶点着色器字符串

attribute vec4 position;

attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;voidmain()

{

gl_Position=position;

textureCoordinate=inputTextureCoordinate.xy;

}

我们了解到该顶点有2个需要添加的属性position,inputTextureCoordinate.我们需要在程序中添加这2个属性,通过下列方法来添加

- (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 lowpfloat

brightness;voidmain()

{

lowp vec4 textureColor=texture2D(inputImageTexture, textureCoordinate);

gl_FragColor= vec4((textureColor.rgb +vec3(brightness)), textureColor.w);

}

brightnessUniform = [filterProgram uniformIndex:@"brightness"]

filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]

3.启用顶点数组

glEnableVertexAttribArray(filterPositionAttribute);

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 texturesglTexParameteri(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);

二、设置亮度值

filter.brightness = value

三、设置纹理尺寸

[filter forceProcessingAtSize:image.size]

四、创建GPUImagePicture对象

GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image]

五、向创建好的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);

七、[filter useNextFrameForImageCapture]

八、获取处理后的图像

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];

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航