不过这一次,我们要用到的只有CAEAGLLayer。 加入到工程中: ? : CAEAGLLayer是CALayer的子类,它提供了一个OpenGLES渲染环境。 各种各样的OpenGL绘图缓冲的底层可配置项都需要用CAEAGLLayer完成。 这样当我们调用self.layer时返回的就会是一个CAEAGLLayer对象,我们才能在其上描绘OpenGL内容。 + (Class)layerClass { return [CAEAGLLayer class]; } - (void)setupLayer { _eaglLayer = (CAEAGLLayer
IOSSurfaceGL::IOSSurfaceGL(fml::scoped_nsobject<CAEAGLLayer> layer, std::shared_ptr IOSRenderTargetGL 主要是用来持有 CAEAGLLayer 对象,和从 IOSContextGL 获得的用于光栅化的 EAGLContext 对象,并为 CAEAGLLayer 分配 Framebuffer Flutter 在 iOS GL 上进行光栅化的操作如下: 将目标输出的 Surface,也就是 CAEAGLLayer,跟为它分配的 Renderbuffer GL 对象绑定,Renderbuffer 作为对应的 Framebuffer 的 Color Attachment,也就是对这个 Framebuffer 写入,光栅化后像素值的结果实际上是写入到对应的 CAEAGLLayer 的内部像素缓冲区里面 ::presentRenderbuffer 来请求 CAEAGLLayer 提交绘制完毕的像素缓冲区。
OpenGL ES 通过 CAEAGLLayer 与 Core Animation 连接,CAEAGLLayer 是一种特殊类型的 Core Animation 图层,它的内容来自 OpenGL ES 分配缓冲区需要的宽、高、像素格式等信息都会从 layer 中取得; 需要注意的是,如果 CAEAGLLayer 的 bounds 或其他属性变了,需要重新分配 ColorRenderBuffer 的存储空间 ,否则会出现 ColorRenderBuffer 和 CAEAGLLayer 的尺寸不匹配。 类型来获得了一个 CAEAGLLayer 对象用于 OpenGL ES 渲染。 同样的,如果你觉得上述流程太麻烦,iOS 平台还提供了封装好的 GLKView 来简化我们使用 OpenGL ES,GLKView 是对 CAEAGLLayer 的封装,内嵌了配置 Core Animation
学习目标 创建一个OpenGL 工程,用黄色渲染视图 实现步骤 1.创建工程(一个普通的工程就行) 2.创建一个视图(继承UIView) 3.设置这个视图的Layer层为CAEAGLLayer 类型 让学习成为一种习惯 第三步 设置OpenGLView 的layer层为CAEAGLLayer +(Class)layerClass{ return [CAEAGLLayer class]; } 第四步 GL_FRAMEBUFFER)); } 第八步 OpenGL ES渲染缓存对象绑定到layer上 [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer
1.创建你的项目并新建MyGLView 新建MyGLView.png 2.修改你创建的MyGLView添加如下变量(变量后面会有介绍) @interface MyGLView () { CAEAGLLayer frameBuffer; // } 3.在 MyGLView.m 中添加如下函数: +(Class)layerClass{ //OpenGL内容只会在此类layer上描绘 return [CAEAGLLayer class]; } 因为OpenGLES的描绘必须在CAEAGLLayer上才能显示出来,所以我们需要重写这个函数,修改view默认的layer返回类型 4.设置_eaglLayer的属性,添加如下函数 : - (void)setupLayer { _eaglLayer = (CAEAGLLayer*) self.layer; // CALayer 默认是透明的,透明对性能影响大
回忆下OpenGL ES教程里的内容,苹果用CAEAGLLayer来承载OpenGL ES的内容,最终渲染结果都是CAEAGLLayer上颜色缓冲区的数据。 既然我们判断渲染结果没有问题,那么应该从CAEAGLLayer与UILayer的混合开始检查。 通过排查CAEAGLLayer的属性设置,终于发现问题所在是eaglLayer.opaque = YES;! CAEAGLLayer的不透明属性设置为YES,有利于性能的优化,但是在demo里是会造成额外的影响! 通过把opaque属性设置成NO,问题终于解决。
CAEAGLLayer 替换默认的 CALayer,配置绘制属性; b. **EAGLContext 绑定渲染的窗口 (on-screen),CAEAGLLayer **; 扩展: ** CAEAGLLayer ** 继承链: ? CALayer有的,当然 CAEAGLLayer 也有; 作用: a. 修改 opaque 属性为 YES ( CAEAGLLayer.opaque = YES; ); b. 不要修改 Transform ; c. 配置 drawableProperties ,就是绘制的属性 - (void)commit { CAEAGLLayer *glLayer = (CAEAGLLayer *)self.layer
几乎每行代码都会增加注释 1.OpenGL ES 3.0环境 在iOS需要先引用 <OpenGLES/ES2/gl.h> <GLKit/GLKit.h> 上屏 上屏部分需要使用GLKView,CAEAGLLayer self.view.bounds.size.width); _glkView.backgroundColor = [UIColor clearColor]; } return _glkView; } 其中CAEAGLLayer 初始化: - (CAEAGLLayer *)myEagLayer { if (_myEagLayer == nil) { _myEagLayer = (CAEAGLLayer *
插到视图里去 UIView的contentMode、hidden、backgroundColor等属性都可以正常使用 里面比较关键的方法主要有这么2个: // 申明自己的CALayer为CAEAGLLayer + (Class)layerClass { return [CAEAGLLayer class]; } - (void)createDisplayFramebuffer { [GPUImageContext GPUImageContext sharedImageProcessingContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer CAEAGLLayer iOS内建的GPU到屏幕的联动方法 5. fastTextureUpload iOS5开始支持的一种CVOpenGLESTextureCacheRef和CVImageBufferRef
self.view.bounds.size.width); \_glkView.backgroundColor = [UIColor clearColor]; } return \_glkView; } 其中CAEAGLLayer 初始化: - (CAEAGLLayer \*)myEagLayer { if (\_myEagLayer == nil) { \_myEagLayer = (CAEAGLLayer
import "MyGLView.h" #import "GLESUtils.h" #import <OpenGLES/ES3/gl.h> @interface MyGLView () { CAEAGLLayer } @end @implementation MyGLView +(Class)layerClass{ //OpenGL内容只会在此类layer上描绘 return [CAEAGLLayer program [self render]; } return self; } - (void)setupLayer { _eaglLayer = (CAEAGLLayer texCoordSlot; //纹理坐标槽位 GLuint _ourTextureSlot; //纹理对象槽位 在MyGLView.m里 @interface MyGLView () { CAEAGLLayer
1、iOS Demo iOS 平台对 EGL 的实现是 EAGL(Embedded Apple Graphics Library),其中 CAEAGLLayer 就是一种可以支持 OpenGL ES 绘制的图层类型 assign) GLsizei width; @property (nonatomic, assign) GLsizei height; @property (nonatomic, strong) CAEAGLLayer _eaglLayer = (CAEAGLLayer *) self.layer; _eaglLayer.opacity = 1.0; _eaglLayer.drawableProperties // 把 Renderbuffer 的内容显示到窗口系统 (CAEAGLLayer) 中。 free(infoLog); } } } #pragma mark - Override + (Class)layerClass { return [CAEAGLLayer
开始绘制 - 着色器创建 全局属性定义 //变量名基本就是解释 @property(nonatomic,strong)CAEAGLLayer *myLayer; @property(nonatomic, EAGLLayer获取,设置layer图层 + (Class)layerClass{ //1.需要重写view的子类方法,返回特定的layer,否则所有绘制动作是无效的 return [CAEAGLLayer class]; } -(void)setupLayout { //2.获取layer //view中存在一个特殊的图层,用于OpenGL的渲染 self.myLayer = (CAEAGLLayer
激活纹理单元1,上传初始图像; 配置一个新的帧缓存,以纹理单元1作为输入,以纹理单元0作为帧缓存的颜色输出(glFramebufferTexture2D函数); 配置一个新的帧缓存,以纹理单元0作为输入,以CAEAGLLayer 饱和度和色温.gif 具体步骤 1、初始化OpenGL ES配置 初始化数据->设置CAEAGLLayer->选择OpenGL ES上下文->初始化帧缓存->编译shader->配置顶点数组信息。
image.png 2.layer,OpenGLES的描绘必须在CAEAGLLayer上才能显示出来,所以我们需要重写这个函数,修改view默认的layer返回类型,从CAEAGLLayer可以看出,它也属于 +(Class)layerClass{//默认是CALayer //OpenGL内容只会在此类layer上描绘 return [CAEAGLLayer class]; } 3.context -(void)setupLayerAndContext { _eaglLayer = (CAEAGLLayer *)self.layer; _eaglLayer.opaque = YES
我们需要新建一个继承于UIView的类,接下来是重写这个子类View的+(Class)layerClass{}类方法,这个方法默认返回的是[CALayer Class],我们使用openGLES,这里必须得返回[CAEAGLLayer class],这也没什么好说的,规定,我们继续完善这个CAEAGLLayer,看以下的layer属性设置。 看一下就行吧,它设置的属性是不维持渲染内容和颜色格式为RGBA8,从CAEAGLLayer可以看出,CA嘛,它也属于Core Animation。 _eaglLayer = (CAEAGLLayer *)self.layer; _eaglLayer.opaque = YES; _eaglLayer.drawableProperties
创建一个CAEAGLayer 层的view 视图,创建一个继承UIView的类,重写一个方法: +(Class)layerClass{ return [CAEAGLLayer class]; } 第一步就完成了 GL_RENDERBUFFER, _colorFramebuffer); [self.eagContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer
3.CAEAGLLayer CAEAGLLayer可以通过OpenGL ES来进行界面的绘制。
QuartzCore.CAMediaTiming import QuartzCore.CAMediaTimingFunction // 特殊图层 import QuartzCore.CALayer import QuartzCore.CAEAGLLayer
创建 OpenGL View 在iOS中,有两种展示层,一种是 GLKView,另一种是 CAEAGLLayer。WebRTC中使用GLKView进行展示。CAEAGLLayer暂不做介绍。