iOS 開發(fā) OpenGL 新手入門

寫在前面

最近發(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坐標系,其實它是這樣的


image.png

除了方向冲杀,還有一點需要注意,默認情況各個方向坐標值范圍為(-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中有大量的示例冒签,順便推薦幾篇相關文章

  1. 詳解第一個OpenGL程序

  2. 西蒙iPhone-OpenGL ES 中文教程專題

  3. Cocos2d源碼

小貼士:當App退到后臺時萧恕, 切記暫停OpenGL繪制,否則可能導致crash

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末票唆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屹徘,更是在濱河造成了極大的恐慌,老刑警劉巖缘回,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酥宴,居然都是意外死亡,警方通過查閱死者的電腦和手機拙寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肆糕,“玉大人,你說我怎么就攤上這事诚啃』此ぃ” “怎么了始赎?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵仔燕,是天一觀的道長魔招。 經(jīng)常有香客問我,道長办斑,這世上最難降的妖魔是什么外恕? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任乡翅,我火速辦了婚禮鳞疲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘建丧。我一直安慰自己排龄,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布橄维。 她就那樣靜靜地躺著,像睡著了一般争舞。 火紅的嫁衣襯著肌膚如雪凛忿。 梳的紋絲不亂的頭發(fā)上竞川,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音委乌,去河邊找鬼。 笑死遭贸,一個胖子當著我的面吹牛戈咳,可吹牛的內(nèi)容都是我干的壕吹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耳贬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咒劲?” 一聲冷哼從身側(cè)響起胖秒,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慕的,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肮街,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年嫉父,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绕辖。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仪际,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情树碱,我是刑警寧澤肯适,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布成榜,位于F島的核電站,受9級特大地震影響赎婚,放射性物質(zhì)發(fā)生泄漏刘绣。R本人自食惡果不足惜挣输,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歧焦。 院中可真熱鬧,春花似錦绢馍、人聲如沸向瓷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷耙。三九已至刁赖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間长搀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工源请, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谁尸。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓舅踪,卻偏偏與公主長得像良蛮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子决瞳,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容