第一章 OpenGL概述
1.4 OpenGL渲染管线
openGL管线
1.5 第一个程序:深入分析
初始化顶点数组对象
顶点数组对象负责保存一系列顶点的数据,数据保存在顶点缓存对象中,并由当前绑定的顶点数组对象管理。
分配顶点数组对象
void glGenVertexArrays(GLsizei n, GLunit* arrays)
返回n个未使用的对象名到数组arrays当中,用作顶点数组对象。返回的名字可以用来分配更多的缓存对象,并且他们已经使用为舒适化的顶点数组集合的默认状态进行了数值的初始化
创建并绑定一个顶点数组对象
void glBindVertexArray(GLuint array);
完成三项工作。如果array非0,且由glGenVertexArrays返回,则创建一个顶点数组对象并与其名称关联起来。如果绑定到一个已经创建的顶点数组对象,则会激活它。如果array为0,则OpenGL将不再使用程序分配的任何顶点数组对象,并将渲染状态重设为顶点数组的默认状态。
释放顶点数组对象
void glDeleteVertexArrays(GLsizei n, GLuint* arrays)
删除n个在arrays中定义的顶点数组对象,这样所有名称可以再次用作顶点数组。如果绑定的顶点数组已被删除,那么当前绑定的顶点数组对象则会被重置为0,默认顶点数组会变成当前对象。在arrays中的未使用的名称都会被释放,当前顶点数组的状态不会发生变化。
检查某个名称是否是被保留的顶点数组对象
GLboolean glIsVertexArray(GLuint array)
如果array是一个已经用glGenVertexArrays创建并没有被删除的名称,则返回GL_TRUE。如果array为0或者不是顶点数组的名称,返回GL_FALSE。
分配顶点缓存对象
创建顶点缓存对象名称
void glGenBuffers(GLsizei n, GLuint * buffers)
返回n个未被使用的缓存对象名称,并保存到buffers当中,不一定是连续的。
名称只用于分配其他缓存对象,绑定后只会记录一个可用状态。
指定当前激活缓存对象
void glBindBuffer(GLenum target, GLuint buffer)
完成三项工作。如果第一次绑定buffer,且是一个非零无符号整数,则创建一个与该名称对应的缓存对象。如果绑定一个已经创建的缓存对象,则是指为当前激活的缓存对象。如果buffer为0,那么不将对当前target应用任何缓存对象。
taget类型包括: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, GLuint * buffers)
删除n个在buffers中定义的缓存对象,这样所有名称可以再次被重用。如果绑定的缓存对象已被删除,那么当前绑定的缓存对象则会被重置为0。如果尝试删除不存在的缓存对象操作将被忽略。
检查某个名称是否是缓存对象
GLboolean glIsBuffer(GLuint buffer)
如果buffer是一个已经分配且没有被释放的缓存对象名称,则返回GL_TRUE。如果buffer是0或者不是缓存对象名称返回GL_FALSE。
将数据载入缓存对象
void glBufferData(GLenum target, GLsizeptr size, const GLvoid* data, GLenum usage)
在OpenGL服务端分配size个存储单元(通常为byte),用于数据的存储或索引。如果当前绑定的对象已经存在关联的数据,那么会首先删除这些数据。
target与glBindBuffer的target类型对应。
size表示数据总量,数值为data中数据数量乘以每个元素的存储空间。
data是一个客户端内存指针,如果不为NULL,那么size大小的数据将要从客户端传送到服务端。如果传入NULL,则保留size大小为初始化的数据以备后用。
usage是数据读取写入方式。
如果size大小超过服务端可分配的额度返回GL_OUT_OF_MEMORY错误。如果usage是不可用的模式,产生GL_INVALID_VALUE错误。
OpenGL只能绘制NDC中的顶点坐标,所以最终的顶点坐标分量范围要在[-1, 1]中。
VAO与VBO的关系
http://www.cnblogs.com/icyhusky/p/10679757.html
关联顶点着色器输入数据
void glVertexArrayPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer)
设置index(着色器中属性位置,layout(location=)指定)位置对应的数据值。
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设置顶点数据是否被归一化。
stride是数组中每两个元素之间的偏移。如果为0,那么数据应该紧密的连在一起。
该函数的例子以及实际意义:
其中BUFFER_OFFSET是一个用来指定偏移的宏,其定义为
#define BUFFER_OFFSET(offset) ((void*)(offset))
启用顶点属性数组
void glEnableVertexAttribArray(GLuint index);
void glDisableVertexAttribArray(GLuint index);
设置是否启用与index关联的顶点数组。index的取值范围[0, MAX_VERTEX_ATTRIBS)
清除帧缓存数据
void glClear(GLbitfield mask);
清除指定缓存数据,并将其重新设置为当前的清除值。mask可以通过或操作来指定多个参数值。
缓存 | 名称 |
---|---|
颜色缓存 | GL_COLOR_BUFFER_BIT |
深度缓存 | GL_DEPTH_BUFFER_BIT |
模板缓存 | GL_STENCIL_BUFFER_BIT |
设置清除颜色
void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
绘制命令
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_TRANGLE_FAN和GL_PATCHES
glFlush和glFinish
void glFlush();
强制之前的OpenGL命令立即执行,并立即返回。
void glFinish();
强制所有当前的OpenGL命令立即执行,并等待它们全部结束。
glFlush()制式枪支所有运行中的命令送入OpenGL服务端而已,并且它会立即返回,并不等待所有命令完成,glFinish()会等待所有当前OpenGL操作完成后,再返回。
启用和禁用OpenGL操作
void glEnable(GLenum capability);
void glDisable(GLenum capability);
GLboolean glIsEnabled(GLenum capability);