使用这个简洁、高效的OpenGL子集创建3D和2D图形效果。
OpenGL ES为硬件加速的2D和3D图形渲染提供了一个基于C的接口。iOS中OpenGL ES框架(OpenGLES.framework
)提供了OpenGL ES规范1.1、2.0和3.0版的实现。
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 状态。
- 绘制表⾯ :是⽤于绘制图元的表⾯,它指定渲染所需要的缓存区类型,例如 颜色缓存区、深度缓冲区、模板缓存区。
OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原⽣生窗⼝系统。
EGL(Embedded Graphics Library)嵌入式图形库
EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗⼝系统之间的接口。唯一支持 OpenGL ES 却不支持EGL 的平台是iOS。iOS支持的是EAGL,与EGL功能基本一致。
EGL的主要功能:
- 和本地窗⼝系统(native windowing system)通讯。
- 查询可用的配置。
- 创建OpenGL ES可用的“绘图表面(drawing surface)”
- 同步不同类别的API之间的渲染,⽐如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间。
- 管理“渲染资源”,⽐如纹理映射(rendering map)。
EAGL
提供了封装所有OpenGL ES状态的图形上下文,并能够将核心动画层配置为OpenGL ES绘图命令的目标。EAGL还允许OpenGL ES对象(如纹理、renderbuffers和framebuffers)在两个或多个图形上下文之间共享。
OpenGL ES中向量数据类型
类型 | 描述 |
---|---|
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型向量 |
矩阵数据类型
类型 | 描述 |
---|---|
mat2,mat2x2 | 两行两列 |
mat3,mat3x3 | 三行三列 |
mat4,mat4x4 | 四行四列 |
mat2x3 | 三行两列 |
mat2x4 | 四行两列 |
mat3x2 | 两行三列 |
mat3x4 | 四行三列 |
mat4x2 | 两行四列 |
mat4x3 | 三行四列 |
注意⚠️: mat列x行
变量存储限定符
限定符 | 描述 |
---|---|
<none> | 只是普通的本地变量,外部不可见,外部不可访问 |
const | 一个编译常量,或者说对一个函数来说为只读的参数 |
in/varying | 从以前阶段传递过来的变量 |
in/varying centroid | 一个从以前阶段传递过来的变量,使用质心插值 |
out/attribute | 传递到下一个处理阶段,或者在一个函数中指定一个返回值 |
out/attribute centroid | 传递到下一个处理阶段,质心插值 |
Uniform | 一个从客户端代码传递过来的变量,在顶点之间不做改变 |
OpenGL ES 错误处理
如果不正确使用OpenGL ES命令,应用程序就会产生一个错误编码,这个错误编码将被记录,可以用glGetError
查询。在应用程序使用glGetError
查询查询第一个错误代码之前,不会记录其它错误代码。一旦查询到错误代码,当前错误代码便复位为GL_NO_ERROR
。
GLenum glGetError(void)
错误代码 | 描述 |
---|---|
GL_NO_ERROR |
从上一次调用glGetError 以来没有生成任何错误 |
GL_INVALID_ENUM |
GLenum参数超出范围,忽略生成错误命令 |
GL_INVALID_VALUE |
数值型参数超出范围,忽略生成错误命令 |
GL_INVALID_OPERATION |
特定命令在当前OpenGL ES状态无法执行 |
GL_OUT_OF_MEMORY |
内存不足时执行该命令,如果遇到这个错误,除非当前错误代码,否则OpenGL ES管线的状态被认为未定义 |
顶点着色器可用的内置变量如下表:
名称 | 类型 | 描述 |
---|---|---|
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 | 纹理坐标的数组varying输出 |
gl_FogFragCoord | float | 雾坐标的varying输出 |
片段着色器的内置变量如下表:
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 包含主颜色的插值只读输入 |
gl_SecondaryColor | vec4 | 包含辅助颜色的插值只读输入 |
gl_TexCoord[] | vec4 | 包含纹理坐标数组的插值只读输入 |
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输出的数据数组。不能与gl_FragColor结合使用。 |
gl_FragColor | vec4 | 输出的颜色用于随后的像素操作 |
gl_FragDepth | float | 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |
OpenGL ES纹理绘制大致流程
1、用CAEAGLLayer
作为绘制的图层。
2、EAGLContext
作为当前上下文:
3、清空renderBuffer
和frameBuffer
,使用到的函数:
4、设置RenderBuffer
5、设置frameBuffer
6、绘制
前面五步都是些准备工作,其中大部分操作都在 6、绘制 这一步中:
视口设置,创建、加载、编译shader(顶点和片元)
程序,链接程序、使用程序,顶点数据的传递,纹理的加载,绘制,呈现到屏幕上,经过这一系列的操作,才能将图片绘制出来,较为复杂。
我们在此大概了解一下步骤,具体细讲解放到下篇文章 OpenGL ES 纹理绘制。
相关函数的查询可以去 官方手册。
网友评论