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

轉(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)文章

1、詳解第一個(gè)OpenGL程序

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

3、Cocos2d源碼

小貼士:當(dāng)App退到后臺(tái)時(shí), 切記暫停OpenGL繪制,否則可能導(dǎo)致crash


后記:iOS-Developer-Documents-Chinese是國(guó)內(nèi)第一個(gè)蘋果文檔翻譯組織,歡迎有志翻譯蘋果官方文檔的朋友加入,QQ群:486111671

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果,一方面得益于成功系統(tǒng)的設(shè)計(jì),另一方面得益...
    韓七夏閱讀 2,970評(píng)論 2 10
  • 前言: 這篇文章是作者iOS開發(fā)之OpenGL ES系列文章的第二篇,將結(jié)合一個(gè)使用OpenGL ES渲染一個(gè)三角...
    綠豆粥與茶葉蛋閱讀 8,451評(píng)論 4 16
  • 版本記錄 前言 OpenGL 圖形庫(kù)項(xiàng)目中一直也沒用過(guò),最近也想學(xué)著使用這個(gè)圖形庫(kù),感覺還是很有意思,也就自然想著...
    刀客傳奇閱讀 9,167評(píng)論 2 24
  • 我只想拍屬于自己的照片 走過(guò)的大橋小路 看過(guò)的青山綠水 生命中點(diǎn)點(diǎn)滴滴 都用圖片記錄下來(lái)?
    狠狠愛_ff閱讀 285評(píng)論 0 0
  • 一個(gè)人死了,他就真的消失了! 生命是強(qiáng)大的,我們從出生時(shí)的幾斤,到成年時(shí)的幾百斤,再到裝進(jìn)棺材時(shí)的那區(qū)...
    AYN閱讀 256評(píng)論 0 0

友情鏈接更多精彩內(nèi)容