OpenGL ES 框架詳細(xì)解析(十二) —— 采用OpenGL ES 3.0

版本記錄

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

前言

OpenGL ES是一個(gè)強(qiáng)大的圖形庫贱案,是跨平臺(tái)的圖形API橱赠,屬于OpenGL的一個(gè)簡(jiǎn)化版本器联。iOS系統(tǒng)可以利用OpenGL ES將圖像數(shù)據(jù)直接送入到GPU進(jìn)行渲染,這樣避免了從CPU進(jìn)行計(jì)算再送到顯卡渲染帶來的性能的高消耗遍烦,能帶來來更好的視頻效果和用戶體驗(yàn)俭嘁。接下來幾篇就介紹下iOS 系統(tǒng)的 OpenGL ES框架。感興趣的可以看上面幾篇服猪。
1. OpenGL ES 框架詳細(xì)解析(一) —— 基本概覽
2. OpenGL ES 框架詳細(xì)解析(二) —— 關(guān)于OpenGL ES
3. OpenGL ES 框架詳細(xì)解析(三) —— 構(gòu)建用于iOS的OpenGL ES應(yīng)用程序的清單
4. OpenGL ES 框架詳細(xì)解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架詳細(xì)解析(五) —— 使用OpenGL ES和GLKit進(jìn)行繪制
6. OpenGL ES 框架詳細(xì)解析(六) —— 繪制到其他渲染目的地
7. OpenGL ES 框架詳細(xì)解析(七) —— 多任務(wù)供填,高分辨率和其他iOS功能
8. OpenGL ES 框架詳細(xì)解析(八) —— OpenGL ES 設(shè)計(jì)指南
9. OpenGL ES 框架詳細(xì)解析(九) —— 調(diào)整您的OpenGL ES應(yīng)用程序
10. OpenGL ES 框架詳細(xì)解析(十) —— 使用頂點(diǎn)數(shù)據(jù)的最佳做法
11. OpenGL ES 框架詳細(xì)解析(十一) —— 并發(fā)和OpenGL ES

Adopting OpenGL ES 3.0 - 采用OpenGL ES 3.0

OpenGL ES 3.0OpenGL ES 2.0規(guī)范的超集拐云,因此在您的應(yīng)用程序中采用它是容易的。 您可以繼續(xù)使用OpenGL ES 2.0代碼近她,同時(shí)利用兼容設(shè)備上OpenGL ES 3.0上下文的更高資源限制叉瘩,并增加對(duì)OpenGL ES 3.0特定功能的支持,使您的應(yīng)用程序的設(shè)計(jì)變得有意義粘捎。


Checklist for Adopting OpenGL ES 3.0 - 采用OpenGL ES 3.0的清單

在您的應(yīng)用程序中使用OpenGL ES 3.0:

EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];

如果您打算將應(yīng)用程序提供給不支持OpenGL ES 3.0的設(shè)備,請(qǐng)按照 Listing 2-1中的步驟在必要時(shí)退回到OpenGL ES 2.0攒磨。

  • 在使用OpenGL ES 3.0 API的源文件中包含或?qū)隣penGL ES 3.0 API頭文件:
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>
  • 更新代碼泳桦,使用OpenGL ES 2.0擴(kuò)展并入或更改OpenGL ES 3.0規(guī)范,如下面更新擴(kuò)展代碼中所述娩缰。
  • (可選)您可以在OpenGL ES 2.0和3.0中使用相同的著色器程序灸撰。 但是,如果您選擇將著色器移植到GLSL ES 3.0以使用新功能漆羔,請(qǐng)參閱采用OpenGL ES著色語言版本3.0中的注意事項(xiàng)梧奢。
  • OpenGL ES 3.0兼容設(shè)備上測(cè)試您的應(yīng)用程序,以驗(yàn)證其行為是否正確演痒。

Updating Extension Code - 更新擴(kuò)展碼

