• GPUImage简单滤镜使用(一)


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

         一、创建亮度滤镜对象

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

      1.为顶点着色添加属性

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

     attribute vec4 position;
     attribute vec4 inputTextureCoordinate;
     
     varying vec2 textureCoordinate;
     
     void main()
     {
         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 lowp float brightness;
     
     void main()
     {
         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 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);

    
    
    

       二、设置亮度值

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

      

  • 相关阅读:
    C++中析构函数为什么要是虚函数
    依赖注入(IOC)
    ParseInt()与NaN()
    仿windows关机效果
    类似Tab的效果
    飞来飞去的广告
    Sql Server 三种连接
    JS日期处理
    绚丽的注册效果
    JS图片自动切换
  • 原文地址:https://www.cnblogs.com/salam/p/4980992.html
Copyright © 2020-2023  润新知