美文网首页
OpenGL ES基础概念

OpenGL ES基础概念

作者: Maji1 | 来源:发表于2020-08-03 22:16 被阅读0次

使用这个简洁、高效的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.XOpenGL 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、清空renderBufferframeBuffer,使用到的函数:
4、设置RenderBuffer
5、设置frameBuffer
6、绘制

前面五步都是些准备工作,其中大部分操作都在 6、绘制 这一步中:
视口设置,创建、加载、编译shader(顶点和片元)程序,链接程序、使用程序,顶点数据的传递,纹理的加载,绘制,呈现到屏幕上,经过这一系列的操作,才能将图片绘制出来,较为复杂。

我们在此大概了解一下步骤,具体细讲解放到下篇文章 OpenGL ES 纹理绘制

相关函数的查询可以去 官方手册。

相关文章

网友评论

      本文标题:OpenGL ES基础概念

      本文链接:https://www.haomeiwen.com/subject/qialrktx.html