OpenGL ES入门01-OpenGL ES概述

前言

本文是关于OpenGL ES的系统性学习过程,记录了自己在学习OpenGL ES时的收获。
这篇文章的目标是搭建OpenGL ES开发环境。
环境是Xcode8.1+OpenGL ES 2.0
目前代码已经放到github上面,OpenGL ES入门01-OpenGL ES概述

欢迎关注我的 OpenGL ES入门专题

概述

OpenGL一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL ES 是专门为手持设备制定的 3D 规范,它是 OpenGL 的简化版。目前较新的 iOS 支持OpenGL ES 3.0。

效果概述

实现效果图

实现思路

1、建立项目,创建OpenGLESView;
2、初始化OpenGLES上下文;
3、创建帧缓存和渲染缓存,并进行绑定;
4、清屏并进行相关绘制;
5、清理缓存;

实现过程

1、建立项目,创建OpenGLESView

//
//  OpenGLESView.m
//  OpenGLES01-环境搭建
//
//  Created by qinmin on 2017/2/9.
//  Copyright © 2017年 qinmin. All rights reserved.
//

#import "OpenGLESView.h"

@interface OpenGLESView ()

@end

@implementation OpenGLESView

@end

2、初始化OpenGLES上下文

- (void)setupContext
{
    // 设置OpenGLES的版本为2.0 当然还可以选择1.0和最新的3.0的版本,以后我们会讲到2.0与3.0的差异,目前为了兼容性选择2.0的版本
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!_context) {
        NSLog(@"Failed to initialize OpenGLES 2.0 context");
        exit(1);
    }
    
    // 将当前上下文设置为我们创建的上下文
    if (![EAGLContext setCurrentContext:_context]) {
        NSLog(@"Failed to set current OpenGL context");
        exit(1);
    }
}```

3、创建帧缓存和渲染缓存,并进行绑定
```OC
- (void)setupFrameAndRenderBuffer
{
    glGenRenderbuffers(1, &_colorRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
    // 为 color renderbuffer 分配存储空间
    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
    
    glGenFramebuffers(1, &_frameBuffer);
    // 设置为当前 framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    // 将 _colorRenderBuffer 装配到 GL_COLOR_ATTACHMENT0 这个装配点上
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, _colorRenderBuffer);
}

帧缓存:它是屏幕所显示画面的一个直接映象,又称为位映射图(Bit Map)或光栅。帧缓存的每一存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。

渲染缓存:是OpenGLES管理的一处高效内存区域,它可以储存格式化的图像数据。渲染缓存中的数据只有关联到一个帧缓存对象才有意义,并且需要保正图像缓存格式必须与OpenGLES要求的渲染格式相符(比如:不能将颜色值渲染到深度缓存中)。

帧缓存附件:

附件名称 描述
GL_COLOR_ATTACHMENT(0-i) 第i个颜色缓存(0-GL_MAX_COLOR_ATTACHMENTS-1)0为默认的颜色缓存
GL_DEPTH_ATTACHMENT 深度缓存
GL_STENCIL_ATTACHMENT 模板缓存

函数:

  • 分配n个未使用的帧缓存对象,并将它存储到framebuffers中。
glGenFramebuffers (GLsizei n, GLuint* framebuffers) 
  • 设置一个可读可写的帧缓存。当第一次来绑定某个帧缓存的时候,它会分配这个对象的存储空间并初始化,此后再调用这个函数的时候会将指定的帧缓存对象绑定为当前的激活状态。
glBindFramebuffer (GLenum target, GLuint framebuffer)
  • 该函数是将相关的 buffer(三大buffer之一)attach到framebuffer上(如果 renderbuffer不为 0,知道前面为什么说glGenRenderbuffers 返回的id 不会为 0 吧)或从 framebuffer上detach(如果 renderbuffer为 0)。参数 attachment 是指定 renderbuffer 被装配到那个装配点上,其值是GL_COLOR_ATTACHMENTi, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT中的一个,分别对应 color,depth和 stencil三大buffer。
glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
  • 判断是否是程序生成的帧缓存对象,如果是返回GL_TRUE。如果为0或者未分配返回GL_FALSE。
glIsFramebuffer (GLuint framebuffer)
  • 释放帧缓存对象
glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers)

<br />

  • 分配n个未使用的渲染缓存对象,并将它存储到renderbuffers中。注意:返回的 id不会为0,0是OpenGL ES 保留的,我们也不能使用 id 为0的 renderbuffer。
glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)
  • 创建并绑定渲染缓存。当第一次来绑定某个渲染缓存的时候,它会分配这个对象的存储空间并初始化,此后再调用这个函数的时候会将指定的渲染缓存对象绑定为当前的激活状态。
glBindRenderbuffer (GLenum target, GLuint renderbuffer)
  • 为当前绑定的渲染缓存对象分配图像数据空间。在iOS中函数(- (BOOL)renderbufferStorage:(NSUInteger)target fromDrawable:(id<EAGLDrawable>)drawable)内部是通过调用glRenderbufferStorage来分配图像数据空间。
glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
  • 判断是否是程序生成的渲染缓存,如果是返回GL_TRUE。如果为0或者未分配返回GL_FALSE。
glIsRenderbuffer(GLuint renderbuffer)
  • 释放渲染缓存
glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers)

4、清屏并进行相关绘制

- (void)render
{
    glClearColor(1.0, 1.0, 0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    
    //将指定 renderbuffer 呈现在屏幕上,在这里我们指定的是前面已经绑定为当前 renderbuffer 的那个,在renderbuffer可以被呈现之前,必须调用renderbufferStorage:fromDrawable: 为之分配存储空间。
    [_context presentRenderbuffer:GL_RENDERBUFFER];
}
  • 用来设置清屏颜色,默认为黑色;glClear (GLbitfieldmask)用来指定要用清屏颜色来清除由mask指定的buffer,mask 可以是 GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT的自由组合。
glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)

5、清理缓存

- (void)destoryRenderAndFrameBuffer
{
    glDeleteFramebuffers(1, &_frameBuffer);
    _frameBuffer = 0;
    glDeleteRenderbuffers(1, &_colorRenderBuffer);
    _colorRenderBuffer = 0;
}

设备支持

iOS版本支持情况
iOS版本 OpenGL ES版本
2.x 1.x
3.0~6.x 1.x 2.x
7.0 1.x 2.x 3.x
设备支持情况
Compatibility iPhone 7 iPhone 7 Plus iPhone 6s iPhone 6s Plus iPhone SE iPhone 6 iPhone 6 Plus iPhone 5s iPhone 5 iPhone 5c iPhone 4s iPhone 4
opengles-1 1 1 1 1 1 1 1 1 1 1 1 1
opengles-2 1 1 1 1 1 1 1 1 1 1 1 1
opengles-3 1 1 1 1 1 1 1 1 0 0 0 0

参考链接

https://developer.apple.com/library/prerelease/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html#//apple_ref/doc/uid/TP40013599-CH17-SW1

https://developer.apple.com/library/prerelease/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforAppleA7GPUsandLater/BestPracticesforAppleA7GPUsandLater.html#//apple_ref/doc/uid/TP40008793-CH505-DontLinkElementID_10

http://blog.csdn.net/kesalin/article/details/8221393

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

推荐阅读更多精彩内容