glVertexAttribPointer() - 何时应该调用它?

时间:2015-11-16 02:33:33

标签: opengl shader vbo

我有一些示例代码在两个地方调用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);

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

1 个答案:

答案 0 :(得分:1)

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

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