OpenGL 圖形庫(kù)使用(一) —— 概念基礎(chǔ)

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.07.22

前言

OpenGL 圖形庫(kù)項(xiàng)目中一直也沒(méi)用過(guò),最近也想學(xué)著使用這個(gè)圖形庫(kù)蚂子,感覺(jué)還是很有意思萌庆,也就自然想著好好的總結(jié)一下。首先要給大家介紹個(gè)學(xué)習(xí)網(wǎng)站。
1. 歡迎來(lái)到OpenGL的世界
2.系列教程
3.教程代碼
4.落影簡(jiǎn)書(shū)

OpenGL ES基礎(chǔ)

OpenGL

OpenGL ES是一套多功能開(kāi)放標(biāo)準(zhǔn)的用于嵌入系統(tǒng)的C-based的圖形庫(kù)辨图,用于2D3D數(shù)據(jù)的可視化班套。OpenGL被設(shè)計(jì)用來(lái)轉(zhuǎn)換一組圖形調(diào)用功能到底層圖形硬件(GPU),由GPU執(zhí)行圖形命令故河,用來(lái)實(shí)現(xiàn)復(fù)雜的圖形操作和運(yùn)算吱韭,從而能夠高性能、高幀率利用GPU提供的2D3D繪制能力鱼的。

OpenGL ES規(guī)范本身不定義繪制表面和繪制窗口理盆,因此ios為了使用它必須提供和創(chuàng)建一個(gè)OpenGL ES的呈現(xiàn)環(huán)境,創(chuàng)建和配置存儲(chǔ)繪制命令結(jié)果的framebuffer 及創(chuàng)建和配置一個(gè)或多個(gè)呈現(xiàn)目標(biāo)凑阶。在 iOS中使用EAGL提供的EAGLContext類 來(lái)實(shí)現(xiàn)和提供一個(gè)呈現(xiàn)環(huán)境猿规,用來(lái)保持OpenGLES使用到的硬件狀態(tài)。 EAGL是一個(gè)Objective-C API宙橱,提供使OpenGL ESCore AnimationUIKIT集成的接口坎拐。

在調(diào)用任何OpenGL ES 功能之前必須首先初始化一個(gè)EAGLContext 對(duì)象。每一個(gè)iOS應(yīng)用的每一個(gè)線程都有一個(gè)當(dāng)前context养匈,在調(diào)用OpenGLES函數(shù)時(shí)哼勇,使用或改變此context中的狀態(tài)。EAGLContext的類方法setCurrentContext:用來(lái)設(shè)置當(dāng)前線程的當(dāng)前context呕乎。EAGLContext 的類方法currentContext返回當(dāng)前線程的當(dāng)前context积担。在切換相同線程的兩個(gè)上下文之前,必須調(diào)用glFlush函數(shù)來(lái)確保先前已提交的命令被提交到圖形硬件中猬仁。

可以采用不同的方式使用OpenGL ES以便呈現(xiàn)OpenGL ES內(nèi)容到不同的目標(biāo):GLKitCAEAGLLayer帝璧。為了創(chuàng)建全屏幕的視圖或使OpenGL ES
內(nèi)容與UIKit視圖集成,可以使用GLKit湿刽。在使用GLKit時(shí)的烁,GLKit提供的類GLKView類本身實(shí)現(xiàn)呈現(xiàn)目標(biāo)及創(chuàng)建和維護(hù)一個(gè)framebuffer

為了使OpenGL ES內(nèi)容作為一個(gè)Core Animation層的部分內(nèi)容時(shí)诈闺,可以使用CAEAGLLayer 作為呈現(xiàn)目標(biāo)渴庆,并需要另外創(chuàng)建framebuffer以及自己實(shí)現(xiàn)和控制整個(gè)繪制流程。

