• OpenGL2 CoreImage初探与Model封装


    首先OpenGL2框架的使用需要  

    #import <GLKit/GLKit.h>

    OpenGL 调用的是GPU,而不是CPU所以,在不断改变属性的时候不会出现卡顿。

    大概的调用方法分为 :

    //    1.首先GLK 需要一个渲染环境 先创建一个EAGLContext渲染环境, GLKView 初始化的时候需要使用

    //    2.初始化 GLKView 对象,将GLKView绑定并且添加到View

    //    3.GLKView中渲染是通过 CIContext  CIContext drawImage inRect fromRect

    //    4.最后通过GLKView展现出来 [mglkView display];

    然后代码: 这是写在Model里的代码,因为在Model里无法直接获取View,所以需要通过 UIApplication 获取到当前的View

    -(void)openGLCreateGLKViewWithImage:(UIImage *)image FilterName:(NSString *)filterName Rect:(CGRect)rect
    {
        // 获取当前的View
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        if(window.windowLevel != UIWindowLevelNormal)
        {
            NSArray *windows = [[UIApplication sharedApplication] windows];
            for(UIWindow *tmpWin in windows)
            {
                if(tmpWin.windowLevel == UIWindowLevelNormal)
                {
                    window = tmpWin;
                    break;
                }
            }
        }
        
        NSArray *viewsArray = [window subviews];
        UIView *frontView;
        if ([viewsArray count]>0) {
            frontView = [viewsArray objectAtIndex:0];
        }
        
        mrect = rect;
        EAGLContext *ueaglContext = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]; // 首先是渲染环境
        
        mglkView = [[GLKView alloc]initWithFrame:rect context:ueaglContext];
        [mglkView bindDrawable]; // 绑定 mglkView
        if (frontView) {
            [frontView addSubview:mglkView]; // 将GLKView的对象添加到当前View里面
        }
        
        mcontext = [CIContext contextWithEAGLContext:ueaglContext options:@{kCIContextWorkingColorSpace :[NSNull null]}];
        mimage = [[CIImage alloc]initWithImage:image];
        mfilter = [CIFilter filterWithName:filterName];
    }
    

    上面是初始化对象的代码, 然后下面的方法是给对象设置属性

    -(void)openGLdrawImageWithValue:(CGFloat)value key:(NSString *)keyName
    {
        [mfilter setValue:@(value) forKey:keyName]; //keyName 可以通过 NSlog(mfilter.attributes) 查询  设置
        [mfilter setValue:mimage forKey:kCIInputImageKey];    // 设置滤镜的输入CIImage CIFilter的图片输入格式是 CIImage
        [mcontext drawImage:[mfilter valueForKey:kCIOutputImageKey]
                     inRect:CGRectMake(0, 0, mglkView.drawableWidth, mglkView.drawableHeight)
                   fromRect:[mimage extent]];    // 通过 CIContext绘制,将图片展现在GLKView的对象中
        [mglkView display]; // 最后 display
    }
    

      

  • 相关阅读:
    使用EFCore连接现有数据库
    C#面试题总结
    xamarin学习--发布apk安装包
    xamarin学习--导航参数注意事项
    centos8 安装 gitlab
    mvc添加全局过滤器
    Windows平台查看端口占用情况
    asp.net core cli---创建一个不启用https的项目
    asp.net core cli
    启动nuxt项目报错WARN node unsupported "node@v8.9.3" is incompatible with chalk@^4.1.0, expec...
  • 原文地址:https://www.cnblogs.com/stuwan/p/4986307.html
Copyright © 2020-2023  润新知