使用這個簡潔、高效的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.X
:OpenGL 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、清空renderBuffer
和frameBuffer
双戳,使用到的函數(shù):
4虹蒋、設置RenderBuffer
5、設置frameBuffer
6飒货、繪制
前面五步都是些準備工作魄衅,其中大部分操作都在 6、繪制 這一步中:
視口設置膏斤,創(chuàng)建徐绑、加載、編譯shader(頂點和片元)
程序莫辨,鏈接程序傲茄、使用程序,頂點數(shù)據(jù)的傳遞沮榜,紋理的加載盘榨,繪制,呈現(xiàn)到屏幕上蟆融,經(jīng)過這一系列的操作草巡,才能將圖片繪制出來,較為復雜型酥。
我們在此大概了解一下步驟山憨,具體細講解放到下篇文章 OpenGL ES 紋理繪制。
相關函數(shù)的查詢可以去 官方手冊弥喉。