GLKit是一組objective-c 類雅镊,為使用OpenGL ES 提供一個(gè)面向?qū)ο蠼涌诮罄祝脕?lái)簡(jiǎn)化OpenGL ES應(yīng)用的開(kāi)發(fā)。GLKit支持四個(gè)3D應(yīng)用開(kāi)發(fā)的關(guān)鍵領(lǐng)域:

  • GLKViewGLKViewController類提供一個(gè)標(biāo)準(zhǔn)的OpenGL ES視圖和相關(guān)聯(lián)的呈現(xiàn)循環(huán)仁烹。GLKView可以作為OpenGL ES內(nèi)容的呈現(xiàn)目標(biāo)耸弄,GLKViewController提供內(nèi)容呈現(xiàn)的控制和動(dòng)畫(huà)。視圖管理和維護(hù)一個(gè)framebuffer卓缰,應(yīng)用只需在framebuffer進(jìn)行繪畫(huà)即可计呈。
  • GLKTextureLoader 為應(yīng)用提供從iOS支持的各種圖像格式的源自動(dòng)加載紋理圖像到OpenGL ES 圖像環(huán)境的方式砰诵,并能夠進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換,并支持同步和異步加載方式捌显。
  • 數(shù)學(xué)運(yùn)算庫(kù)胧砰,提供向量、矩陣苇瓣、四元數(shù)的實(shí)現(xiàn)和矩陣堆棧操作等OpenGL ES 1.1功能。
  • Effect效果類提供標(biāo)準(zhǔn)的公共著色效果的實(shí)現(xiàn)偿乖。能夠配置效果和相關(guān)的頂點(diǎn)數(shù)據(jù)击罪,然后創(chuàng)建和加載適當(dāng)?shù)闹鳌?code>GLKit 包括三個(gè)可配置著色效果類:GLKBaseEffect實(shí)現(xiàn)OpenGL ES 1.1規(guī)范中的關(guān)鍵的燈光和材料模式,GLKSkyboxEffect提供一個(gè)skybox效果的實(shí)現(xiàn)贪薪,GLKReflectionMapEffectGLKBaseEffect基礎(chǔ)上包括反射映射支持媳禁。

GLKView和OpenGL ES繪制過(guò)程

使用GLKView和OpenGLES進(jìn)行繪制過(guò)程:

  • 創(chuàng)建一個(gè)GLKView對(duì)象。
    GLKView 對(duì)象可以編程或使用Interface Builder來(lái)創(chuàng)建和配置画切。在采用編程方式時(shí)竣稽,首先創(chuàng)建一個(gè)context然后調(diào)用initWithFrame:context:方法。使用Interface Builder方式時(shí)霍弹,在從storyboard加載一個(gè)GLKView后毫别,創(chuàng)建一個(gè)context和設(shè)置它作為視圖的context屬性。在iOSGLKit的使用需要?jiǎng)?chuàng)建OpenGL ES 2.0以上的圖形環(huán)境context典格。GLKit視圖自動(dòng)創(chuàng)建和配置它所有的OpenGLES framebuffer對(duì)象和renderbuffers岛宦,可以通過(guò)修改視圖的drawable屬性來(lái)控制這些對(duì)象的屬性。

  • 繪制OpenGL內(nèi)容(發(fā)布繪制命令)
    使用GLKit視圖繪制OpenGL內(nèi)容需要三個(gè)子步驟:

    • 準(zhǔn)備OpenGL ES基礎(chǔ)耍缴;
    • 發(fā)布繪制命令砾肺;
    • 呈現(xiàn)顯示內(nèi)容到Core Animation

GLKit類本身已經(jīng)實(shí)現(xiàn)了第一個(gè)和第三個(gè)步驟防嗡,用戶只需實(shí)現(xiàn)第二個(gè)步驟变汪,在視圖的方法drawRect或視圖的代理對(duì)象的glkView:drawInRect:中調(diào)用適當(dāng)?shù)?code>OpenGL ES繪制命令進(jìn)行內(nèi)容繪制。GLKViewController類維護(hù)一個(gè)animation呈現(xiàn)循環(huán)(包含兩個(gè)方法updatedisplay)蚁趁,用來(lái)實(shí)現(xiàn)連續(xù)的動(dòng)畫(huà)復(fù)雜的場(chǎng)景裙盾。animation 呈現(xiàn)循環(huán)的交替速率由GLKViewController的屬性framesPerSecond指示,并使用preferredFramesPerSecond 屬性來(lái)修改它他嫡。


OpenGL ES版本

iOS系統(tǒng)默認(rèn)支持OpenGl ES1.0闷煤、ES2.0以及ES3.0 3個(gè)版本,三者之間并不是簡(jiǎn)單的版本升級(jí)涮瞻,設(shè)計(jì)理念甚至完全不同鲤拿,在開(kāi)發(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 = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];


OpenGL ES坐標(biāo)系

OpenGL ES坐標(biāo)系和UI的坐標(biāo)系是不同的缀遍,具體如下所示。

OpenGL ES 坐標(biāo)系

