美文网首页
1 - OpenGL ES ,iOS 绘制三角形

1 - OpenGL ES ,iOS 绘制三角形

作者: 孙掌门 | 来源:发表于2019-10-09 19:52 被阅读0次

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);
}

相关文章

网友评论

      本文标题:1 - OpenGL ES ,iOS 绘制三角形

      本文链接:https://www.haomeiwen.com/subject/ydzeyctx.html