Skip to content

Luyakus/LGLKit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LGLKit

OpenGL面向对象封装, 支持 iOS/MacOS, MacOS 下需要安装 glfw, 持续改进中...

简单的渲染代码

static NSString *vertexShaderString(void) {
    NSString *path = @"/Volumes/Sam/音视频/opengl/opengl-lesson-review/opengl-lesson-review/cube/cube_vert.glsl";
    NSString *src = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    return src;
}

static NSString *fragmentShaderString(void) {
    NSString *path = @"/Volumes/Sam/音视频/opengl/opengl-lesson-review/opengl-lesson-review/cube/cube_frag.glsl";
    NSString *src = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    return src;
}

+ (void)test {
    LGWindow *w = [[LGWindow alloc] initWithSize:CGSizeMake(600, 600) title:@"cube"];
    w.rgba = 0x172749ff;
    w.mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
    
    LGVertexArrayObject *vao = [[LGVertexArrayObject alloc] init];
    LGVertexBufferObject *vbo = [[LGVertexBufferObject alloc]
                                 initWithVertexArray:LGLfloatArrayPack(vertexes, sizeof(vertexes)/sizeof(float))
                                 lineWidth:@[@3, @2]];
    [vao addVertexBufferObject:vbo];
    
    LGVertexShader *vs = [[LGVertexShader alloc] initWithString:vertexShaderString()];
    LGFragmentShader *fs = [[LGFragmentShader alloc] initWithString:fragmentShaderString()];
    LGProgram *program = [[LGProgram alloc] initWithVertexShader:vs fragmentShader:fs];
    
    LGTexture *t = [[LGTexture alloc] initWithPath:@"/Volumes/Sam/音视频/opengl/opengl-lesson-review/opengl-lesson-review/abc.png"];
    [program setShaderVariable:^(GLuint prog) {
        glUniform1i(glGetUniformLocation(prog, "texture1"), 0);
        t.textureUnit = 0;
    }];
    
    [w render:^{
        [program use];
        [program activeTextures:@[t]];
        [vao draw];
    }];
}

基于封装实现的一个 gpuimage , 可以多个滤镜叠加

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    UIImage *i = [UIImage imageNamed:@"cap"];
    UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 200)];
    v.image = i;
    [self.view addSubview:v];
    EAGLContext  *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
    LGProcessor *p = [[LGProcessor alloc] initWithContext:context];
    
    NSString *f1Shader = @"#version 300 es\
                            precision mediump float;\
                            uniform sampler2D texture1;\
                            in vec2 texcoord;\
                            out vec4 fragColor;\
                            const float step_size = 0.01;\
                            void main() {\
                                fragColor = texture(texture1, vec2(floor(texcoord.x/step_size) * step_size, floor(texcoord.y/step_size) * step_size));\
                            }";
    LGFilter *f1 = [[LGFilter alloc] initWithFragmentShader:f1Shader];
    
    NSString *f2Shader = @"#version 300 es\
                           precision mediump float;\
                           uniform sampler2D texture1;\
                           in vec2 texcoord;\
                           out vec4 fragColor;\
                           const float ud = 80.0;\
                           void main() {\
                               float radius = 0.2;\
                               vec2 origin = vec2(0.5, 0.5);\
                               vec2 xy = texcoord;\
                               vec2 dxy = xy - origin;\
                               float dst = length(dxy);\
                               float angle = atan(dxy.x, dxy.y) + radians(ud) * (1.0 - (dst/radius) * (dst/radius));\
                               if (dst <= radius) {\
                                   xy = vec2(radius, radius) + dst * vec2(cos(angle), sin(angle));\
                               }\
                               fragColor = texture(texture1, xy);\
                           }";
    LGFilter *f2 =  [[LGFilter alloc] initWithFragmentShader:f2Shader];
    
    [p addFilter:f1];
    [p addFilter:f2];
    UIImage *i1 = [UIImage imageNamed:@"cap"];
    i1 = [p processImage:i1];

    UIImageView *v1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 350, self.view.frame.size.width, 200)];
    v1.image = i1;
    [self.view addSubview:v1];

}

马赛克 + 旋转滤镜