寫在前面
最近發(fā)現(xiàn)公司的代碼里面含有大量的 OpenGL 代碼. 所以想學點關于 OpenGL 的語法, 以便可以看懂代碼.
OpenGL版本
iOS系統(tǒng)默認支持OpenGl ES1.0、ES2.0以及ES3.0 3個版本仰美,三者之間并不是簡單的版本升級,設計理念甚至完全不同咖杂,在開發(fā)OpenGL項目前,需要根據(jù)業(yè)務需求選擇合適的版本诉字。這方面的介紹不少懦尝,不再展開壤圃。在學習OpenGL代碼的時候也需要知道它對應著哪個版本,在ES1中執(zhí)行ES2代碼是看不到任何效果的伍绳,你可以在初始化EAGLContext時指定ES版本號
EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
OpenGL坐標系不同于UIKit坐標系,其實它是這樣的
除了方向冲杀,還有一點需要注意,默認情況各個方向坐標值范圍為(-1权谁,1),而不是UIKit中的(0旺芽,320)沪猴。當繪制點(320,0)运嗜,它并不會出現(xiàn)在屏幕右上角。在ES1中洗出,可以通過以下代碼將坐標系轉(zhuǎn)化為熟悉的(320图谷,480)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glViewport(0, 0, rect.size.width * 2, rect.size.height * 2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, 320, 0, 480, -1024, 1024);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
接下來說說iOS中如何使用OpenGL
GLKViewController & GLKView
機智的你是不是已經(jīng)發(fā)現(xiàn)這兩個對象翩活, 為了方便大家更快的開發(fā)便贵,系統(tǒng)為OpenGL提供了簡單的封裝,繼承GLKViewController定義自己的ViewController承璃,GLKViewController的view為GLKView類,GLKView的delegate定義了繪制回調(diào)函數(shù)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
GLKViewController定義數(shù)據(jù)刷新函數(shù)盔粹,當子類實現(xiàn)-(void)update方法,glkViewControllerUpdate方法將不再被調(diào)用
- (void)glkViewControllerUpdate:(GLKViewController *)controller
HJGLKViewControllerDemo模擬了GLKViewController方法實現(xiàn)舷嗡,有興趣的童鞋可以查看GLKViewController內(nèi)部實現(xiàn)機制轴猎。需要補充一點捻脖,默認情況下,GLKViewController渲染RunLoop并非NSRunLoopCommonModes中鼠,而是NSDefaultRunLoopMode,因此在UIKit中使用GLKViewController援雇,當滑動界面時,OpenGL是不會渲染的惫搏,為了解決這個問題,可以使用HJGLKViewController替換GLKViewController晶府,HJGLKViewController中默認渲染RunLoop使用NSRunLoopCommonModes模式
EAGLContext
在介紹選擇版本時已經(jīng)提到EAGLContext桂躏,與UIKit中CGContextRef相似川陆,EAGLContext相當于OpenGL繪制句柄或者上下文,在繪制試圖之前,需要指定使用創(chuàng)建的上下文繪制
[EAGLContext setCurrentContext:view.context];
當一個APP可能存在多個EAGLContext時鳞绕,需要處理并存沖突等問題,比如大家所熟知的GPUImage们何,都會使用到EAGLContext。因此冤竹,在使用中要記得及時釋放。有興趣的朋友可以看看這篇文章
Draw
OpenGL繪制本文就不做介紹鹦蠕,HJGLKViewControllerDemo中有大量的示例冒签,順便推薦幾篇相關文章
小貼士:當App退到后臺時萧恕, 切記暫停OpenGL繪制,否則可能導致crash