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

版本記錄

版本號 時間
V1.0 2017.10.03

前言

OpenGL ES是一個強大的圖形庫,是跨平臺的圖形API,屬于OpenGL的一個簡化版本。iOS系統可以利用OpenGL ES將圖像數據直接送入到GPU進行渲染,這樣避免了從CPU進行計算再送到顯卡渲染帶來的性能的高消耗,能帶來來更好的視頻效果和用戶體驗。接下來幾篇就介紹下iOS 系統的 OpenGL ES框架。感興趣的可以看上面幾篇。
1. OpenGL ES 框架詳細解析(一) —— 基本概覽
2. OpenGL ES 框架詳細解析(二) —— 關于OpenGL ES
3. OpenGL ES 框架詳細解析(三) —— 構建用于iOS的OpenGL ES應用程序的清單
4. OpenGL ES 框架詳細解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架詳細解析(五) —— 使用OpenGL ES和GLKit進行繪制
6. OpenGL ES 框架詳細解析(六) —— 繪制到其他渲染目的地
7. OpenGL ES 框架詳細解析(七) —— 多任務,高分辨率和其他iOS功能
8. OpenGL ES 框架詳細解析(八) —— OpenGL ES 設計指南
9. OpenGL ES 框架詳細解析(九) —— 調整您的OpenGL ES應用程序
10. OpenGL ES 框架詳細解析(十) —— 使用頂點數據的最佳做法
11. OpenGL ES 框架詳細解析(十一) —— 并發和OpenGL ES

Adopting OpenGL ES 3.0 - 采用OpenGL ES 3.0

OpenGL ES 3.0OpenGL ES 2.0規范的超集,因此在您的應用程序中采用它是容易的。 您可以繼續使用OpenGL ES 2.0代碼,同時利用兼容設備上OpenGL ES 3.0上下文的更高資源限制,并增加對OpenGL ES 3.0特定功能的支持,使您的應用程序的設計變得有意義。


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

在您的應用程序中使用OpenGL ES 3.0:

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

如果您打算將應用程序提供給不支持OpenGL ES 3.0的設備,請按照 Listing 2-1中的步驟在必要時退回到OpenGL ES 2.0。

  • 在使用OpenGL ES 3.0 API的源文件中包含或導入OpenGL ES 3.0 API頭文件:
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>
  • 更新代碼,使用OpenGL ES 2.0擴展并入或更改OpenGL ES 3.0規范,如下面更新擴展代碼中所述。
  • (可選)您可以在OpenGL ES 2.0和3.0中使用相同的著色器程序。 但是,如果您選擇將著色器移植到GLSL ES 3.0以使用新功能,請參閱采用OpenGL ES著色語言版本3.0中的注意事項。
  • OpenGL ES 3.0兼容設備上測試您的應用程序,以驗證其行為是否正確。

Updating Extension Code - 更新擴展碼

OpenGL ES 3.0是OpenGL ES 2.0規范的超集,所以僅使用核心OpenGL ES 2.0功能的應用程序可以在OpenGL ES 3.0上下文中使用,無需更改。 然而,一些應用程序也使用OpenGL ES 2.0擴展。 這些擴展提供的功能也可在OpenGL ES 3.0中使用,但是在OpenGL ES 3.0上下文中使用它們可能需要至少進行較小的代碼更改。

1. Remove Extension Suffixes - 刪除擴展名后綴

下面列出的OpenGL ES 2.0擴展定義了將API并入到OpenGL ES 3.0核心規范中。 要在OpenGL ES 3.0上下文中使用這些功能,只需從函數和常量名稱中刪除擴展名后綴即可。 例如,glMapBufferRangeEXT函數的名稱為glMapBufferRange,并且DEPTH_COMPONENT24_OES常量(在glRenderbufferStorage函數的internalformat參數中使用)變為DEPTH_COMPONENT24。

2. Modify Use of Extension APIs - 修改使用擴展API

OpenGL ES 2.0擴展定義的一些功能是OpenGL ES 3.0的核心規范,但是對它們的API定義進行了更改。 要在OpenGL ES 3.0上下文中使用這些功能,請進行以下更改。

Working with Texture Formats - 使用紋理格式

OES_depth_texture, OES_packed_depth_stencil, OES_texture_float, OES_texture_half_float, EXT_texture_rgEXT_sRGB擴展定義了在glTexImage系列函數的internalformat和type參數中使用的常量。 這些擴展定義的功能在OpenGL ES 3.0內核API中可用,但有一些注意事項:

  • glTexImage函數不支持沒有顯式大小的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數據的浮點數或半浮點數。 請改用相應的RED或RG格式。
  • 由深度和深度/模板紋理采樣器返回的向量不再重復OpenGL ES 3.0中前三個組件的深度值。 只能在著色器代碼中使用第一個(.r)組件來對這些紋理進行采樣。
  • sRGB格式僅在OpenGL ES 3.0中用于internalformat參數時有效。 使用GL_RGBGL_RGBA作為sRGB紋理的格式參數。

