OpenGL ES图形处理

OpenGL ES从绘制三角形开始

2018-07-26  本文已影响3人  测试开发雨辰
绪论

1.GLKViewController:是支持OpenGL ES特有的行为和动画计时的UIViewController的内建子类
2.GLKView:是UIView类的内建子类。GLKView简化了通过用Core Animation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。GLKView相关的GLKViewController实例是视图的委托并接收当视图需要重绘时的消息。

正文

1.缓存数据几个步骤:

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连接

上一篇下一篇

猜你喜欢

热点阅读