GPUImage源码解读(二)

这篇文章主要是阅读GPUImage框架中的 GLProgram、GPUImageContext 两个重要类的源码。这两个类是 GPUImage 框架的基础,里面涉及的知识也有 OpenGL ES 基础 和 多线程 基础。以下是源码内容:

GLProgram

一 GLProgram

GLProgram专门处理OpenGL ES程序的创建等相关工作。

  • 初始化方法,可以根据需要传入顶点着色器的路径或字符串以及片源着色器的路径及字符串进行初始化。

- (id)initWithVertexShaderString:(NSString *)vShaderString
            fragmentShaderString:(NSString *)fShaderString;
- (id)initWithVertexShaderString:(NSString *)vShaderString
          fragmentShaderFilename:(NSString *)fShaderFilename;
- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename
            fragmentShaderFilename:(NSString *)fShaderFilename;

初始化的过程包含了顶点片源着色器的创建、编译,着色器程序的创建,顶点片源着色器附着到着色器程序等过程。以文件初始化方式最后都会调用 initWithVertexShaderString:fragmentShaderString: 字符串的初始化方式,

- (id)initWithVertexShaderString:(NSString *)vShaderString
            fragmentShaderString:(NSString *)fShaderString;
{
    if ((self = [super init]))
    {
        _initialized = NO;

        // 初始化属性数组
        attributes = [[NSMutableArray alloc] init];
        // 初始化uniform属性数组
        uniforms = [[NSMutableArray alloc] init];

        // 创建着色器程序
        program = glCreateProgram();

        // 编译顶点着色器
        if (![self compileShader:&vertShader
                            type:GL_VERTEX_SHADER
                          string:vShaderString])
        {
            NSLog(@"Failed to compile vertex shader");
        }

        // 编译片源着色器
        // Create and compile fragment shader
        if (![self compileShader:&fragShader
                            type:GL_FRAGMENT_SHADER
                          string:fShaderString])
        {
            NSLog(@"Failed to compile fragment shader");
        }

        // 将顶点片源着色器附着到着色器程序
        glAttachShader(program, vertShader);
        glAttachShader(program, fragShader);
    }

    return self;
}
  • 在给着色器传值的时候,我们需要获取相关属性的位置。GLProgram也提供了相关接口,方便我们获取变量的位置。.h 中定义如下:

具体实现:

  • 链接程序,和编译型语言一样,OpenGL程序也需要链接。

  • 使用着色器程序

  • log 信息 都会调用内部方法 logForOpenGLObject, 在连接阶段使用glGetProgramInfoLog获取连接错误

  • 释放资源。在析构的时候,将着色器等相关资源清理。

Last updated