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

各函数作用:
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 );

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值