glVertexAttribPointer() - 什么时候调用它?

glVertexAttribPointer() - when should this be called?

我有一些在 2 个地方调用 glVertexAttribPointer() 的示例代码。这是必须的还是只能做一次?

第一次-关联顶点缓冲区数据:

glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, sizeof( COLVERTEX ), 0 );
glBufferData( GL_ARRAY_BUFFER, sizeof( v ), v, GL_STATIC_DRAW );

第二次-渲染回调函数中:

glEnableVertexAttribArray(0);
glBindBuffer( GL_ARRAY_BUFFER, vboQuad );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, sizeof( COLVERTEX ), 0 );
glDrawArrays( GL_QUADS, 0, 4 );
glDisableVertexAttribArray(0);

真的有必要两次描述顶点属性吗?

BufferData 用原始数据填充 VBO。在这一点上,绘制时应该如何解释数据并不重要(例如,相同的数据可能在一次绘制中被解释为顶点位置,但在另一次绘制中被解释为法线)。所以是的,您可以删除第一个调用。

如果你使用顶点数组对象,你可以只设置一次顶点属性指针(通过绑定VBO,启用顶点属性,并设置顶点属性指针)然后在绘制之前调用glBindVertexArray并全部记录顶点属性设置(您甚至不需要在绘制调用之前绑定包含顶点属性的 VBO)。