UI是以左上角為原點(diǎn)的饱须,而OpenGL ES 坐標(biāo)系是以屏幕中心為原點(diǎn)的域醇。除了方向,還有一點(diǎn)需要注意蓉媳,默認(rèn)情況各個(gè)方向坐標(biāo)值范圍為(-1譬挚,1),而不是UIKit中的(0酪呻,320)减宣。當(dāng)繪制點(diǎn)(320,0)時(shí)玩荠,它并不會(huì)出現(xiàn)在屏幕右上角漆腌。在ES1中,可以通過(guò)以下代碼將坐標(biāo)系轉(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();
}


幾個(gè)重要的類

下面介紹幾個(gè)重要的類女坑。

1. GLKViewController & GLKView

為了方便大家更快的開(kāi)發(fā)悠砚,系統(tǒng)為OpenGL提供了簡(jiǎn)單的封裝,繼承GLKViewController定義自己的ViewController堂飞,GLKViewControllerviewGLKView類灌旧,GLKViewdelegate定義了繪制回調(diào)函數(shù)。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

GLKViewController定義數(shù)據(jù)刷新函數(shù)绰筛,當(dāng)子類實(shí)現(xiàn)-(void)update方法枢泰,glkViewControllerUpdate方法將不再被調(diào)用。

- (void)glkViewControllerUpdate:(GLKViewController *)controller

需要補(bǔ)充一點(diǎn)铝噩,默認(rèn)情況下衡蚂,GLKViewController渲染RunLoop并非NSRunLoopCommonModes,而是NSDefaultRunLoopMode骏庸,因此在UIKit中使用GLKViewController毛甲,當(dāng)滑動(dòng)界面時(shí),OpenGL是不會(huì)渲染的具被。

2. EAGLContext

在介紹選擇版本時(shí)已經(jīng)提到EAGLContext玻募,與UIKitCGContextRef相似,EAGLContext相當(dāng)于OpenGL繪制句柄或者上下文一姿,在繪制試圖之前七咧,需要指定使用創(chuàng)建的上下文繪制跃惫。

[EAGLContext setCurrentContext:view.context];

當(dāng)一個(gè)APP可能存在多個(gè)EAGLContext時(shí),需要處理并存沖突等問(wèn)題艾栋,比如大家所熟知的GPUImage爆存,都會(huì)使用到EAGLContext。因此蝗砾,在使用中要記得及時(shí)釋放先较。有興趣的朋友可以看看這篇文章
這里還需要記住的是:當(dāng)App退到后臺(tái)時(shí)悼粮, 切記暫停OpenGL繪制闲勺,否則可能導(dǎo)致crash

后記

這篇主要是基本的介紹和幾個(gè)基礎(chǔ)概念矮锈,后面還會(huì)繼續(xù)給大家擴(kuò)展,畢竟基礎(chǔ)的部分是固定的睁蕾。未完苞笨,待續(xù)~~~

湖泊
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市子眶,隨后出現(xiàn)的幾起案子瀑凝,更是在濱河造成了極大的恐慌,老刑警劉巖臭杰,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粤咪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渴杆,警方通過(guò)查閱死者的電腦和手機(jī)寥枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磁奖,“玉大人囊拜,你說(shuō)我怎么就攤上這事”却睿” “怎么了冠跷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)身诺。 經(jīng)常有香客問(wèn)我蜜托,道長(zhǎng),這世上最難降的妖魔是什么霉赡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任橄务,我火速辦了婚禮,結(jié)果婚禮上穴亏,老公的妹妹穿的比我還像新娘仪糖。我一直安慰自己柑司,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布锅劝。 她就那樣靜靜地躺著攒驰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪故爵。 梳的紋絲不亂的頭發(fā)上玻粪,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音诬垂,去河邊找鬼劲室。 笑死,一個(gè)胖子當(dāng)著我的面吹牛结窘,可吹牛的內(nèi)容都是我干的很洋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼隧枫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喉磁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起官脓,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤协怒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卑笨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孕暇,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年赤兴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妖滔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桶良,死狀恐怖铛楣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艺普,我是刑警寧澤簸州,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站歧譬,受9級(jí)特大地震影響岸浑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑰步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一矢洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缩焦,春花似錦读虏、人聲如沸责静。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灾螃。三九已至,卻和暖如春揩徊,著一層夾襖步出監(jiān)牢的瞬間腰鬼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工塑荒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熄赡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓齿税,卻偏偏與公主長(zhǎng)得像彼硫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凌箕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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