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