OpenGL ES(二) 三角形

相比于OpenGL绘图来说,OpenGL ES要简单很多,因为苹果公司给我们封装了工具类GLKBaseEffect,下面是一个简单的绘制三角形的例子:

-(void)setupGL{
    // 创建设备上下文,用OpenGL ES 2.0的API
    GLKView *view = (GLKView *)self.view;
    view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    // GLKView的深度缓存
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    [EAGLContext setCurrentContext:view.context];
    
    // 创建GLKBaseEffect
    self.effect = [[GLKBaseEffect alloc]init];
    self.effect.useConstantColor = GL_TRUE; 
    self.effect.constantColor = GLKVector4Make(1.0f, 0.5f, 0.2f, 1.0); // 设置三角形颜色(注:如果开启光照,这里的颜色将会失效)
    
    // 顶点数据
    GLfloat vertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
        -0.5f,  0.5f, 0.0f
    };

    // 生成顶点数据缓存标示符(参数1:指定生产缓存标示符的数量,参数2:指针指向标示符的内存保存位置)
    glGenBuffers(1, &vertexBufferID);
    // 绑定缓存,将指定标示符的缓存用到当前缓存,同一时刻只能绑定一个(参数1:指定绑定缓存的类型,参数2:缓存的标示符)
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
    // 初始化一个缓存,并将数据复制到缓存中
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
    // 启动顶点缓存渲染操作
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    // 链接顶点保存的数据(参数1:当前每个顶点的位置信息,参数2:每个顶点有3个数据,参数3:每个数据是一个浮点值,参数4:小数点固定数据是否可以改变,参数5:每个顶点保存需要多少字节,参数6:访问数据的偏移值)
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), NULL);
}
// 绘图函数
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    // 清除颜色(设置背景颜色)
    glClearColor(0xeb/255.f, 0xf5/255.f, 0xff/255.f, 1.0f);
    // 清除颜色帧缓存
    glClear(GL_COLOR_BUFFER_BIT); 
  
    // 准备绘图
    [self.effect prepareToDraw]; 
    // 执行绘图(参数1:告诉GPU怎么处理绑定在顶点缓存内的顶点数据,参数2:指定需要渲染的第一个顶点,参数3:需要渲染的顶点数量)
    glDrawArrays(GL_TRIANGLES, 0, 3);
}
// 删除不需要的顶点缓存和上下文
-(void)dealloc
{
    GLKView *view = (GLKView *)self.view;
    [EAGLContext setCurrentContext:view.context];
    if (0 != vertexBufferID){
        glDeleteBuffers (1,&vertexBufferID);
        vertexBufferID = 0;
    }
    [EAGLContext setCurrentContext:nil];
}

Demo下载地址:https://github.com/cdcyd/CCOpenGLES

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Web

初学Java Web(6)——JSP学习总结

为什么要学习 JSP Servlet 的短板: Servlet 的出现,是为了解决动态输出网页的问题。 虽然这样做目的能达到,但是存在一些缺陷: 在 Servl...

4667
来自专栏Alice

demo3同通讯录展示的方式分组排序

按A-Z顺序分组展示 有些项目中会需要这样的需求。形成类似于上述的界面。类似于通讯录里边的排序。实现的效果:所有的数据展示的时候,能够分组展示。顺序按照A-Z的...

2289
来自专栏程序员宝库

移除注释的完善思路:真的可以用正则实现?

网上有很多自称能实现移除JS注释的正则表达式,实际上存在种种缺陷。这使人多少有些愕然,也不禁疑惑到:真的可以用正则实现吗?而本篇文章以使用正则移除JS注释为目标...

1363
来自专栏ccylovehs

原生js格式化json工具

4581
来自专栏跟着阿笨一起玩NET

运行时自定义PropertyGrid显示属性项目

在PropertyGrid所显示的属性内容包括属性分类(Category)及组件属性,

1902
来自专栏北京马哥教育

Python 中被忽略的 else

1444
来自专栏Java帮帮-微信公众号-技术文章全总结

Java类加载器(用户自定义类加载器实现)

java类加载器主要分为如下几种: jvm提供的类加载器 根类加载器:底层实现,主要加载java核心类库(如:java.lang.*) 扩展类加载器:使用jav...

3596
来自专栏空帆船w

Android 编码规范

小驼峰命名(lowerCamelCase):除第一个单词以外,每一个单词的第一个字母大写。

2593
来自专栏Web行业观察

一句话判断IE浏览器

if(window.addEventListener){ alert("not ie"); }else if(window.attachEvent){ ...

1513
来自专栏守候书阁

编写自己的代码库(javascript常用实例的实现与封装--续)

这个系列的上一篇文章(编写自己的代码库(javascript常用实例的实现与封装))总结了34个常见的操作。但是在开发中,常见的实例又何止这么多个,经过这些日子...

1473

扫码关注云+社区

领取腾讯云代金券