OpenGL版本

iOS系统默认支持OpenGl ES1.0、ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适的版本。这方面的介绍不少,不再展开。在学习OpenGL代码的时候也需要知道它对应着哪个版本,在ES1中执行ES2代码是看不到任何效果的,你可以在初始化EAGLContext时指定ES版本号

 _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

OpenGL坐标系不同于UIKit坐标系,其实它是这样的,(-1,-1)是屏幕左下角,(1,1)是屏幕右上角

现在我们从创建工程开始

我们可以在创建工程的时候直接选择game模板,这样系统会自动配置好环境,但是会有很多的多余代码。

为了方便学习,我们选择创建一个single view application工程。

创建好工程之后要引入openGLES框架。

苹果提供了一系列的API,简化了对openGL的使用,这些组件被包含在GLKit.framework中。

为了更好地了解openGL的使用,在这里我们不适用GLKit相关的API,以后可能会有相关的介绍。

接下来就可以开始使用openGL了,这里新实现一个类,继承自UIView。

导入对应版本的头文件

  

#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>

设置属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@interface MTGLESViewController (){
 
    EAGLContext *_context;
    CAEAGLLayer *_EALayer;
    GLuint _colorBufferRender;
    GLuint _frameBuffer;
    GLuint _glProgram;
    GLuint _positionSlot;
    GLuint _textureSlot;
    GLuint _textureCoordsSlot;
    GLuint _textureID;
    CGRect _frameCAEAGLLayer;
     
}

在IOS应用程序中,每个线程都会维护一个当前上下文。当你的应用程序使用Opengl ES的调用时,线程的上下文就会被那个调用改变。

要设置当前上下文,你可以通过调用EAGLContext类的setCurrentContext:方法。

[EAGLContext setCurrentContext:myContext];

你的应用程序也可以通过EAGLContext类的currentContext方法来获取一个线程的当前上下文。

当你的应用程序设置了一个新的上下文时,EAGL会释放先前的上下文,并且获取新的上下文。

当你的应用程序创建和初始化EAGLContext对象时,可以来决定那种版本的Opengl ES会被支持。创建Opengl ES 2.0上下文时,你的应用程序可以如下初始化:

_eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:_eaglContext];

初始化完之后,我们需要对layer层进行一些处理,设置一些属性,使其能够使用openGL。

_eaglLayer = (CAEAGLLayer*)self.layer;
_eaglLayer.frame = self.frame;
_eaglLayer.opaque = YES;
_eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kEAGLDrawablePropertyRetainedBacking,
                    kEAGLColorFormatRGBA8,kEAGLDrawablePropertyColorFormat, nil];

初始化完成Layer之后,我们需要初始化一下renderBuffer和FrameBuffer

 glGenRenderbuffers(1, &_colorBufferRender);
glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferRender);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_EALayer]; glGenFramebuffers(1, &_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER,
_colorBufferRender);

现在试试我们是否能正常使用openGL

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

[_eaglContext presentRenderbuffer:GL_RENDERBUFFER];

屏幕的背景色被设为为灰色,证明我们已经成功完成了掌握openGL的第一关键点。

最新文章

  1. PHP--TP框架----把查询到的数据,显示在模型(模板)里面
  2. LINUX 内核2
  3. evak购物车-课程设计(201521123034陈凯欣)
  4. jq中的表单验证插件------jquery.validate
  5. 图解ARP协议(二)ARP攻击原理与实践
  6. 如何在linux下使用sudo命令不用输入密码
  7. 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】
  8. 自己实现数据结构系列三---Stack
  9. docker知识复习
  10. Linux内核分析作业第四周
  11. ReactiveCocoa 源码阅读记录。
  12. Jquery 获取对象的几种方式(转载)
  13. 【Python】【元编程】【二】【描述符】
  14. js 中的console.log有什么作用
  15. Android中样式及主题
  16. Unity Lighting - Lighting overview 照明概述
  17. 6.javaScript中的二维数组
  18. shader常用
  19. HMM相关文章索引
  20. Linux系统调用分析

热门文章

  1. Java 文件操作-RandomAccessFile
  2. Java 方法重载与引用数组类型
  3. APT和它的超级牛力
  4. polygon 画图
  5. python3从尾到头打印链表
  6. C# 数据结构 - 单链表 双链表 环形链表
  7. Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?
  8. atomic nonatomic区别
  9. CentOs 6.5设置使用私钥登录关闭ssh的密码登录修改ssh默认端口
  10. windows charles 抓包https请求