或者,通過調用glTexStorage函數替換對glTexImage函數的調用。 紋理存儲功能可用作OpenGL ES 3.0中的核心API,以及OpenGL ES 1.1和2.0中的EXT_texture_storage擴展。 這些函數提供了一個額外的好處:使用glTexStorage函數在一次調用中完全指定一個不可變的紋理對象; 它會立即執行所有一致性檢查和內存分配,保證紋理對象永遠不會因為缺少mipmap級別或不一致的多維數據集地圖面而不完整。

Mapping Buffer Objects into Client Memory - 將緩沖區對象映射到客戶端內存中

OES_mapbuffer擴展定義了用于將緩沖區對象的整個數據存儲映射到客戶端內存中的glMapBuffer函數。 OpenGL ES 3.0則定義了glMapBufferRange函數,該函數提供了額外的功能:它允許映射緩沖區對象的數據存儲的子集,并包含用于異步映射的選項。 glMapBufferRange函數也可以通過EXT_map_buffer_range擴展名在OpenGL ES 1.12.0上下文中使用。

Discarding Framebuffers - 丟棄幀緩沖區

OpenGL ES 3.0中的glInvalidateFramebuffer函數將替換由EXT_discard_framebuffer擴展名提供的glDiscardFramebufferEXT函數。 兩個功能的參數和行為是相同的。

Using Multisampling - 使用多重采樣

OpenGL ES 3.0包含了APPLE_framebuffer_multisample擴展的所有功能,但glResolveMultisampleFramebufferAPPLE函數除外。 相反,glBlitFramebuffer函數提供了這個和其他其他幀緩沖區復制選項。 要解決多采樣緩沖區,請設置讀取和繪制幀緩沖區(如Using Multisampling to Improve Image Quality),然后使用glBlitFramebuffer將整個讀取幀緩沖區復制到整個繪圖幀緩沖區中:

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 - 繼續使用OpenGL ES 3.0中的其他擴展

iOS設備圖形硬件的幾個主要功能不是OpenGL ES 3.0核心內容的一部分,但仍可作為OpenGL ES 3.0擴展使用。 要使用這些功能,請繼續使用Verifying OpenGL ES Capabilities中描述的步驟檢查擴展支持。 (另請參閱 iOS Device Compatibility Reference以確定哪些設備可用哪些功能。)

為OpenGL ES 2.0擴展編寫的大多數代碼也可作為OpenGL ES 3.0擴展使用,可在OpenGL ES 3.0上下文中進行操作,無需更改。 但是,有關修改頂點和片段著色器語言的擴展,另請注意,有關詳細信息,請參閱下一節。


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

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

GLSL ES版本1.0和3.0之間的某些語言習慣已經發生變化。 這些更改使得Shader源代碼在OpenGL ES 3.0和桌面OpenGL ES 3.3或更高版本之間更加便攜,但是當移植到GLSL ES 3.0時,它們也需要對現有著色器源代碼進行微小的更改:

  • attributevarying限定符在GLSL ES 3.0中被關鍵字in和out代替。 在頂點著色器中,使用in限定符中的頂點屬性和out限定符來改變輸出。 在片段著色器中,使用in限定符來改變輸入。
  • GLSL ES 3.0刪除了gl_FragDatagl_FragColor內置的片段輸出變量。 相反,您使用out限定符聲明自己的片段輸出變量。
  • 紋理采樣函數已在GLSL ES 3.0中重命名,所有采樣器類型都使用相同的紋理函數名稱。 例如,您可以使用具有sampler2DsamplerCube參數的新texture函數(從GLSL ES 1.0替換texture2DtextureCube函數)。
  • EXT_shader_texture_lod, EXT_shadow_samplersOES_standard_derivatives擴展添加到GLSL ES 1.0中的功能是GLSL ES規范的核心部分。 將使用這些功能的著色器移植到GLSL ES 3.0時,請使用相應的GLSL ES 3.0功能。
  • EXT_shader_framebuffer_fetch擴展名的作用不同。 GLSL ES 3.0刪除gl_FragDatagl_FragColor內置片段輸出變量,有利于要求在著色器中聲明片段輸出。 相應地,gl_LastFragData內置變量不存在于GLSL ES 3.0片段著色器中。 相反,您使用inout限定符聲明的任何片段輸出變量在著色器運行時都包含以前的片段數據。 有關更多詳細信息,請參閱Fetch Framebuffer Data for Programmable Blending。

有關GLSL ES 3.0的完整概述,請參閱OpenGL ES著色語言3.0規范,可從OpenGL ES API Registry獲取。

后記

未完,待續~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容