虽说2018年苹果在开发者大会的时候宣布弃用OpenGL,但是近来闲着没事还是重新看了一遍
将其在iOS里面的使用情况简单的做一总结以便帮感兴趣的朋友理解
![](https://img.haomeiwen.com/i20410899/63e3c911f917ebee.png)
步骤一.设置用于显示效果的载体,CAEAGLLayer
+ (Class)layerClass{
return [CAEAGLLayer class];
}
- (void)setUpLayer{
CAEAGLLayer *myLayer = (CAEAGLLayer *)self.layer;
/// 默认是透明的,设置为不透明
myLayer.opaque=YES;
// 设置draw属性
myLayer.drawableProperties = @{
kEAGLDrawablePropertyRetainedBacking:@NO,
kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8
};
}
@property(copy) NSDictionary *drawableProperties
官方解释:
You can use this property to change the underlying color formatforthe windowing surface and whether or not the surface retains its contents. For a list of keys (and corresponding values) you can includeinthis dictionary (along with theirdefaultvalues), see the EAGLDrawable.
这个大致的意思就是说可以使用此属性更改窗口曲面的基础颜色格式,以及该曲面是否保留其内容。
步骤二:设置用于一个新的线程维护的上下文 EAGLContext
每一个线程都会维护一个上下文,当使用setCurrentContext时,会设置一个新的上下文, EAGL会释放先前的上下文,并且获取新的上下文。
-(void)setUpContext
{
/// 制定opengl的版本
myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
if(myContext==nil) {
NSLog(@"初始化失败");
return;
}
/// 设置成当前的上下文
if (![EAGLContext setCurrentContext:myContext]) {
NSLog(@"context设置失败");
return;
}
}
步骤三:清空缓冲区内颜色渲染内存块、帧渲染内存块
- (void)destoryRenderAndFrameBuffer {
glDeleteFramebuffers(1, &myColorFrameBuffer);
myColorFrameBuffer = 0;
glDeleteRenderbuffers(1, &myColorRenderBuffer);
myColorRenderBuffer = 0;
}
这个主要为了在下面的步骤进行创建新的缓冲内存的时候首先先要打扫一下,就好比住进一间新房的时候我们要先要来个大扫除
步骤四:设置缓存区
由于CPU在于GPU进行交互的时候并不是一股脑的一下把要处理的事情全部丢给GPU,所以就有了这个缓冲区
- (void)setUpBuffer{
//// 1. 创建颜色缓冲对象
GLuintbuffer =0;
/// 2. 申请一个缓冲区标记
glGenRenderbuffers(1, &buffer);
/// 3.
myColorRenderBuffer = buffer;
/// 4. 将缓冲区绑定到指定的空间中,把myColorRenderBuffer绑定在OpenGL ES的渲染缓存GL_RENDERBUFFER上
glBindRenderbuffer(GL_RENDERBUFFER, myColorRenderBuffer);
/// 将可绘制对象的存储绑定到OpenGL ES renderbuffer对象
// target OpenGL ES绑定点用于当前绑定的renderbuffer。该参数的值必须是GL_RENDERBUFFER
/// drawable 管理renderbuffer的数据存储的对象。在iOS中,此参数的值必须是一个 CAEAGLLayer 对象
///赋值
[myContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
//// 下面创建帧缓冲对象并绑定
// 2、申请一个缓存区标记
glGenFramebuffers(1, &buffer);
myColorFrameBuffer = buffer;
// 将缓冲区绑定到指定的空间中
glBindFramebuffer(GL_FRAMEBUFFER, myColorFrameBuffer);
//// 将颜色渲染内存 配到 GL_COLOR_ATTACHMENT0 配置点上
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, myColorRenderBuffer);
}
步骤五:设置一个程序用于对GPU进行操作
- (void)setupProgram {
myProgram = [GLESUtils loadProgram:@"shaderv.glsl" fragShader:@"shaderf.glsl"];
if(myProgram==0) {
return;
}
glUseProgram(myProgram);
positionSlot = glGetAttribLocation(myProgram, "vPosition");
colorSlot = glGetAttribLocation(myProgram, "a_Color");
}
步骤六:一切准备就绪开始渲染
- (void)render
{
glClearColor(0,1.0,0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, (GLsizei)self.frame.size.width, (GLsizei)self.frame.size.height);
/// 顶点的坐标系统是在正中心
GLfloatvertices[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f,0.0f,
0.5f, -0.5f, 0.0f
};
GLfloatcolors[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
/// 加载顶点数据
glVertexAttribPointer(positionSlot,3,GL_FLOAT,GL_FALSE,0, &vertices);
glEnableVertexAttribArray(positionSlot);
/// 加载颜色数据
glVertexAttribPointer(colorSlot,4,GL_FLOAT,GL_FALSE,0, &colors);
glEnableVertexAttribArray(colorSlot);
/// 绘制
glDrawArrays(GL_TRIANGLES, 0, 3);
[myContext presentRenderbuffer:GL_RENDERBUFFER];
}
网友评论