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)是屏幕右上角學習
如今咱們從建立工程開始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的第一關鍵點。