OpenGL ES 3.0是OpenGL ES 2.0規(guī)范的超集亲轨,所以僅使用核心OpenGL ES 2.0功能的應(yīng)用程序可以在OpenGL ES 3.0上下文中使用,無需更改鸟顺。 然而惦蚊,一些應(yīng)用程序也使用OpenGL ES 2.0擴(kuò)展。 這些擴(kuò)展提供的功能也可在OpenGL ES 3.0中使用讯嫂,但是在OpenGL ES 3.0上下文中使用它們可能需要至少進(jìn)行較小的代碼更改蹦锋。

1. Remove Extension Suffixes - 刪除擴(kuò)展名后綴

下面列出的OpenGL ES 2.0擴(kuò)展定義了將API并入到OpenGL ES 3.0核心規(guī)范中。 要在OpenGL ES 3.0上下文中使用這些功能欧芽,只需從函數(shù)和常量名稱中刪除擴(kuò)展名后綴即可莉掂。 例如,glMapBufferRangeEXT函數(shù)的名稱為glMapBufferRange千扔,并且DEPTH_COMPONENT24_OES常量(在glRenderbufferStorage函數(shù)的internalformat參數(shù)中使用)變?yōu)?code>DEPTH_COMPONENT24憎妙。

2. Modify Use of Extension APIs - 修改使用擴(kuò)展API

OpenGL ES 2.0擴(kuò)展定義的一些功能是OpenGL ES 3.0的核心規(guī)范,但是對(duì)它們的API定義進(jìn)行了更改曲楚。 要在OpenGL ES 3.0上下文中使用這些功能厘唾,請(qǐng)進(jìn)行以下更改。

Working with Texture Formats - 使用紋理格式

OES_depth_texture, OES_packed_depth_stencil, OES_texture_float, OES_texture_half_float, EXT_texture_rgEXT_sRGB擴(kuò)展定義了在glTexImage系列函數(shù)的internalformat和type參數(shù)中使用的常量龙誊。 這些擴(kuò)展定義的功能在OpenGL ES 3.0內(nèi)核API中可用抚垃,但有一些注意事項(xiàng):

  • glTexImage函數(shù)不支持沒有顯式大小的internalformat常量。 改為使用顯式大小的常量:
// Replace this OpenGL ES 2.0 code:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, data);
// With this OpenGL ES 3.0 code:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, data);
  • OpenGL ES 3.0未定義LUMINANCELUMINANCE_ALPHA數(shù)據(jù)的浮點(diǎn)數(shù)或半浮點(diǎn)數(shù)。 請(qǐng)改用相應(yīng)的RED或RG格式鹤树。
  • 由深度和深度/模板紋理采樣器返回的向量不再重復(fù)OpenGL ES 3.0中前三個(gè)組件的深度值铣焊。 只能在著色器代碼中使用第一個(gè)(.r)組件來對(duì)這些紋理進(jìn)行采樣。
  • sRGB格式僅在OpenGL ES 3.0中用于internalformat參數(shù)時(shí)有效魂迄。 使用GL_RGBGL_RGBA作為sRGB紋理的格式參數(shù)粗截。

或者,通過調(diào)用glTexStorage函數(shù)替換對(duì)glTexImage函數(shù)的調(diào)用捣炬。 紋理存儲(chǔ)功能可用作OpenGL ES 3.0中的核心API熊昌,以及OpenGL ES 1.1和2.0中的EXT_texture_storage擴(kuò)展。 這些函數(shù)提供了一個(gè)額外的好處:使用glTexStorage函數(shù)在一次調(diào)用中完全指定一個(gè)不可變的紋理對(duì)象; 它會(huì)立即執(zhí)行所有一致性檢查和內(nèi)存分配湿酸,保證紋理對(duì)象永遠(yuǎn)不會(huì)因?yàn)槿鄙?code>mipmap級(jí)別或不一致的多維數(shù)據(jù)集地圖面而不完整婿屹。

Mapping Buffer Objects into Client Memory - 將緩沖區(qū)對(duì)象映射到客戶端內(nèi)存中

