我有一个简单的问题。是不是glVertexAttribPointer
操作必须调用一次GL_ARRAY_BUFFER
来保存属性状态,直到我想要更改它们?
或者我是否需要每次glVertexAttribPointer
和glBindBuffer(GL_ARRAY_BUFFER, ...);
之间致电glDrawArrays(...);
?
答案 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 Objectx(glGenVertexArrays
),它存储有关数据格式,状态,属性索引的所有信息和顶点缓冲区对象的名称:
生成并指定顶点数组对象
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...