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


轉自 沒有故事

地址:http://www.cnblogs.com/bigly/p/5804320.html

 

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的第一關鍵點。

                      

 

————————————————————————————————————————

原作者寫的有個bug,在運行時會崩潰,報'-[CALayer setDrawableProperties:]: unrecognized selector sent to instance 0x60800022ace0',是view的layer是CALayer類型,找不到setDrawableProperties:的方法

解決辦法:在創建的view類中,加入

+ (Class)layerClass{
    return [CAEAGLLayer class];
}

這樣就可以直接在創建時直接創建一個CAEAGLLayer類型的layer,也就可以調用setDrawableProperties:方法了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM