OpenGL ES基礎概念

使用這個簡潔、高效的OpenGL子集創(chuàng)建3D和2D圖形效果许帐。

OpenGL ES為硬件加速的2D和3D圖形渲染提供了一個基于C的接口。iOS中OpenGL ES框架(OpenGLES.framework)提供了OpenGL ES規(guī)范1.1主经、2.0和3.0版的實現(xiàn)荣暮。

OpenGL ES 的版本

  • OpenGL ES 1.X :針對固定功能流?水管線硬件
  • OpenGL ES 2.X :針對可編程流?水管線硬件
  • OpenGL ES 3.XOpenGL ES 2.0的擴展
    我們平時用2.0或是3.0都可以。

OpenGL ES 命令需要 渲染上下文繪制表? 才能完成圖形圖像的繪制旨怠。

  • 渲染上下文 :存儲相關OpenGL ES 狀態(tài)渠驼。
  • 繪制表? :是?于繪制圖元的表?,它指定渲染所需要的緩存區(qū)類型鉴腻,例如 顏色緩存區(qū)迷扇、深度緩沖區(qū)、模板緩存區(qū)爽哎。

OpenGL ES API 并沒有提供如何創(chuàng)建渲染上下文或者上下文如何連接到原?生窗?系統(tǒng)蜓席。

EGL(Embedded Graphics Library)嵌入式圖形庫

EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗?系統(tǒng)之間的接口。唯一支持 OpenGL ES 卻不支持EGL 的平臺是iOS课锌。iOS支持的是EAGL厨内,與EGL功能基本一致。

EGL的主要功能:

  • 和本地窗?系統(tǒng)(native windowing system)通訊渺贤。
  • 查詢可用的配置雏胃。
  • 創(chuàng)建OpenGL ES可用的“繪圖表面(drawing surface)”
  • 同步不同類別的API之間的渲染,?如在OpenGL ES和OpenVG之間同步志鞍,或者在OpenGL和本地窗口的繪圖命令之間瞭亮。
  • 管理“渲染資源”,?如紋理映射(rendering map)固棚。

EAGL提供了封裝所有OpenGL ES狀態(tài)的圖形上下文统翩,并能夠將核心動畫層配置為OpenGL ES繪圖命令的目標。EAGL還允許OpenGL ES對象(如紋理此洲、renderbuffers和framebuffers)在兩個或多個圖形上下文之間共享厂汗。

OpenGL ES中向量數(shù)據(jù)類型

類型 描述
vec2、vec3呜师、vec4 2分量娶桦、3分量、4分量浮點向量
ivec2汁汗、ivec3趟紊、ivec4 2分量、3分量碰酝、4分量整型向量
uvec2、uvec3戴差、uvec4 2分量送爸、3分量、4分量無符號整型向量
bvec2、bvec3袭厂、bvec4 2分量墨吓、3分量、4分量bool型向量

矩陣數(shù)據(jù)類型

類型 描述
mat2纹磺,mat2x2 兩行兩列
mat3帖烘,mat3x3 三行三列
mat4,mat4x4 四行四列
mat2x3 三行兩列
mat2x4 四行兩列
mat3x2 兩行三列
mat3x4 四行三列
mat4x2 兩行四列
mat4x3 三行四列

注意??: mat列x行

變量存儲限定符

限定符 描述
<none> 只是普通的本地變量橄杨,外部不可見秘症,外部不可訪問
const 一個編譯常量,或者說對一個函數(shù)來說為只讀的參數(shù)
in/varying 從以前階段傳遞過來的變量
in/varying centroid 一個從以前階段傳遞過來的變量式矫,使用質心插值
out/attribute 傳遞到下一個處理階段乡摹,或者在一個函數(shù)中指定一個返回值
out/attribute centroid 傳遞到下一個處理階段,質心插值
Uniform 一個從客戶端代碼傳遞過來的變量采转,在頂點之間不做改變

OpenGL ES 錯誤處理

如果不正確使用OpenGL ES命令聪廉,應用程序就會產(chǎn)生一個錯誤編碼,這個錯誤編碼將被記錄故慈,可以用glGetError查詢板熊。在應用程序使用glGetError查詢查詢第一個錯誤代碼之前,不會記錄其它錯誤代碼察绷。一旦查詢到錯誤代碼干签,當前錯誤代碼便復位為GL_NO_ERROR

GLenum glGetError(void)

錯誤代碼 描述
GL_NO_ERROR 從上一次調用glGetError以來沒有生成任何錯誤
GL_INVALID_ENUM GLenum參數(shù)超出范圍克婶,忽略生成錯誤命令
GL_INVALID_VALUE 數(shù)值型參數(shù)超出范圍筒严,忽略生成錯誤命令
GL_INVALID_OPERATION 特定命令在當前OpenGL ES狀態(tài)無法執(zhí)行
GL_OUT_OF_MEMORY 內(nèi)存不足時執(zhí)行該命令,如果遇到這個錯誤情萤,除非當前錯誤代碼鸭蛙,否則OpenGL ES管線的狀態(tài)被認為未定義

頂點著色器可用的內(nèi)置變量如下表:

名稱 類型 描述
gl_Color vec4 輸入屬性-表示頂點的主顏色
gl_SecondaryColor vec4 輸入屬性-表示頂點的輔助顏色
gl_Normal vec3 輸入屬性-表示頂點的法線值
gl_Vertex vec4 輸入屬性-表示物體空間的頂點位置
gl_MultiTexCoordn vec4 輸入屬性-表示頂點的第n個紋理的坐標
gl_FogCoord float 輸入屬性-表示頂點的霧坐標
gl_Position vec4 輸出屬性-變換后的頂點的位置,用于后面的固定的裁剪等操作筋岛。所有的頂點著色器都必須寫這個值娶视。
gl_ClipVertex vec4 輸出坐標,用于用戶裁剪平面的裁剪
gl_PointSize float 點的大小
gl_FrontColor vec4 正面的主顏色的varying輸出
gl_BackColor vec4 背面主顏色的varying輸出
gl_FrontSecondaryColor vec4 正面的輔助顏色的varying輸出
gl_BackSecondaryColor vec4 背面的輔助顏色的varying輸出
gl_TexCoord[] vec4 紋理坐標的數(shù)組varying輸出
gl_FogFragCoord float 霧坐標的varying輸出

片段著色器的內(nèi)置變量如下表:

名稱 類型 描述
gl_Color vec4 包含主顏色的插值只讀輸入
gl_SecondaryColor vec4 包含輔助顏色的插值只讀輸入
gl_TexCoord[] vec4 包含紋理坐標數(shù)組的插值只讀輸入
gl_FogFragCoord float 包含霧坐標的插值只讀輸入
gl_FragCoord vec4 只讀輸入睁宰,窗口的x,y,z和1/w
gl_FrontFacing bool 只讀輸入肪获,如果是窗口正面圖元的一部分,則這個值為true
gl_PointCoord vec2 點精靈的二維空間坐標范圍在(0.0, 0.0)到(1.0, 1.0)之間柒傻,僅用于點圖元和點精靈開啟的情況下孝赫。
gl_FragData[] vec4 使用glDrawBuffers輸出的數(shù)據(jù)數(shù)組。不能與gl_FragColor結合使用红符。
gl_FragColor vec4 輸出的顏色用于隨后的像素操作
gl_FragDepth float 輸出的深度用于隨后的像素操作青柄,如果這個值沒有被寫伐债,則使用固定功能管線的深度值代替

OpenGL ES紋理繪制大致流程

1、用CAEAGLLayer作為繪制的圖層致开。
2峰锁、EAGLContext作為當前上下文:
3、清空renderBufferframeBuffer双戳,使用到的函數(shù):
4虹蒋、設置RenderBuffer
5、設置frameBuffer
6飒货、繪制

前面五步都是些準備工作魄衅,其中大部分操作都在 6、繪制 這一步中:
視口設置膏斤,創(chuàng)建徐绑、加載、編譯shader(頂點和片元)程序莫辨,鏈接程序傲茄、使用程序,頂點數(shù)據(jù)的傳遞沮榜,紋理的加載盘榨,繪制,呈現(xiàn)到屏幕上蟆融,經(jīng)過這一系列的操作草巡,才能將圖片繪制出來,較為復雜型酥。

我們在此大概了解一下步驟山憨,具體細講解放到下篇文章 OpenGL ES 紋理繪制

相關函數(shù)的查詢可以去 官方手冊弥喉。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郁竟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子由境,更是在濱河造成了極大的恐慌棚亩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虏杰,死亡現(xiàn)場離奇詭異讥蟆,居然都是意外死亡,警方通過查閱死者的電腦和手機纺阔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門瘸彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笛钝,你說我怎么就攤上這事钧栖〉土悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵拯杠,是天一觀的道長。 經(jīng)常有香客問我啃奴,道長潭陪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任最蕾,我火速辦了婚禮依溯,結果婚禮上,老公的妹妹穿的比我還像新娘瘟则。我一直安慰自己黎炉,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布醋拧。 她就那樣靜靜地躺著慷嗜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹壕。 梳的紋絲不亂的頭發(fā)上庆械,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音菌赖,去河邊找鬼缭乘。 笑死,一個胖子當著我的面吹牛琉用,可吹牛的內(nèi)容都是我干的堕绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邑时,長吁一口氣:“原來是場噩夢啊……” “哼奴紧!你這毒婦竟也來了?” 一聲冷哼從身側響起刁愿,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绰寞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铣口,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滤钱,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年脑题,在試婚紗的時候發(fā)現(xiàn)自己被綠了件缸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡叔遂,死狀恐怖他炊,靈堂內(nèi)的尸體忽然破棺而出争剿,到底是詐尸還是另有隱情,我是刑警寧澤痊末,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布蚕苇,位于F島的核電站,受9級特大地震影響凿叠,放射性物質發(fā)生泄漏涩笤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一盒件、第九天 我趴在偏房一處隱蔽的房頂上張望蹬碧。 院中可真熱鬧,春花似錦炒刁、人聲如沸恩沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罗心。三九已至,卻和暖如春绽昏,著一層夾襖步出監(jiān)牢的瞬間协屡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工全谤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肤晓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓认然,卻偏偏與公主長得像补憾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卷员,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354