IOS 中openGL使用教程1(openGL ES 入门篇 | 搭建openGL环境)

OpenGL版本app

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)是屏幕右上角学习

                                    blob.png

 

如今咱们从建立工程开始ui

咱们能够在建立工程的时候直接选择game模板,这样系统会自动配置好环境,可是会有不少的多余代码。spa

为了方便学习,咱们选择建立一个single view application工程。线程

建立好工程以后要引入openGLES框架。设计

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

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

 

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

导入对应版本的头文件

  

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

 

设置属性

@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的第一关键点。

                      

相关文章
相关标签/搜索