参考OpenGL编程指南 第8版
VAO
void glGenVertexArrays(GLsizei n, GLuint *arrays); 返回n个未使用的对象名到数组arrays中,用作顶点数组对象。
void glBindVertexArray(GLuint array); array 非 0,并且是glGenVertexArrays() 所返回的,那么它将创建一个新的顶点数组对象并且与其名称关联起来。如果绑定到一个已经创建的顶点数组对象中,那么会激活这个顶点数组对象。
void glDeleteVertexArrays(GLsizei n, GLuint *arrays); 删除 n 个在 arrays 中定义的顶点数组对象。
GLboolean glIsVertexArray(GLuint array); 如果 array 是一个已经用 glGenVertexArrays() 创建且没有被删除的顶点数组对象的名称,那么返回 GL_TRUE。
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); pointer 表示缓存对象中,从起始位置开始计算的数组数据的偏移值(假设起始地址为 0) ,使用基本的系统单位(byte) 。size 表示每个顶点需要更新的分量数目,可以是 1、2、3、4 或者 GL_BGRA。type 指定了数组中每个元素的数据类型(GL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FIXED、GL_HALF_FLOAT、GL_FLOAT 或 GL_DOUBLE) 。normalized 设置顶点数据在存储前是否需要进行归一化(或者使用 glVertexAttribFourN*() 函数) 。stride 是数组中每两个元素之间的大小偏移值(byte) 。如果 stride 为 0,那么数据应该紧密地封装在一起。
void glEnableVertexAttribArray(GLuint index);
void glDisableVertexAttribArray(GLuint index);
设置是否启用与 index 索引相关联的顶点数组。index 必须是一个介于 0 到 GL_MAX_VERTEX_ATTRIBS-1 之间的值。
Buffer
void glGenBuffers(GLsizei n, GLuint *buffers); 返回 n 个当前未使用的缓存对象名称,并保存到 buffers 数组中。
void glBindBuffer(GLenum target, GLuint buffer); 指定当前激活的缓存对象。target :GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER、GL_PIXEL_UNPACK_BUFFER、GL_COPY_READ_BUFFER、GL_COPY_WRITE_BUFFER、GL_TRANSFORM_FEEDBACK_BUFFER 和 GL_UNIFORM_BUFFER。buffer 设置的是要绑定的缓存对象名称。
void glDeleteBuffers(GLsizei n, const GLuint *buffers); 删除 n 个保存在 buffers 数组中的缓存对象。
GLboolean glIsBuffer(GLuint buffer);
void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); target 设置为 GL_ARRAY_BUFFER;索引数据为 GL_ELEMENT_ARRAY_BUFFER ;纹理数据为 GL_TEXTURE_BUFFER ;对于通过 transform feedback 着色器获得的结果设置为GL_TRANSFORM_FEEDBACK_BUFFER;一致变量设置为 GL_UNIFORM_BUFFER。size 表示存储数据的总数量。这个数值等于 data 中存储的元素的总数乘以单位元素存储空间的结果。如果传入 NULL,那么将保留 size 大小的未初始化的数据,以备后用。usage 可用的方式包括 GL_STATIC_DRAW、GL_STATIC_READ、GL_DYNAMIC_DRAW、GL_DYNAMIC_READ 等。
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
使用新的数据替换缓存对象中的部分数据。绑定到 target 的缓存对象要从 offset 字节处开始需要使用地址为 data、大小为 size 的数据块来进行更新。
void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data);
void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLintptr size, GLenum format, GLenum type, const void* data);
void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintprr writeoffset, GLsizeiptr size);
将绑定到
readtarget 的缓存对象的一部分存储数据拷贝到与 writetarget 相绑定的缓存对象的数据区域上。
void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);
返回当前绑定到
target 的缓存对象中的部分或者全部数据。起始数据的偏移字节位置为 offset,回读的数据大小为 size
个字节,它们将从缓存的数据区域拷贝到 data 所指向的内存区域中。
其他
void glClear(GLbitfield mask);
清除指定的缓存数据并重设为当前的清除值。
void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
设置当前使用的清除颜色值,用于 RGBA 模式下对颜色缓存的清除工作。
void glFlush(void);
强制之前的 OpenGL 命令立即执行。
void glFinish(void);
强制所有当前的 OpenGL 命令立即执行,并且等待它们全部完成。
void glEnable(GLenum capability);
void glDisable(GLenum capability);
glEnable() 开启一个模式,glDisable() 关闭它。
GLboolean glIsEnabled(GLenum capability);
根据是否启用当前指定的模式,返回 GL_TRUE 或者 GL_FALSE。
Shader
GLint glGetUniformLocation(GLuint program, const char* name);
返回着色器程序中 uniform 变量 name 对应的索引值。name 是一个以 NULL 结尾的字符串,不存在空格。
void glUniform{1234}{fdi ui}(GLint location, TYPE value);
void glUniform{1234}{fdi ui}v(GLint location, GLsizei count, const TYPE* values);
void glUniformMatrix{234}{fd}v(GLint location, GLsizei count, GLboolean transpose, const GLfloat* values);
void glUniformMatrix{2x3,2x4,3x2,3x4,4x2,4x3}{fd}v(GLint location, GLsizei count, GLboolean transpose, const GLfloat* values);
设置与 location 索引位置对应的 uniform 变量的值。其中向量形式的函数会载入count 个数据的集合(根据 glUniform*() 的调用方式,读入 1 ~ 4 个值) ,并写入 location位置的 uniform 变量。如果 location 是数组的起始索引值,那么数组之后的连续 count 个元素都会被载入。GLfloat 形式的函数(后缀中有 f)可以用来载入单精度类型的浮点数、float 类型的向量、float 类型的数组、或者 float 类型的向量数组。与之类似,GLdouble 形式的函数(后缀中有 d)可以用来载入双精度类型的标量、向量和数组。GLfloat 形式的函数也可以载入布尔数据。
GLuint glCreateShader(GLenum type);
分配一个着色器对象。type 必须是 GL_VERTEX_SHADER、GL_FRAGMENT_SHADER、GL_TESS_CONTROL_SHADER、GL_TESS_EVALUATION_SHADER 或 者GL_GEOMETRY_SHADER 中的一个。返回值可能是一个非零的整数值,如果为 0 则说明发生了错误。
void glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length);
将着色器源代码关联到一个着色器对象 shader 上。
void glCompileShader(GLuint shader);
编译着色器的源代码。
void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, char* infoLog);
返回 shader 的最后编译结果。返回的日志信息是一个以 NULL 结尾的字符串,它保存在 infoLog 缓存中,长度为 length 个字符串。日志可以返回的最大值是通过 bufSize 来定义的。如果 length 设置为 NULL,那么将不会返回 infoLog 的大小。
GLuint glCreateProgram(void);
创建一个空的着色器程序。
void glAttachShader(GLuint program, GLuint shader);
将着色器对象 shader 关联到着色器程序 program 上。
void glDetachShader(GLuint program, GLuint shader);
移除着色器对象 shader 与着色器程序 program 的关联。
void glLinkProgram(GLuint program);
处理所有与 program 关联的着色器对象来生成一个完整的着色器程序。
void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, char* infoLog);
返回最后一次 program 链接的日志信息。日志返回的字符串以 NULL 结尾,长度为 length 个字符,保存在 infoLog 缓存中。log 可返回的最大值通过 bufSize 指定。如果length 为 NULL,那么不会再返回 infoLog 的长度。
void glUseProgram(GLuint program);
使用链接过的着色器程序 program。
void glDeleteShader(GLuint shader);
删除着色器对象 shader。
void glDeleteProgram(GLuint program);
立即删除一个当前没有在任何环境中使用的着色器程序 program,如果程序正在被某个环境使用,那么等到它空闲时再删除。
GLboolean glIsShader(GLuint shader);
如果 shader 是一个通过 glCreateShader() 生成的着色器对象的名称,并且没有被删除,那么返回 GL_TRUE。
GLboolean glIsProgram(GLuint program);
如果 program 是一个通过 glCreateProgram() 生成的程序对象的名称,并且没有被删除,那么返回 GL_TRUE。
绘制
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
使用当前绑定的顶点数组元素来建立一系列的几何图元,起始位置为
first,而结束位置为 first + count-1。mode 设置了构建图元的类型,它可以是
GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN
和 GL_PATCHES 中的任意一种。
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
使用数组元素建立连续的几何图元序列,每个启用的数组中起始位置为 first,结束位置为 first + count–1。mode 表示构建图元的类型,它必须是 GL_TRIANGLES、GL_LINE_LOOP、GL_LINES、GL_POINTS 等类型标识符之一。
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
使用 count 个元素来定义一系列几何图元,而元素的索引值保存在一个绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓存中(元素数组缓存,element array buffer) 。indices 定义了元素数组缓存中的偏移地址,也就是索引数据开始的位置,单位为字节。type 必须是 GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT 或者 GL_UNSIGNED_INT 中的一个,它给出了元素数组缓存中索引数据的类型。mode 定义了图元构建的方式,它必须是图元类型标识符中的一个,例如 GL_TRIANGLES、GL_LINE_LOOP、GL_LINES 或者 GL_POINTS。
void glMultiDrawArrays(GLenum mode, const GLint* first, const GLint* count, GLsizei primcount);
在一个 OpenGL 函数调用过程中绘制多组几何图元集。 first 和 count 都是数组的形式,数组的每个元素都相当于一次 glDrawArrays() 调用,元素的总数由 primcount 决定。
void glMultiDrawElements(GLenum mode, const GLint* count, GLenum type, const GLvoid* const* indices, GLsizei primcount);
在一个 OpenGL 函数调用过程中绘制多组几何图元集。fi rst 和 indices 都是数组的形式,数组的每个元素都相当于一次 glDrawElements() 调用,元素的总数由 primcount 决定。