博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-----openGL--openGL ES iOS 入门篇4---> 离屏渲染
阅读量:6979 次
发布时间:2019-06-27

本文共 2253 字,大约阅读时间需要 7 分钟。

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];

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/6604626.html

你可能感兴趣的文章
Flutter中的布局绘制流程简析(一)
查看>>
CodeIgniter在nginx下的配置
查看>>
jQuery源码 - extend 继承&拷贝 解析
查看>>
Annotation注解(一)- 基础
查看>>
ionic工作原理
查看>>
【ios】textField 运行状态以及两种关闭键盘的方式
查看>>
leetcode 345. Reverse Vowels of a String
查看>>
django rest framework个人学习笔记(一)————Install
查看>>
数据归一化
查看>>
anujs+ webpack2
查看>>
Spring IoC源码执行流程解析
查看>>
github - 收藏集 - 掘金
查看>>
Object.keys()来获取对象的属性
查看>>
JavaScript专题之类型判断(上)
查看>>
[译] ConstraintLayout深入系列之代替常见布局
查看>>
js 5种迭代,遍历方法方法 高程5.2.8
查看>>
动手写个数字输入框2:起手式——拦截非法字符
查看>>
JSONModel使用「数据转模型」
查看>>
有序数组的一种实现
查看>>
Decorator Pattern With Laravel 装饰者模式
查看>>