glVertexAttribPointer() - 啥时候应该调用它?

Posted

技术标签:

【中文标题】glVertexAttribPointer() - 啥时候应该调用它?【英文标题】:glVertexAttribPointer() - when should this be called?glVertexAttribPointer() - 什么时候应该调用它? 【发布时间】:2015-11-16 02:33:32 【问题描述】:

我有一些示例代码在 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);

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

【问题讨论】:

glVertexAttribPointer 将当前绑定的缓冲区与当前绑定的顶点数组对象相关联。您可以绑定/取消绑定 VAO,它保留一组属性缓冲区。 @ColonelThirtyTwo,谢谢 - 这是否意味着没有必要在 glBufferData 之前调用它? ..我应该只在 glBindBuffer 之后调用它? @SparkyNZ BufferData 用原始数据填充 VBO。在这一点上,绘制时应该如何解释数据并不重要(例如,相同的数据可能在一次绘制中被解释为顶点位置,但在另一次绘制中被解释为法线)。所以是的,你可以删除这个第一个电话。 @keltar:很酷,谢谢 将您的评论移至答案,我会接受。 【参考方案1】:

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

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

【讨论】:

您需要在创建 VAO 绑定时绑定 VBO - 也许您可以添加以澄清。

以上是关于glVertexAttribPointer() - 啥时候应该调用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glVertexAttribPointer() 添加非数组值

Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)

glVertexAttribPointer 出现 JOGL 错误

glVertexAttribPointer 返回 GL_INVALID_OPERATION

OpenGL glVertexAttribPointer 正常

glVertexAttribPointer 提高 GL_INVALID_OPERATION