OpenGL ES入门-02

本节的目的是画一个三角形


三角形.png

写在最前

在iOS中使用OpenGL ES2.0画图主要有两种方法:

  • GLKViewController 和 GLKView
  • CAEAGLLayer + EAGLContext
    第一种方法比较要求比较简单,主要调用系统提供的API就可以画图; 第二种方法需要自己写顶点着色器和片元着色器程序,对开发者有一定的基础要求。本节内容使用 GLKViewController 和 GLKView来实现。

前期准备

  1. iOS中控制器主要是继承UIViewController,在OpenGL ES中我们使用的是GLKViewController。


    继承GLKViewController.png
  2. OC中视图主要是继承UIView, 在OpenGL ES中我们使用的是GLKView, 我们将MainStoryBoard的类改为GLKView。


    继承GLKView.png
  3. 由于OpenGL是跨平台的,所以我们每次使用前都需要设置使用环境和图像显示的窗口。
    // 1. OpenGL 环境
    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    // 2. OpenGL 窗口
    GLKView *opglView = (GLKView*)self.view;
    
    opglView.context = context;
    opglView.drawableColorFormat = GLKViewDrawableColorFormatRGB565;
    
    [EAGLContext setCurrentContext:context];
  1. OpenGL ES是将三维坐标转换为屏幕上的二维像素,所以我们需要准备一个顶点数据组。
static GLfloat vertex[] = {
        0,0.5,0,
        0.5,0,0,
        -0.5,0,0,
    };
  1. 有了数据之后,如何将数据从CPU拷贝到GPU中,以及GPU如何去读取这些数据,这时需要启用顶点属性。
GLuint buffer;
    glGenBuffers(1, // 指定要生成的缓存标示符的数量
                 &buffer); // 缓存标示符的地址
    glBindBuffer(GL_ARRAY_BUFFER, //绑定什么类型的缓存,顶点属性数组
                 buffer); // 需要绑定的缓存标示符,标示为0表示满意缓存
    glBufferData(GL_ARRAY_BUFFER, // 初始化缓存信息
                 sizeof(vertex), // 缓存需要拷贝的大小
                 vertex, // 需要拷贝的数据
                 GL_STATIC_DRAW); // 放到GPU内存中,申明存放的类型。
    
    // 启用顶点数据
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    // 告诉ES顶点数据在哪里,以及如何解释每个顶点保存的数据
    glVertexAttribPointer(GLKVertexAttribPosition, // 顶点数据
                          3, // 每个顶点包含3个数据
                          GL_FLOAT, // 顶点数据类型
                          GL_FALSE, // 固定数据。 是否归一化
                          sizeof(GLfloat) *3, // 步幅:每个顶点数据之间的跨度,取每个顶点数据所占的字节大小
                          NULL); // 告诉ES从当前绑定的顶点缓存的开始位置访问顶点数据
  1. 有顶点数据后我们还需要一个着色器才能开始画图。
// 5. 着色器
    GLKBaseEffect *baseEffect = [[GLKBaseEffect alloc] init];
    baseEffect.useConstantColor = GL_TRUE;
    baseEffect.constantColor = GLKVector4Make(1, 0, 0, 1); // 设置片元着色器的颜色的,为红色
  1. 开始画三角形。
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // 6. 开始画三角形
    //准备画图
    [self.effect prepareToDraw];
    // 绘制三角形
    glDrawArrays(GL_TRIANGLES, // 渲染顶点数据类型
                 0, // 第一个需要渲染的顶点位置
                 3); // 渲染的顶点数量
}

我将代码放在gitHub, 有需要的可以看看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容