(ios实时滤镜.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(ios实时滤镜

iOS编程高性能之路-GPU着色器实现实时滤镜作为智能机照相和摄像功能无疑是其重要的功能,从比较早期使用实时滤镜的path到后期迎头赶上的instagram,他们出彩了滤镜效果和流畅的性能无疑给软件增色不少,而其中最大的功臣就要归功于opengles 2.x之后引入的着色器了。滤镜原理其实滤镜归根到底就是在照相时,取得每一帧,将取到的这一帧数据的首地址取出,我们就获得了访问每一个像素点的能力,然后在对每个点根据相应的算法来进行变化,就可以得到我们想要的一些效果如何取得视频数据?取得照相时的图片数据 加入Framework AVFoundation_session = [[AVCaptureSession alloc] init];_videoOutput = [[[AVCaptureVideoDataOutput alloc] init] autorelease];if ([_session canAddOutput:_videoOutput]) {[_session addOutput:_videoOutput];}dispatch_queue_t videoCaptureQueue = dispatch_queue_create(video_capture_queue_,DISPATCH_QUEUE_SERIAL);[_videoOutput setSampleBufferDelegate:self queue:videoCaptureQueue];[_session startRunning];在session start之后我们就可以通过回调 来得到 sbuf- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{...OSStatus err = CMBufferQueueEnqueue(previewBufferQueue, sampleBuffer);if ( !err ) { dispatch_async(dispatch_get_main_queue(), ^{CMSampleBufferRef sbuf = (CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);});}...}拿到sbuf之后 我们就可以通过以下的方法来获取图片的首地址CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);CVPixelBufferLockBaseAddress( pixelBuffer, 0 );int len = CVPixelBufferGetDataSize(pixelBuffer);UInt8 *pixel = (UInt8 *)CVPixelBufferGetBaseAddress(pixelBuffer); _render(pixel,len) //滤镜函数这样其实就可以简单的实现照相时候的实时滤镜,当然作为高性能的标题,肯定实现不会这么简单,大家可以尝试一下这个方法的效果,我之前尝试的时候原本60帧左右的摄像,对rgb某个单通道操作影响不大,但是一旦操作到三个通道,降帧就很明显,更不用说在摄像时同时还要录音了。这时我们要解决这个问题就需要我们下一节来认识着色器。认识着色器 用过opengl的同学对着色器应该不会陌生,但对与iOS终端设备的开发者,对于图形图像有着深入了解的人不多,本人也只是个初学者,对于opengl es 2.x才引入的着色器也是初步认识,WWDC的专题讲座有一节就是讲opengl es的新特性的 结合AVFoundation那一节我们还是可以学到不少东西的。opengl es的着色器 有.fsh和.vsh两个文件 这两个文件在被编译和链接后就可以产生可执行程序与GPU交互.vsh 是顶点shader 用与顶点计算 可以理解控制顶点的位置在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标例如attribute vec4 position; attribute vec4 inputTextureCoordinate;varying vec2 textureCoordinate;precision mediump float;uniform float overTurn;void main(){gl_Position = position;if (overTurn

文档评论(0)

lisuf331 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档