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 条评论
登录 后参与评论

相关文章

来自专栏Alice

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

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

2049
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结

访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍pandas的数据输入与输出,虽然别的库中也有不少以此为目的的工具。 输入输出通常可以划分为几个大类:读...

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

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

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

1152
来自专栏软件开发

JavaSE学习总结(二)——Java语言基础

一、Java程序预览 Java的语法与C非常类似,这里先使用几个非常简单的程序以点带面来区分C语Java的区分再细讲每个知识点。该文仅针对有编程基础的朋友参考。...

2218
来自专栏三流程序员的挣扎

Flutter 学习记3 - Widget 框架

通过 widgets 构建 UI,描述当前的配置和状态,当状态改变时,框架找出前后的变化,以确定底层 Render Tree 要做的最小更改,在内部变成另一个状...

1001
来自专栏Java Web

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

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

4177
来自专栏守候书阁

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

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

1153
来自专栏企鹅号快讯

python案例-爬取大学排名

一个好玩的爬虫 明天就要考试了,就是不想复习,就想去写代码,学习编程!2018,第一炮。 ? 技术路线:request-bs4 程序结构: 1.从网上获取大学排...

2325
来自专栏前端那些事

自制刻度尺插件-前端简易实现"腾讯信用"界面

依据我现有的知识,在前端上"简易"的实现了腾讯信用的界面,同时自己自制了一个竖直的刻度尺插件,曲线的位置可以根据传入的数值动态的改变,这次主要也想总结一下关于j...

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

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

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

3516

扫码关注云+社区