OES_mapbuffer擴(kuò)展定義了用于將緩沖區(qū)對(duì)象的整個(gè)數(shù)據(jù)存儲(chǔ)映射到客戶端內(nèi)存中的glMapBuffer函數(shù)。 OpenGL ES 3.0則定義了glMapBufferRange函數(shù)推溃,該函數(shù)提供了額外的功能:它允許映射緩沖區(qū)對(duì)象的數(shù)據(jù)存儲(chǔ)的子集昂利,并包含用于異步映射的選項(xiàng)。 glMapBufferRange函數(shù)也可以通過EXT_map_buffer_range擴(kuò)展名在OpenGL ES 1.12.0上下文中使用铁坎。

Discarding Framebuffers - 丟棄幀緩沖區(qū)

OpenGL ES 3.0中的glInvalidateFramebuffer函數(shù)將替換由EXT_discard_framebuffer擴(kuò)展名提供的glDiscardFramebufferEXT函數(shù)蜂奸。 兩個(gè)功能的參數(shù)和行為是相同的。

Using Multisampling - 使用多重采樣

OpenGL ES 3.0包含了APPLE_framebuffer_multisample擴(kuò)展的所有功能硬萍,但glResolveMultisampleFramebufferAPPLE函數(shù)除外扩所。 相反,glBlitFramebuffer函數(shù)提供了這個(gè)和其他其他幀緩沖區(qū)復(fù)制選項(xiàng)朴乖。 要解決多采樣緩沖區(qū)祖屏,請(qǐng)?jiān)O(shè)置讀取和繪制幀緩沖區(qū)(如Using Multisampling to Improve Image Quality),然后使用glBlitFramebuffer將整個(gè)讀取幀緩沖區(qū)復(fù)制到整個(gè)繪圖幀緩沖區(qū)中:

glBlitFramebuffer(0,0,w,h, 0,0,w,h, GL_COLOR_BUFFER_BIT, GL_NEAREST);

3. Continue Using Most Other Extensions in OpenGL ES 3.0 - 繼續(xù)使用OpenGL ES 3.0中的其他擴(kuò)展

iOS設(shè)備圖形硬件的幾個(gè)主要功能不是OpenGL ES 3.0核心內(nèi)容的一部分买羞,但仍可作為OpenGL ES 3.0擴(kuò)展使用袁勺。 要使用這些功能,請(qǐng)繼續(xù)使用Verifying OpenGL ES Capabilities中描述的步驟檢查擴(kuò)展支持畜普。 (另請(qǐng)參閱 iOS Device Compatibility Reference以確定哪些設(shè)備可用哪些功能期丰。)

為OpenGL ES 2.0擴(kuò)展編寫的大多數(shù)代碼也可作為OpenGL ES 3.0擴(kuò)展使用,可在OpenGL ES 3.0上下文中進(jìn)行操作吃挑,無需更改钝荡。 但是,有關(guān)修改頂點(diǎn)和片段著色器語言的擴(kuò)展儒鹿,另請(qǐng)注意化撕,有關(guān)詳細(xì)信息几晤,請(qǐng)參閱下一節(jié)约炎。


Adopting OpenGL ES Shading Language version 3.0 - 采用OpenGL ES著色語言3.0版

