OpenGL ES基本概念

OpenGL ES的版本

OpenGL ES 1.X:用于固定功能流水管线硬件
OpenGL ES 2.X:用于可编程功能流水管线硬件
OpenGL ES 3.X:OpenGL ES 2.0 的拓展

EGL (Embedded Graphics Library)
  • OpenGL ES命令需要渲染上下文和绘制表面才能完成图形图像的绘制
  • 渲染上下文:存储相关OpenGL ES状态
  • 绘制表面:是用于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜色缓存区、深度缓存区和模板缓存区
  • OpenGL ES API 没有提供如何创建渲染上下文或者上下文如何链接到原生窗口系统。EGL是Khronos 渲染API(如OpenGL ES) 和原⽣窗口系统之间的接口。iOS平台支持OpenGL ES,却不支持EGL

EGL主要功能
1.和本地窗口系统通讯
2.查询可用的配置
3.创建OpenGL ES绘图表面
4.同步不同类别的API之间的渲染。如在OpenGL ESOpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间
5.管理渲染资源,比如纹理映射(rendering map)

GLSL语言

GLSL(OpenGL着色语言OpenGL Shading Language) 在可编程管线中,我们必须手写顶点着色器和片元着色器,我们必须使用GLSL自行编译、链接、使用着色器代码。
下面介绍一下GLSL的简单语法

基本数据类型

除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下表:

数据类型 描述
void 跟C语言的void类似,表示空类型。作为函数的返回类型,表示这个函数不返回值。
bool 布尔类型,可以是true 和false,以及可以产生布尔型的表达式。
int 整型 代表至少包含16位的有符号的整数。可以是十进制的,十六进制的,八进制的。
float 浮点型
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 三行四列
sampler1D 用于内建的纹理函数中引用指定的1D纹理的句柄
sampler2D 二维纹理句柄
sampler3D 三维纹理句柄
samplerCube cube map纹理句柄
sampler1DShadow 一维深度纹理句柄
sampler2DShadow 二维深度纹理句柄

变量存储限定符

限定符 描述
只是普通的本地变量,外部不可见
const 一个编译常量,或者说是一个函数的只读的参数
in/varying 从以前阶段传递过来的变量
in/varying centroid 一个从以前的阶段传递过来的变量,使用质⼼插值
out/attribute 传递到下一个处理阶段或者一个函数中指定一个返回值
out/attribute centroid 传递到下一个阶段,质心插值
uniform 一个从客户端传递过来的变量,在顶点之间不做改变

内置变量
内置变量可以与固定函数功能进行交互,使用前不需要声明。

顶点着色器的内置变量表:

名称 类型 描述
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 错误处理

如果不正确使用OpenGL ES代码,应用程序就会产生一个错误代码,这个代码将会被记录,可以用glGetError查询。在应用程序用glGetError查询到错误代码之前,不会记录其他错误代码。一旦查询到错误代码,当前的错误代码便复位为GL_NO_ERROR

错误代码 描述
GL_NO_ERROR 从上一次调用glGetError以来没有生成任何错误
GL_INVALID_ENUM GLenum参数超出范围,忽略生成错误命令
GL_INVALID_VALUE 数值型 参数超出范围,忽略生成错误命令
GL_INVALID_OPERATION 特定命令在当前 OpenGL ES状态无法执行
GL_OUT_OF_MEMORY 内存不足时执行该命令,除非当前错误代码,否则OpenGL ES管线的状态被认为未定义

你可能感兴趣的:(OpenGL ES基本概念)