码迷,mamicode.com
首页 > 移动开发 > 详细

iOS-----openGL--openGL ES iOS 入门篇4---> 离屏渲染

时间:2017-03-23 14:08:43      阅读:975      评论:0      收藏:0      [点我收藏+]

标签:内存   height   color   order   pen   blog   bitmap   使用   erp   

http://www.cnblogs.com/CoderAlex/p/6604618.html

通常情况下,我们使用openGL将渲染好的图片绘制到屏幕上,但有时候我们不想显示处理结果,这时候就需要使用离屏渲染了。

正常情况下,我们将屏幕,也就是一个CAEAGLLayer对象作为渲染目标,离屏渲染就是重定位渲染目标,将内存开辟的一块空间作为渲染目标,然后再从内存中获取图片。

在离屏渲染过程中需要使用到FBO,不熟悉的朋友可以先查阅FBO相关资料 http://blog.csdn.net/dreamcs/article/details/7691690

 

下面让我们来一起看看如何进行离屏渲染:

技术分享
 glGenRenderbuffers(1, &_colorBufferRender);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferRender);
//    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_EALayer];
    glGenFramebuffers(1, &_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8_OES, _drawableWidth, _drawableHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                              GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER,
                              _colorBufferRender);
技术分享

 

其实过程很简单,为renderBuffer分配内存,然后将renderBuffer挂载到frameBuffer上,这样就将渲染目标从原来的CAEALyaer定向到了为renderBuffer分配的内存。

好像也有将纹理作为渲染目标的,可惜没研究明白,有会的朋友可以留言教我一下。

 

其余的过程并没有什么区别,在渲染结束后,从内存中获取图片就可以了。

技术分享
NSInteger dataLength = self.drawableWidth * self.drawableHeight * 4;
    GLubyte *buffer = (GLubyte *)malloc(dataLength * sizeof(GLubyte));
    glReadPixels(0,
                 0,
                 self.drawableWidth,
                 self.drawableHeight,
                 GL_RGBA,
                 GL_UNSIGNED_BYTE,
                 buffer);
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
                                                              buffer,
                                                              dataLength,
                                                              NULL);
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * self.drawableWidth;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    
    CGImageRef imageRef = CGImageCreate(self.drawableWidth, self.drawableHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, true, renderingIntent);
    
    UIImage *myImage = [UIImage imageWithCGImage:imageRef];
技术分享

 

iOS-----openGL--openGL ES iOS 入门篇4---> 离屏渲染

标签:内存   height   color   order   pen   blog   bitmap   使用   erp   

原文地址:http://www.cnblogs.com/CoderAlex/p/6604626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!