准备了解一些基本用法,以及如何在项目中使用。

在 iOS 中使用 OpenGL ES

暂时还没了解 CocoaTouch 自带的 GLKit ,所以都是自写的 UIView 去渲染。
引入 Frameworks :

  1. QuartzCore.framework
  2. 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 我们可以将缓冲区的数据渲染到屏幕上。