OpenGL ES 是一个方便为嵌入式设备进行绘图的API ,相对于OpenGL而言,OpenGL ES 更加高效简洁。
OpenGLES 实现了具有可编程着色功能的图形管线,由两个规范组成:OpenGL ES 3.0API 规范和OpenglES 着色语言3.0规范。
下图有阴影的方框标识OpenGLES中管线的可编程阶段:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ts47Zak7-1578804527647)(evernotecid://44BEC8F1-2D61-4D72-8317-0554A2C29B3C/appyinxiangcom/14389767/ENResource/p38)]
OpenGL ES的简单使用可以总结为以下几个步骤:
其中顶点着色器和片段着色器就是在OpenGL ES 中的可编程阶段。其他地方都是
在OpenGL 中,一个项目只会有一个顶点着色器和一个片段着色器。其他着色器数量没有限制。
着色器的初始化流程可分为:
整个流程可见下列代码
GLuint IJK_GLES2_loadShader(GLenum shader_type, const char *shader_source)
{
assert(shader_source);
// 创建着色器
GLuint shader = glCreateShader(shader_type); IJK_GLES2_checkError("glCreateShader");
if (!shader)
return 0;
assert(shader_source);
// 为着色器提供源码
glShaderSource(shader, 1, &shader_source, NULL);
// 检查上一句的gl语言是否存在错误
IJK_GLES2_checkError_TRACE("glShaderSource");
// 编译着色器
glCompileShader(shader); IJK_GLES2_checkError_TRACE("glCompileShader");
GLint compile_status = 0;
// 获取着色器编译结果
glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
if (!compile_status)
goto fail;
return shader;
fail:
if (shader) {
IJK_GLES2_printShaderInfo(shader);
glDeleteShader(shader);
}
return 0;
}
从上述的过程中,我们可以分别创建顶点着色器和片段着色器。在创建着色器完成之后,我们需要创建OpenGL ES对应的项目program
,并将着色器和项目进行连接。
glCreateProgram(GLuint program)
创建项目renderer->program = glCreateProgram();
glAttachShader(renderer->program, renderer->vertex_shader); IJK_GLES2_checkError("glAttachShader(vertex)");
glAttachShader(renderer->program, renderer->fragment_shader); IJK_GLES2_checkError("glAttachShader(fragment)");
6.使用glLinkProgram(GLuint program)
链接创建的项目
glLinkProgram(renderer->program); IJK_GLES2_checkError("glLinkProgram");
7.链接完成后使用glGetProgramiv
监测连接是否成功
glGetProgramiv(renderer->program, GL_LINK_STATUS, &link_status);
if (!link_status)
goto fail;
在上述的步骤:创建着色器、指定源、编译着色器、检查错误、创建项目对象,附加上着色器、链接项目、检查链接错误 成功后可以使用项目对象进行渲染。为使用项目对象去渲染,
8. 使用glUseProgram
进行渲染绑定
glUseProgram(renderer->program);
glViewport(0, 0, _backingWidth, _backingHeight);
由glviewport
方法通知OpenGL ES绘制2D渲染表面的原点、宽度和高度。
在OpenGL ES zhong , Viewport
定义所有opengles 渲染操作最终显示的2D 矩形。
在设置了视口之后,下一步是清除屏幕。
glClear(GL_COLOR_BUFFER_BIT);
清除颜色缓冲区之后就可以加载几何形状和绘制图元
显示后台缓冲
在OpenGL 中,如果我们直接将数据绘制到缓冲区时,在部分更新帧缓冲区时会看到伪像,为了解决这个问题,我们使用所谓的双缓冲区域,它位于后台不可见屏幕的内存区域,当所有渲染完成,和前台的可见缓冲区进行互换。
eglSwapBuffer(esContext->eglDisplay, esContext->eglSurface);
在计算机图形学中,转换有两种基本的数据类型:矢量和矩阵。这个也是OpenGL ES的中心类型。
变量类型 | 描述 |
---|---|
float,int,bool | 标量数据类型浮点型、整形、布尔值 |
float,vec2,vec3,vec4 | 浮点型矢量,1、2、3、4维 |
int,ivec2,ivec3,ivec4 | 整形矢量,1、2、3、4维 |
mat2, mat3, mat4 | 浮点类型矩阵 2x2,3x3,4x4 |
变量必须先声明,像下面一样:
float spe;
vec3 vposition;
变量可以在声明时初始化,或者以后初始化,初始化是通过构造函数进行,也可进行类型的转换,变量构造函数。
在OpenGL ES中不允许使用变量作为数组的索引,仅仅支持常量表达式。在运算中,执行运算符的变量必须有相同的类型,二进制运算符(* / + -) 必须是浮点变量或者是整形变量。乘 运算能够在浮点、矢量、矩阵的组合中进行。
比较运算符(= < > !=)仅仅能够执行标量,矢量有专门的比较函数