轉(zhuǎn)載請注明出處:http://www.olinone.com/
寫在前頭蛉抓,好久沒有更新博客,感謝老朋友的再次來訪剃诅,同時也歡迎新朋友~
說起OpenGL巷送,相信大不多數(shù)朋友都不會陌生,或多或少都有接觸矛辕。本文不屬于OpenGL提高篇笑跛,主要目的在于幫助新手更快熟悉iOS中如何使用OpenGL,關(guān)于這方面的介紹聊品,網(wǎng)上也有很多飞蹂,本文主要任務(wù)在于整理,介紹稍有偏重翻屈。這里有比較完整的Demo陈哑,可以協(xié)助大家更快上手
OpenGL版本
iOS系統(tǒng)默認支持OpenGl ES1.0、ES2.0以及ES3.0 3個版本妖胀,三者之間并不是簡單的版本升級芥颈,設(shè)計理念甚至完全不同惠勒,在開發(fā)OpenGL項目前赚抡,需要根據(jù)業(yè)務(wù)需求選擇合適的版本。這方面的介紹不少纠屋,不再展開涂臣。在學(xué)習(xí)OpenGL代碼的時候也需要知道它對應(yīng)著哪個版本,在ES1中執(zhí)行ES2代碼是看不到任何效果的售担,你可以在初始化EAGLContext時指定ES版本號
EAGLContext*context=[[EAGLContextalloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];
OpenGL坐標(biāo)系
OpenGL坐標(biāo)系不同于UIKit坐標(biāo)系赁遗,其實它是這樣的
除了方向,還有一點需要注意族铆,默認情況各個方向坐標(biāo)值范圍為(-1岩四,1),而不是UIKit中的(0哥攘,320)剖煌。當(dāng)繪制點(320,0)逝淹,它并不會出現(xiàn)在屏幕右上角耕姊。在ES1中,可以通過以下代碼將坐標(biāo)系轉(zhuǎn)化為熟悉的(320栅葡,480)
-(void)glkView:(GLKView*)viewdrawInRect:(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();
}
——————————————————olinone出品——————————————————
猥瑣的分割線過后茉兰,接下來說說iOS中如何使用OpenGL
GLKViewController & GLKView
機智的碼農(nóng)是不是已經(jīng)發(fā)現(xiàn)這兩個對象, 為了方便大家更快的開發(fā)欣簇,系統(tǒng)為OpenGL提供了簡單的封裝规脸,繼承GLKViewController定義自己的ViewController坯约,GLKViewController的view為GLKView類,GLKView的delegate定義了繪制回調(diào)函數(shù)
-(void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect
GLKViewController定義數(shù)據(jù)刷新函數(shù)莫鸭,當(dāng)子類實現(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,當(dāng)滑動界面時蛋欣,OpenGL是不會渲染的航徙,為了解決這個問題,可以使用HJGLKViewController替換GLKViewController陷虎,HJGLKViewController中默認渲染RunLoop使用NSRunLoopCommonModes模式
EAGLContext
在介紹選擇版本時已經(jīng)提到EAGLContext到踏,與UIKit中CGContextRef相似,EAGLContext相當(dāng)于OpenGL繪制句柄或者上下文尚猿,在繪制試圖之前窝稿,需要指定使用創(chuàng)建的上下文繪制
[EAGLContextsetCurrentContext:view.context];
當(dāng)一個APP可能存在多個EAGLContext時,需要處理并存沖突等問題凿掂,比如大家所熟知的GPUImage伴榔,都會使用到EAGLContext。因此庄萎,在使用中要記得及時釋放踪少。有興趣的朋友可以看看這篇文章
Draw
OpenGL繪制本文就不做介紹,HJGLKViewControllerDemo中有大量的示例糠涛,順便推薦幾篇相關(guān)文章
1援奢、詳解第一個OpenGL程序
3忍捡、Cocos2d源碼
小貼士:當(dāng)App退到后臺時集漾, 切記暫停OpenGL繪制,否則可能導(dǎo)致crash
后記:iOS-Developer-Documents-Chinese是國內(nèi)第一個蘋果文檔翻譯組織锉罐,歡迎有志翻譯蘋果官方文檔的朋友加入帆竹,QQ群:486111671