glVertexAttribPointer状态是否绑定到当前的GL_ARRAY_BUFFER?

时间:2017-08-18 08:10:39

标签: arrays opengl buffer vertex vao

我有一个简单的问题。是不是glVertexAttribPointer操作必须调用一次GL_ARRAY_BUFFER来保存属性状态,直到我想要更改它们? 或者我是否需要每次glVertexAttribPointerglBindBuffer(GL_ARRAY_BUFFER, ...);之间致电glDrawArrays(...);

2 个答案:

答案 0 :(得分:3)

  

是否正确,必须为GL_ARRAY_BUFFER调用一次glVertexAttribPointer操作以保存属性状态,直到我想要更改它们为止?或者我每次都需要调用glVertexAttribPointer。

glVertexAttribPointer指定指定索引处的通用顶点属性数组的位置和数据格式。此信息存储在Vertex Array Object中。注意,在OpenGL中总是有一个顶点数组对象绑定。要么删除的默认顶点数组对象(0),要么是非零命名的顶点数组对象。

顶点属性数组的规范必须在绘制对象之前完成:

glBindBuffer( ARRAY_BUFFER, posBufObj );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, .... );
glBindBuffer( nvBufObj );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 1, .... );

glDrawArrays( .... )
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );
glBindBuffer( ARRAY_BUFFER, 0 );

是的,每个顶点属性调用glVertexAttribPointer就足够了。保留Vertex Specification直到未重新定义,因为它在Vertex Array Object中说明 当然,不能删除glVertexAttribPointer引用的缓冲区对象。此状态是,是否启用了顶点属性(glEnableVertexAttribArray),直到再次禁用顶点属性(glDisableVertexAttribArray)为止。 关于Vertex Specification的Khronos OpenGL wiki清楚地说:

  

glVertexAttribPointer函数状态,其中属性索引从中获取其数组数据。

可以使用glGetVertexAttrib检索此状态。

有关顶点属性的更多信息,请参见第10.2章至第10.6节中的OpenGL CoreProfile specification

要处理不同的顶点属性指针而不是交替指定和启用或禁用它们,可以生成不同的Vertex Array ObjectxglGenVertexArrays),它存储有关数据格式,状态,属性索引的所有信息和顶点缓冲区对象的名称:

生成并指定顶点数组对象

vaoObj = glGenVertexArrays();
glBindVertexArray( vaoObj );
glBindBuffer( ARRAY_BUFFER, posBufObj );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, .... );
glBindBuffer( nvBufObj );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 1, .... );
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray( 0 );

绑定顶点数组对象

glBindVertexArray( vaoObj );
glDrawArrays( .... )
glBindVertexArray( 0 );

答案 1 :(得分:0)

我不太清楚你的问题。但是必须在当前绑定的vbo上使用glVertexAttribPointer:

glBindVertexArray(vao);
glBindBuffer(ARRAY_BUFFER, position);
glEnableVertexAttribArray(0);
glVertexAttribPointer...
glBindBuffer(normal);
glEnableVertex...
glVertexAttribPointer...

....

glBindVertexArray(vao);
glDrawArrays...