@startuml
(*)  --> 创建着色器程序
partition 创建着色器程序 {
--> glCreateProgram()\n创建一个空的程序对象，这个对象能被着色器shader附着(attached)
--> 添加顶点着色器or片元着色器start
--> glCreateShader (GLenum type)\n创建顶点着色器shader
--> glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length)\n加载着色器代码
--> glCompileShader (GLuint shader)\n编译代码
--> 添加顶点着色器or片元着色器end
--> glAttachShader (GLuint program, GLuint shader)\n将着色器附着到程序
--> glLinkProgram (GLuint program)\n链接程序
--> "为了后面便于操作着色器中的变量
在这里可以把着色器中变量的位置都获取并记录
glGetAttribLocation/glGetUniformLocation"
--> glUseProgram (GLuint program)\n使用创建的程序

--> 创建纹理并绑定到纹理单元
}

partition 创建纹理并绑定到纹理单元 {
--> glGenTextures (GLsizei n, GLuint *textures);\n创建一个纹理
--> glActiveTexture (GLenum texture);\n选择当前活跃的纹理单元
--> glBindTexture (GLenum target, GLuint texture);\n将纹理绑定到纹理单元
--> "glTexParameterf(GLenum target, GLenum pname, GLfloat param);
配置纹理过度参数"
--> 使用图像更新纹理
}

partition 使用图像更新纹理 {
--> "glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width,
                  GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
                  使用图像更新纹理"
--> 绘制
}

partition 绘制 {
--> glEnableVertexAttribArray (GLuint index);\n启用着色器中的属性
--> "glVertexAttribPointer (GLuint index, GLint size,
GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
对着色器中的属性赋值"
--> "glDrawArrays (GLenum mode, GLint first, GLsizei count);
渲染"
note left
   渲染之后有的并不能显示，
   需要调用EGL的eglSwapBuffers来显示
end note
}

-->(*)
@enduml