多个顶点属性使用一个类型的VBO & VAO的使用和操作

来源:互联网 发布:eia数据公布时间 编辑:程序博客网 时间:2024/06/14 09:26
各函数作用:
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 );


原创粉丝点击