OpenGL ES 绘制第一个三角形
这里是利用 xcode ,下面的代码是绘制一个三角形,关键的 API 和参数都有注释。
- (void)viewDidLoad {
[super viewDidLoad];
GLKView *view = (GLKView *)self.view;
view.context = [[EAGLContext alloc] initWithAPI:(kEAGLRenderingAPIOpenGLES3)];
if (!view.context) {
view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
}
[EAGLContext setCurrentContext:view.context];
// GLKBaseEffect 提供了不依赖于所使用的 OpenGL ES 版本控制的渲染方法
self.baseEffect = [[GLKBaseEffect alloc] init];
self.baseEffect.useConstantColor = GL_TRUE;
// 用一个恒定不变的白色来渲染三角形,意味着三角形的每一个像素都具有相同的颜色
self.baseEffect.constantColor = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f);//r,g,b,a
// 设置上下清除颜色为不透明的黑色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 为缓存生成一个独一无二的标识符
// 第一个参数来生命要生成的缓存标识符的个数
// 第二个参数是一个指针,指向生成的标识符的内存的位置
glGenBuffers(1, &vertexBufferID);
// 为接下来的运算绑定缓存
// 第一个参数指定要绑定的类型,GL_ARRAY_BUFFER 用来指定一个顶点属性数组,第二个参数是要绑定的标识符
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
//复制数据到缓存中
// 第一个参数用来表示要更新哪一种类型的缓存
// 第二个参数表示要复制到这个缓存的字节数量
// 第三个参数,要复制的数据地址
// 第四个参数表示,缓存在未来的使用中可能会怎样被使用
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}
-(void)dealloc{
GLKView *view = (GLKView *)self.view;
[EAGLContext setCurrentContext:view.context];
if (vertexBufferID) {
glDeleteBuffers(1, &vertexBufferID);
// 防止其对应的缓存被删除后,还使用其标识符
vertexBufferID = 0;
}
// 回收
view.context = nil;
[EAGLContext setCurrentContext:view.context];
}
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
// 准备好当前的上下文
[self.baseEffect prepareToDraw];
//设置当前的绑定的像素颜色为之前glClearColor设置的颜色,glClear会有效的设置帧缓存的每一个像素的颜色为背景色
glClear(GL_COLOR_BUFFER_BIT);
// 启动顶点缓存渲染操作
glEnableVertexAttribArray(GLKVertexAttribPosition);
// 告诉 OpenGL ES 要渲染的数据在哪里,以及怎么解释顶点数据
// 第一个参数表示,当前绑定的缓存保存每一个顶点数据
// 第二个参数表示每个位置有三个部分
// 第三个参数表示每个部分为一个浮点类型
// 第四个参数表示小数点固定部分是否可以被改变
// 第五个参数是步幅 ,指定每个顶点保存需要多少字节,就是说,GPU 从一个顶点位置开始,到下一个顶点位置开始需要跳过多少字节
// 最后一个参数为 null,表示从当前绑定的顶点缓存的开始位置访问数据
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexStruct), NULL);
// 第一个参数表示怎么处理绑定的顶点数据
// 第二个参数表示绑定的缓存中需要渲染的第一个顶点的位置和需要c渲染的顶点的数量
glDrawArrays(GL_TRIANGLES, 0, 3);
}
网友评论