Opengl ES是opengl的一个分支,opengl es集中了opengl中高效的绘图功能部分,省去了低效繁杂的绘图功能部分,主要应用于手持和嵌入式设备的3D绘图,突出的优点就是处理快,消耗小。
Opengl就是一个状态机,只对当前绑定的纹理进行操作,如果需要对其他纹理进行操作,需要先解绑再绑定别的纹理。
- 创建绘图窗口
ESContest有一个类型为void*名为userData的参数,该参数就是专门提供给开发者使用,开发者将自己定义的参数全部放在userData中。
esCreateWindow ( esContext, "窗口名称", weigth, height, ES_WINDOW_RGB/*显示图像的格式*/ );
- 着色器
着色器对象和程序对象是使用opengl es的基础。
-
- 着色器对象
使用glCreatShader创建一个着色器,接着使用glShaderSource读取着色器,使用glCompileShader编译着色器,再使用glGetShaderiv检查着色器编译是否正确,以上这些步骤其实都已经集成在opengl内部库中,只需要调用esLoadShader便可以完成,但是我们实际操作过程中也不用esLoadShader,而是直接使用程序对象。
-
- 程序对象
通过esLoadProgram直接读取顶点着色器和片段着色器到programobject,后续直接对programobject进行相关操作即可;
- 顶点着色器
3.1 #version 300 es:
是使用openglES 3.0的标志,第一行必须写这个,系统读取顶点着色器时,会先根据第一行判断是那个版本,然后再读取下面的数据。
3.2 精度限定符:(顶点和片段着色器都有)
精度关键字有lowp、mediump、highp分别对应低、中、高精度;
其中为float指定精度则只作用于float类型的参数,int同理,这里只列出了float类型的精度:
precision mediump float;
precision highp float;
在顶点着色器中可以不写精度限定符,系统默认为highp(因为顶点着色器中通常都是顶点、位置、法线、纹理坐标等变换操作,必须要highp类型,而颜色计算、照明方式可以选用mediump)。
3.3 统一变量声明
uniform mat4 u_mvpMatrix;
uniform统一变量声明的标识符,这里声明一个4*4的MVP矩阵,即模型-视图-投影矩阵。
3.4 layout(location = 0) in vec4 a_position;
Layout限定符,后面跟着的location对应的就是顶点属性的索引,顶点属性的索引的用法后面介绍;in:代表输入的意思;这里还隐藏了默认的插值限定符,默认的是smooth(平滑着色),即smooth in vec4 a_position,同时插值限定符还有flat(平面着色),centroid(质心采样),使用多重采样时,质心采样可以强制插值发生在被渲染图元的内部(否则图元边缘可能出现伪像)smooth centroid in vec3 v_color;
3.5 out vec4 v_color;
这里out意思就是输出,但是这里的输出参数v_color是传递给片段着色器的,也就是说顶点着色器的输出都是片段着色器的输入;
3.6 main函数
这里的main函数便是整个代码的入口,opengl会首先找到main函数,并从这里开始执行代码,而顶点着色器的输入变量需要在后续代码中输入;这里的gl_Position是内建特殊变量,用于输出顶点位置的裁剪坐标。注意代码最后的分号,顶点着色器和片段着色器都有这个分号!