OpenGL ES API(绑定shader)

OpenGL ES创建一块内存,使用GLSL编写shader,然后触发GPU的shader编译器进行编译。编译好的shader由OpenGL ES控制输入,然后经过shader生成的结果,会被OpenGL ES pipeline的后半段操作使用,最终结果保存在绘制buffer中。

OpenGL ES API

只有当EGL给GL 创建好环境,也就是创建好一套适合 GL API 运行的 surface 和 context,并将它们 makecurrent 之后,GL 的 API 才可以被正常 调用

GLenum glGetError(void);

返回当前thread如果GL的Api出错,最近一个错误对应的错误代码。
输入:空
输出:错误代码
(GL_NO_ERROR :说明自上次执行glGetError以来,所有的GL API运行正常,只要当glGetError返回GL_OUT_OF_MEMORY ,即内存不够,剩下的GL结果会被认为undefine。其他时候,剩余api会忽略错误,继续执行)

GLuint glCreateShader(GLenum shaderType);

创建一个shader的handle(然后把GLSL编写的shader source传入这个handle,才能触发GPU编译shader等后续操作)
输入:shader type(只支持GL_VERTEX_SHADER 和GL_FRAGMENT_SHADER,使用其他token,会报GL_INVALID_ENUM 错误)
输出:非负数字。指定返回的shader object(0为失败,刚被创建的shader object 为空,可存放构建shader所需的shader source)

void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);

往一个shader的handle(shader object)传递shader source
输入:第一个参数shader object(glCreateShader创建的非0值),第二个和第三个参数是:string是个由count个指针元素组成的数组,每个数组元素都是一个无终结的字符串。(GLSL编写的shader将写在这些字符串中。可以把一些格式化的内容如precision lowp float等保存在一个字符串中国,其他内容保存在另一个字符串中,这样无需在每个fragment shader中在编写一边格式化内容)第四个参数也是一个数组,对应string,用于限制string数组中对应的数组元素的字符串长度。(若为负,对应的字符串长度无限长,若数组为NULL吗,则string中所有字符串无限长)
输出:空

void glCompileShader(GLuint shader);

把一个已经包含shader source内容的shader发给GPU进行编译(一般程序是在CPU进行编译)
输入:shader object
输出:空 (但每个shader object有个bool值Compile_status,该值会根据编译结果进行修改,编译成功为true,否则false。该值可通过GetShaderiv这个api查询。每个shader object有个information log,是string,在每次编译会被重写,包含编译信息,可通过glGetShaderInfoLog查看)

void glShaderBinary(GLsizei n, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)

某些 GPU 并不支持 shader compiler,可通过 glGet 输入 GL_SHADER_COMPILER 这个参数来查询。若不支持的话,那 么 glshadersource 、 glCompilerShader 、 glGetShaderPrecisionFormat 、 glReleaseShaderCompiler 会报 错。这时,通常GPU会支持glShaderBinary,来load一个编译好的shader binary。节省GPU编写shader的时间
输入:第一个和第二个参数:shaders是包含n个shader object的数组。若存放了两个相同类型的shader(如两个VS shader),会报错。第三个参数:预编译shader的格式。(支持的格式可由参数NUM_SHADER_BINARY_FORMATS 和 SHADER_BINARY_FORMATS 查询到,若GPU不支持glshaderbinary,则查询会报错)shader将会格局binaryformat来进行解码成一个类似编译好的shader,交个GPU。第四个参数:指向预编译shader binary的指针,第五个参数:限定shader binary的长度。
输出:空

GLuint glCreateProgram(void);

创建一个program object。(在一个完整的OpenGL ES的pipeline中,最终交给GPU使用的,一次只能是一组VS和PS,把两个shader放入program对象,再将该对象交给GPU)
输入:空
输出:非负数,指定返回的program object,失败为0 。(与shader object使用同一个namespace,即可被多个共享的context共享)

void glAttachShader(GLuint program,GLuint shader);

把shader关联到program对象
输入:program对象,shader对象(glCreateShader创建的非0值)
输出:空
(一个program只能关联一个同类型的shader,否则报错)

void glDetachShader(GLuint program, GLuint shader);

把shader从program上解绑,以此来替换同类型的shader
输入:program对象和shader对象
输出:空
(如果传入的shader未绑定在传入的program,也会报错)
若一个shader已被被绑定到program上,删除shader,不会被立即删除,而是做一个标记,直到该shader从program解绑才会执行删除操作

void glLinkProgram(GLuint program);

封住program,使其中的VS和PS组成一对,成为一个完整的新个体。
输入:program对象
输出:空
(每个program对象都有一个bool值Link_status,根据link的结果进行修改,链接成功,且创建了一个有效可执行文件这被设为true,否则false,可通过glGetProgramiv查询,每个program object有个information log在每次link会被重写,包含链接信息,可通过glGetProgramInfoLog查看)
link成功后,所有shader中开发者定义的active的uniform都会被初始化为0,然后被分配一个地址(可通过glGetUniformLocation 获取地址)shader中attribute若为被指定的index绑定,也会分配一个index
当 program 被 link 之后,该 program 对应的 shader 可以被修改、重新编译、 detach、attach 其他 shader 等操作,而这些操作不会影响 link 的 log 以及 program 的可执行文件。

void glUseProgram(GLuint program);

指定使用program(一个程序同一时间只能使用一个program),即把program的可执行文件当做当前rendering state的一部分。
输入:program对象。
输出:空
如果被使用的program被relink成功,则新生村的可执行文件会替换掉当前rendering state中使用的可执行文件。若relink失败,做linkstatus为false,当前rendering state使用之前可用的可执行文件,知道另一个program被使用。

void glDeleteProgram(GLuint program);

删除program
输入:program对象
输出:空
(若program不被任何GL Context使用,则立即删除,否则,做标记,知道GL context不在使用,执行删除操作。可通过glGetProgramiv 传入GL_DELETE_STATUS 查询delete标记,删除后,所有的shader都会被detach)

void glDeleteShader(GLuint shader);

删除shader
输入:shader对象
输出:空
(删除机制同解绑,通过glGetShaderiv 传入GL_DELETE_STATUS 查询delete标记)

void glReleaseShaderCompiler(void);

释放ShaderCompiler相关资源。在一段时间内不会编译shader,可以释放shader编译器相关资源。
输入:空
输出:空

3.0

void glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);

将已经生成的program生成program binary。下次使用,不需要在生成shader,编译shader,link program等,可直接通过program binary生成program
输入:第一个参数:已经生成program。第二个参数:存放binary的最大尺寸。第五个参数:存放binary。第三个参数:存放实际存放的binary的尺寸。第四个参数:存放实际存放binary的格式
输出:空

void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);

将上个函数获取到的program binary生成program
输入:第一个参数:指定将生成的program,第二三四为glGetProgramBinary获取到的参数。(length也可通过glGetProgramiv传入PROGRAM_BINARY_LENGTH 获取在这里插入代码片

你可能感兴趣的:(OpenGL,ES,学习笔记,opengles,shader)