OpenGL ES从绘制三角形开始
2018-07-26 本文已影响3人
测试开发雨辰
绪论
1.GLKViewController:是支持OpenGL ES特有的行为和动画计时的UIViewController的内建子类
2.GLKView:是UIView类的内建子类。GLKView简化了通过用Core Animation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。GLKView相关的GLKViewController实例是视图的委托并接收当视图需要重绘时的消息。
正文
1.缓存数据几个步骤:
- glGenBuffers():请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符。
- glBindBuffer():告诉OpenGL ES为接下来的运算使用一个缓存。
- glBufferData():让OpenGL ES为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。
- glEnableVertexAttribArray()或者glDisableVertexAttribArray():告诉OpenGL ES在接下来的渲染中是否使用缓存中的数据。
- glVertexAttribPointer():告诉OpenGL ES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。
- glDrawArrays()或者glDrawElements():告诉OpenGL ES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。
*glDeleteBuffers():告诉OpenGL ES删除以前生成的缓存并释放相关的资源。
2.代码部分
#import "PracticeOneViewController.h"
//顶点坐标(x,y,z),由于z为0,可以简化为x,y平面坐标系
GLfloat vertexData1[] =
{
0.5, 0.0, 0.0,
0.0, 0.5, 0.0,
-0.5, 0.0, 0.0,
};
@interface PracticeOneViewController ()
@property (nonatomic, strong) EAGLContext *context;
@property (nonatomic, strong) GLKBaseEffect *effect;
@end
@implementation PracticeOneViewController
- (void)viewDidLoad {
[super viewDidLoad];
//新建OpenGL ES上下文
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView *view = (GLKView *)self.view;
//创建一个OpenGL ES2.0的上下文并提供给view
view.context = self.context;
[EAGLContext setCurrentContext:self.context];
//初始化着色器
self.effect = [[GLKBaseEffect alloc] init];
//使用恒定的颜色
self.effect.useConstantColor = GL_TRUE;
//设置恒定颜色(r,g,b,a)
self.effect.constantColor = GLKVector4Make(0.0, 1.0, 0.0, 1.0);
GLuint buffer;
//为缓存生成一个独一无二的标识符,第一个参数用于指定要生成的缓存标识符的数量,第二个参数是一个指针,指向生成的标识符的内存保存位置
glGenBuffers(1, &buffer);
//绑定用于指定标识符的缓存到当前缓存 GL_ARRAY_BUFFER:指定一个顶点属性的数组
glBindBuffer(GL_ARRAY_BUFFER, buffer);
//复制数据到缓存中
glBufferData(GL_ARRAY_BUFFER, // 指定要更新当前上下文中所绑定的是哪一个缓存
sizeof(vertexData1), //指定要复制进这个缓存的字节的数量
vertexData1, //要复制的字节的地址
GL_STATIC_DRAW); //缓存在未来运算中可能会被怎样使用,GL_STATIC_DRAW告诉上下文,缓存中的内容适合复制到GPU控制的内存,因为很少对其修改,GL_DYNAMIC_DRAW缓存的数据会频繁改变,同时提示OpenGL ES以不同的方式来处理缓存的存储
//启动顶点缓存渲染操作
glEnableVertexAttribArray(GLKVertexAttribPosition);
//类型,成员个数,类型,规范化,间隔,偏移
glVertexAttribPointer(GLKVertexAttribPosition, //指示当前绑定的缓存包含每个顶点的位置信息
3, //每个位置有3个部分
GL_FLOAT, //OpenGL ES每个部分都保存为一个浮点类型的值
GL_FALSE, //告诉OpenGL ES小数点固定数据是否可以被改变
sizeof(GLfloat)*3, //步幅,指定了每个顶点的保存需要多少个字节
NULL); //从当前绑定的顶点缓存的开始位置访问顶点数据
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
//设置存储在当前上下文的背景色(r,g,b,a)
glClearColor(0.7, 0.3, 0.2, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[self.effect prepareToDraw];
//绘制
glDrawArrays(GL_TRIANGLES, //渲染三角形
0, //缓存内的需要渲染的第一个顶点的位置
3); //缓存内的需要渲染的顶点的数量
}
@end
这样一个三角形就实现了,目前本人开始学习OpenGL ES,也会记录学习的点点滴滴的,Demo连接