各函数作用:
void glGenBuffers(GLsizei n, GLuint* buffers)
创建VBO并且返回VBO对象的ID。参数n:需要创建的缓存数量;参数buffers:用于存储单一ID或多个ID的GLuint变量或数组的地址。
void glBindBuffer(int target, int buffer)
绑定指定buffer的VBO并且指定类型target。同一时间只能绑定同一类型的VBO,只有当前被绑定的VBO才会被用户操作。绑定buffer为0的VBO,可以取消对所有同类型VBO的绑定。
void glBindBuffer(GLenum target, GLuint buffer)
target告诉VBO该缓存对象将保存顶点数组数据还是索引数组数据:GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY。任何顶点属(顶点坐标、纹理坐标、法线与颜色分量)都使用GL_ARRAY_BUFFER。用于glDraw[Range]Elements()的索引数据需要使用GL_ELEMENT_ARRAY绑定。
void glEnableVertexAttribArray(GLuint index);
glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见(着色器能否读取到数据),由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。glEnableVertexAttribArray可以在glVertexAttribPointer之前或之后调用,只要在绘图(glDraw*系列函数)前调用即可。
void glVertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, int offset)
将VBO中的数据传递给顶点数组。offset指定该属性在VBO中起始位置的偏移量,单位为byte
==============================================================================================
VAO定位是state-object(状态对象,记录存储状态信息)
记录的是一次绘制中做需要的信息,这包括”数据在哪里-glBindBuffer(GL_ARRAY_BUFFER)“、”数据的格式是怎样的-glVertexAttribPointer“(顶点位置的数据在哪里,顶点位置的数据的格式是怎样的/纹理坐标的数据在哪里,纹理坐标的数据的格式是怎样的....视乎你让它关联多少个VBO、VBO里有多少种数据)
void glGenVertexArrays(GLsizei n, GLuint *arrays);
生成VAOID,VAO定位是state-object(状态对象,记录存储状态信息)。记录一次绘制中需要信息,包括”数据在哪里-
glBindBuffer(GL_ARRAY_BUFFER)“、”数据的格式是怎样的-glVertexAttribPointer“(顶点位置的数据在哪里,顶点位置的数据的格式是怎样的/纹理坐标的数据在哪里,纹理坐标的数据的格式是怎样的....视乎你让它关联多少个VBO、VBO里有多少种数据)
void glBindVertexArray(GLuint array);
绑定VAO,即为开始记录存储状态信息。如果参数为0,则结束记录存储状态信息。
现在,我要用多个ID绑定同一类型的GL_ARRAY_BUFFER。我为vboPos,vboColor生成两个VBO;为vboId生成一个VBO。前两者指定一个顶点的位置和颜色,后者则制定顶点绘制的索引(四边形就是0,1,2,3)。
但是,同一时刻只能指定一种类型的VBO。因此,按照以下步骤分别上传顶点的位置属性和颜色属性:
glGenVertexArrays ( 1, &userData->vaoId );
glBindVertexArray ( userData->vaoId );
============================================================
glBindBuffer ( GL_ARRAY_BUFFER, userData->vboPos );
glEnableVertexAttribArray ( VERTEX_POS_INDX );
glVertexAttribPointer ( VERTEX_POS_INDX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, VERTEX_POS_STRIDE, 0 );
------------------------------------------------------------
glBindBuffer ( GL_ARRAY_BUFFER, userData->vboColor );
glEnableVertexAttribArray ( VERTEX_COLOR_INDX );
glVertexAttribPointer ( VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, VERTEX_COLOR_STRIDE, 0 );
------------------------------------------------------------
glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER, userData->vboId );
============================================================
glBindVertexArray ( 0 );
如果调换以上设置两个属性的glBindBuffer,glVertexAttribPointer的顺序,无法绘图。
之后绘制图元:
glBindVertexArray ( userData->vaoId );
============================================================
glDrawElements ( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, ( const void * ) 0 );
============================================================
glBindVertexArray ( 0 );