OpenGLES下进行渲染

OpenGLES下进行滤镜的渲染可以提高效率。

如果需要实时查看多个滤镜动态渲染的效果,使用OpenGLES是一个好的选择


@interface ViewController ()

@property (nonatomic, strong) GLKView   *glkView; // 渲染用的buffer视图

@property (nonatomic, strong) CIFilter  *filter;
@property (nonatomic, strong) CIImage   *ciImage;
@property (nonatomic, strong) CIContext *ciContext;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *showImage = [UIImage imageNamed:@"demo"];
    CGRect  rect       = CGRectMake(0, 0, showImage.size.width, showImage.size.height);
    
    // 获取OpenGLES渲染的上下文
    EAGLContext *eagContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    
    // 创建出渲染的buffer
    _glkView = [[GLKView alloc] initWithFrame:rect
                                      context:eagContext];
    [_glkView bindDrawable];
    [self.view addSubview:_glkView];
    
    // 创建出CoreImage用的上下文
    _ciContext = [CIContext contextWithEAGLContext:eagContext
                                           options:@{kCIContextWorkingColorSpace : [NSNull null]}];
    
    // CoreImage相关设置
    _ciImage = [[CIImage alloc] initWithImage:showImage];
    
    _filter = [CIFilter filterWithName:@"CISepiaTone"];
    
    [_filter setValue:_ciImage forKey:kCIInputImageKey];
    [_filter setValue:@(0) forKey:kCIInputIntensityKey];
    
    // 开始渲染
    [_ciContext drawImage:[_filter outputImage]
                   inRect:CGRectMake(0, 0, _glkView.drawableWidth, _glkView.drawableHeight)
                 fromRect:[_ciImage extent]];
    [_glkView display];
    
    // 动态渲染
    UISlider *slider    = [[UISlider alloc] initWithFrame:CGRectMake(0, 400, 320, 20)];
    slider.minimumValue = 0.f;
    slider.maximumValue = 1.f;
    [slider addTarget:self action:@selector(sliderEvent:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:slider];
}

- (void)sliderEvent:(UISlider *)slider {
    [_filter setValue:_ciImage forKey:kCIInputImageKey];
    [_filter setValue:@(slider.value)
               forKey:kCIInputIntensityKey];
    
    // 开始渲染
    [_ciContext drawImage:[_filter outputImage]
                   inRect:CGRectMake(0, 0, _glkView.drawableWidth, _glkView.drawableHeight)
                 fromRect:[_ciImage extent]];
    [_glkView display];
}

@end



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值