OpenGL ES 3.0包括一個(gè)新版本的OpenGL ES著色語言(GLSL ES)。 OpenGL ES 3.0上下文可以使用編寫在版本1.0或版本3.0的GLSL ES中的著色器程序,但3.0版著色器(在著色器源代碼中標(biāo)有#version 300 es指令)需要訪問某些新功能圾浅,例如統(tǒng)一塊 掠手,32位整數(shù)和其他整數(shù)運(yùn)算。

GLSL ES版本1.0和3.0之間的某些語言習(xí)慣已經(jīng)發(fā)生變化狸捕。 這些更改使得Shader源代碼在OpenGL ES 3.0和桌面OpenGL ES 3.3或更高版本之間更加便攜喷鸽,但是當(dāng)移植到GLSL ES 3.0時(shí),它們也需要對(duì)現(xiàn)有著色器源代碼進(jìn)行微小的更改:

  • attributevarying限定符在GLSL ES 3.0中被關(guān)鍵字in和out代替灸拍。 在頂點(diǎn)著色器中做祝,使用in限定符中的頂點(diǎn)屬性和out限定符來改變輸出。 在片段著色器中鸡岗,使用in限定符來改變輸入混槐。
  • GLSL ES 3.0刪除了gl_FragDatagl_FragColor內(nèi)置的片段輸出變量。 相反轩性,您使用out限定符聲明自己的片段輸出變量声登。
  • 紋理采樣函數(shù)已在GLSL ES 3.0中重命名,所有采樣器類型都使用相同的紋理函數(shù)名稱揣苏。 例如悯嗓,您可以使用具有sampler2DsamplerCube參數(shù)的新texture函數(shù)(從GLSL ES 1.0替換texture2DtextureCube函數(shù))。
  • EXT_shader_texture_lod, EXT_shadow_samplersOES_standard_derivatives擴(kuò)展添加到GLSL ES 1.0中的功能是GLSL ES規(guī)范的核心部分卸察。 將使用這些功能的著色器移植到GLSL ES 3.0時(shí)脯厨,請(qǐng)使用相應(yīng)的GLSL ES 3.0功能。
  • EXT_shader_framebuffer_fetch擴(kuò)展名的作用不同蛾派。 GLSL ES 3.0刪除gl_FragDatagl_FragColor內(nèi)置片段輸出變量俄认,有利于要求在著色器中聲明片段輸出。 相應(yīng)地洪乍,gl_LastFragData內(nèi)置變量不存在于GLSL ES 3.0片段著色器中眯杏。 相反,您使用inout限定符聲明的任何片段輸出變量在著色器運(yùn)行時(shí)都包含以前的片段數(shù)據(jù)壳澳。 有關(guān)更多詳細(xì)信息岂贩,請(qǐng)參閱Fetch Framebuffer Data for Programmable Blending

有關(guān)GLSL ES 3.0的完整概述巷波,請(qǐng)參閱OpenGL ES著色語言3.0規(guī)范萎津,可從OpenGL ES API Registry獲取。

后記

未完抹镊,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锉屈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垮耳,更是在濱河造成了極大的恐慌颈渊,老刑警劉巖遂黍,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俊嗽,居然都是意外死亡雾家,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門绍豁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯咧,“玉大人,你說我怎么就攤上這事竹揍【挫” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵芬位,是天一觀的道長(zhǎng)驶拱。 經(jīng)常有香客問我,道長(zhǎng)晶衷,這世上最難降的妖魔是什么蓝纲? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮晌纫,結(jié)果婚禮上税迷,老公的妹妹穿的比我還像新娘。我一直安慰自己锹漱,他們只是感情好箭养,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哥牍,像睡著了一般毕泌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗅辣,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天撼泛,我揣著相機(jī)與錄音,去河邊找鬼澡谭。 笑死愿题,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛙奖。 我是一名探鬼主播潘酗,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雁仲!你這毒婦竟也來了仔夺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤攒砖,失蹤者是張志新(化名)和其女友劉穎缸兔,沒想到半個(gè)月后骆膝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灶体,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掐暮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎抽。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖路克,靈堂內(nèi)的尸體忽然破棺而出樟结,到底是詐尸還是另有隱情,我是刑警寧澤精算,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布瓢宦,位于F島的核電站,受9級(jí)特大地震影響灰羽,放射性物質(zhì)發(fā)生泄漏驮履。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一廉嚼、第九天 我趴在偏房一處隱蔽的房頂上張望玫镐。 院中可真熱鬧,春花似錦怠噪、人聲如沸恐似。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矫夷。三九已至,卻和暖如春憋槐,著一層夾襖步出監(jiān)牢的瞬間双藕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工阳仔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔓彩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓驳概,卻偏偏與公主長(zhǎng)得像赤嚼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顺又,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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