1.OpenGL簡介:
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。該API由Khronos集團定義推廣,Khronos是一個圖形軟硬體行業協會,該協會主要關注圖形和多媒體方面的開放標準。
iOS系統預設支援OpenGl ES1.0、ES2.0以及ES3.0 3個版本,三者之間並不是簡單的版本升級,設計理念甚至完全不同,在開發OpenGL專案前,需要根據業務需求選擇合適的版本。而在iOS上,可以支援opengles3.0的最低環境是iphone5s ios7.0.
初始化EAGLContext時指定ES版本號:
EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
OpenGL座標系
OpenGL座標系不同於UIKit座標系,其實它是這樣的:
除了方向,還有一點需要注意,預設情況各個方向座標值範圍為(-1,1),而不是UIKit中的(0,320)。當繪製點(320,0),它並不會出現在螢幕右上角。
2.iOS環境下OpenGL環境搭建:
首先,建立一個single view application工程,然後,引入GlKit和OpenGLES。
緊接著,在ViewController.h檔案裡引入GLKit/GLKit.h,將ViewController類的父類改成GLKViewController。
#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>
@interface ViewController : GLKViewController<GLKViewDelegate>
@end
修改viewController中的程式碼如下:
#import "ViewController.h" #import <OpenGLES/ES3/gl.h> #import <OpenGLES/ES3/glext.h> @interface ViewController ()<GLKViewDelegate> { EAGLContext *context; //EAGLContent是蘋果在ios平臺下實現的opengles渲染層,用於渲染結果在目標surface上的更新。 } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];//這裡用的是opengles3. if (!context) { NSLog(@"Failed to create ES context"); } GLKView *view = (GLKView *)self.view; view.context = context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; [EAGLContext setCurrentContext:context]; glEnable(GL_DEPTH_TEST); //開啟深度測試,就是讓離你近的物體可以遮擋離你遠的物體。 glClearColor(0.1, 0.2, 0.3, 1); //設定surface的清除顏色,也就是渲染到螢幕上的背景色。 } - (BOOL)prefersStatusBarHidden { return YES; } -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除surface內容,恢復至初始狀態。 } @end
再次構建執行,如下圖所示:
參考文獻: