OpenGLes是一套跨平台的纯C的API,是OpenGL的子集。大名鼎鼎GPUImage就是对OpenGLes的封装,而熟悉GPUImage对于在iOS上处理音视频的工程师来说是必不可少的技能,因此想要在iOS做音视频处理就不能不了解OpenGLes。
要使用OpenGLES绘图,首先,你得有一个GLKView,这是一个专门用来绘制3d内容的UIView,然后为这个GLKView初始化好一个绘图的上下文,叫做EAGLContext,并把该EAGLContext设置成当前绘图上下文,这个其实很好理解,我们使用CoreGraphics时,同样也需要设置当前上下文,就好比我们要开始画画了,要先选一张画布一样。接下来我们要准备好我们的数据,在OpenGL的默认坐标系下,原点在屏幕正中间,右上为正,左下为负,z坐标往屏幕外为正,往屏幕内为负。由于我们只是绘制一个二维的三角形,z坐标直接设为0就好,其他点可以随意设置,只要能构成一个三角形。准备好数据后,就要将数据送往GPU,同时告诉GPU如何处理这些数据(通过定点着色器与片元着色器)。
下面看配置代码
GLKView *view = (GLKView *)self.view;
view.context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:view.context];
//使用GLKBaseEffect是因为该类可以代替着色器实现简单的效果,我们不需要再编写着色器,如果需要自定义显示效果,那就要自己写着色器了
self.baseEffect = [[GLKBaseEffect alloc]init];
self.baseEffect.useConstantColor = GL_TRUE;//使用静态颜色绘制
self.baseEffect.constantColor = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f);//设置绘制颜色 rgba
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//背景颜色
staticconstSceneVertexvertices[] = {
{{-1,-1,0.0}},
{{1,-1,0.0}},
{{-1,1,0.0}},
};
GLuintname;
glGenBuffers(1, &name);//生成缓存,该缓存通过name来标识
glBindBuffer(GL_ARRAY_BUFFER, name);//将缓存绑定到GL_ARRAY_BUFFER
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//将数据送入GPU内存,各个参数的意义:1,目标内存 2.拷贝多少数据,单位字节,3.数据起始地址,4.数据的用途,一般用GL_STATIC_DRAW
//开启绘制的属性
glEnableVertexAttribArray(GLKVertexAttribPosition);
//为GLKVertexAttribPosition指定数据格式,参数意义为1.绘制属性2.该属性有几个组件3.每个组件时什么类型4.是否正则化,一般传GL_FALSE 5.步长,即下一个该属性的数据距离上一个该属性的数据有多少字节 6起始偏移
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLKVector3), NULL);
在定时器里绘制
//清理颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
//开始准备绘制
[self.baseEffect prepareToDraw];
//绘制三角形各个参数含义: 1.绘制类型 2.从第几个定点开始绘制 3.绘制几个顶点
glDrawArrays(GL_TRIANGLES, 0, 3);
网友评论