轉(zhuǎn)載請(qǐng)注明出處:http://www.olinone.com/
寫在前頭,好久沒有更新博客,感謝老朋友的再次來(lái)訪,同時(shí)也歡迎新朋友~
說(shuō)起OpenGL,相信大不多數(shù)朋友都不會(huì)陌生,或多或少都有接觸。本文不屬于OpenGL提高篇,主要目的在于幫助新手更快熟悉iOS中如何使用OpenGL,關(guān)于這方面的介紹,網(wǎng)上也有很多,本文主要任務(wù)在于整理,介紹稍有偏重。這里有比較完整的Demo,可以協(xié)助大家更快上手
OpenGL版本
iOS系統(tǒng)默認(rèn)支持OpenGl ES1.0、ES2.0以及ES3.0 3個(gè)版本,三者之間并不是簡(jiǎn)單的版本升級(jí),設(shè)計(jì)理念甚至完全不同,在開發(fā)OpenGL項(xiàng)目前,需要根據(jù)業(yè)務(wù)需求選擇合適的版本。這方面的介紹不少,不再展開。在學(xué)習(xí)OpenGL代碼的時(shí)候也需要知道它對(duì)應(yīng)著哪個(gè)版本,在ES1中執(zhí)行ES2代碼是看不到任何效果的,你可以在初始化EAGLContext時(shí)指定ES版本號(hào)
EAGLContext*context=[[EAGLContextalloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];
OpenGL坐標(biāo)系
OpenGL坐標(biāo)系不同于UIKit坐標(biāo)系,其實(shí)它是這樣的
除了方向,還有一點(diǎn)需要注意,默認(rèn)情況各個(gè)方向坐標(biāo)值范圍為(-1,1),而不是UIKit中的(0,320)。當(dāng)繪制點(diǎn)(320,0),它并不會(huì)出現(xiàn)在屏幕右上角。在ES1中,可以通過(guò)以下代碼將坐標(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出品——————————————————
猥瑣的分割線過(guò)后,接下來(lái)說(shuō)說(shuō)iOS中如何使用OpenGL
GLKViewController & GLKView
機(jī)智的碼農(nóng)是不是已經(jīng)發(fā)現(xiàn)這兩個(gè)對(duì)象, 為了方便大家更快的開發(fā),系統(tǒng)為OpenGL提供了簡(jiǎn)單的封裝,繼承GLKViewController定義自己的ViewController,GLKViewController的view為GLKView類,GLKView的delegate定義了繪制回調(diào)函數(shù)
-(void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect
GLKViewController定義數(shù)據(jù)刷新函數(shù),當(dāng)子類實(shí)現(xiàn)-(void)update方法,glkViewControllerUpdate方法將不再被調(diào)用
-(void)glkViewControllerUpdate:(GLKViewController*)controller
HJGLKViewControllerDemo模擬了GLKViewController方法實(shí)現(xiàn),有興趣的童鞋可以查看GLKViewController內(nèi)部實(shí)現(xiàn)機(jī)制。需要補(bǔ)充一點(diǎn),默認(rèn)情況下,GLKViewController渲染RunLoop并非NSRunLoopCommonModes,而是NSDefaultRunLoopMode,因此在UIKit中使用GLKViewController,當(dāng)滑動(dòng)界面時(shí),OpenGL是不會(huì)渲染的,為了解決這個(gè)問題,可以使用HJGLKViewController替換GLKViewController,HJGLKViewController中默認(rèn)渲染RunLoop使用NSRunLoopCommonModes模式
EAGLContext
在介紹選擇版本時(shí)已經(jīng)提到EAGLContext,與UIKit中CGContextRef相似,EAGLContext相當(dāng)于OpenGL繪制句柄或者上下文,在繪制試圖之前,需要指定使用創(chuàng)建的上下文繪制
[EAGLContextsetCurrentContext:view.context];
當(dāng)一個(gè)APP可能存在多個(gè)EAGLContext時(shí),需要處理并存沖突等問題,比如大家所熟知的GPUImage,都會(huì)使用到EAGLContext。因此,在使用中要記得及時(shí)釋放。有興趣的朋友可以看看這篇文章
Draw
OpenGL繪制本文就不做介紹,HJGLKViewControllerDemo中有大量的示例,順便推薦幾篇相關(guān)文章
小貼士:當(dāng)App退到后臺(tái)時(shí), 切記暫停OpenGL繪制,否則可能導(dǎo)致crash
后記:iOS-Developer-Documents-Chinese是國(guó)內(nèi)第一個(gè)蘋果文檔翻譯組織,歡迎有志翻譯蘋果官方文檔的朋友加入,QQ群:486111671