准备了解一些基本用法,以及如何在项目中使用。
在 iOS 中使用 OpenGL ES
暂时还没了解 CocoaTouch 自带的 GLKit ,所以都是自写的 UIView 去渲染。
引入 Frameworks :
- QuartzCore.framework
- OpenGLES.framework
OpenGL 渲染时必须需要当前页面层级上有一个 CAEAGLLayer。自定义的UIView 必须实现一个方法:
1 2 3
| + (Class)layerClass { return [CAEAGLLayer class]; }
|
通过这个方法将 view 的 layer 转换为 CAEAGLLayer 。
使用 OpenGL 引擎还需要有个上下文 context ,我们初始化 context 的同时,还会选择 OpenGL 的 API 版本:
1 2 3 4 5 6
| context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; //将 context 设置为 currentContext if (!context || ![EAGLContext setCurrentContext:context]) { [self release]; return nil; }
|
然后就是进行一些必须的初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| //必须先创建并且分配内存 - (BOOL)createFramebuffer { //生成 frameBuffer glGenFramebuffers(1, &viewFramebuffer); //生成 renderBuffer glGenRenderbuffers(1, &viewRenderbuffer); //绑定 frameBuffer glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); //绑定 renderBuffer glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); //给 renderBuffer 分配内存 [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; //将 renderBuffer 绑定到 frameBuffer 上 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); //获取屏幕宽度 glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); //获取屏幕高度 glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); //生成 depthRenderBuffer if (USE_DEPTH_BUFFER) { glGenRenderbuffers(1, &depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); } if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); return NO; } return YES; }
|
frameBuffer 和 renderBuffer 是必须的,同时想要 3D 模型更加逼真的话,设置一个 depthRenderBuffer ,通常 帧缓存 frameBuffer 管理着一个或多个 renderBuffer,所以需要将其绑定起来。
到这里初始化就完成了,之后会通过 context presentRenderBuffer 我们可以将缓冲区的数据渲染到屏幕上。