微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在OpenGl中,VBO是否必须包含具有相同顶点布局的数据?

如何解决在OpenGl中,VBO是否必须包含具有相同顶点布局的数据?

我曾经有很多VBO,但是现在我将它们组合成一个,并根据我的画图对其进行索引。问题是,当我将顶点加载到VBO中并记录缓冲区中有多少个字节时,它与glDrawArrays中的参数不匹配,后者的offset参数为“ first”,而不是以字节为单位。如果VBO中的所有顶点都是相同的布局,我应该进行除法吗?例如,sizeof(Vertex)== 12并将其放置在VBO中的字节偏移量48处,要绘制四个顶点,我需要做glDrawArrays(GL_TRIANGLE_STRIP,48 / sizeof(Vertex),4)???

如果它是一个包含两个具有不同布局的不同类型顶点的大缓冲区,该怎么办?随着缓冲区的释放,可以为其他缓冲区腾出空间,并且它们会四处移动或调整大小,这应该怎么做?

要设置顶点,我将glVertexAttribPointer和glEnabLevertexArray调用四到五次,我试图避免在每次绘制调用调用它们。

解决方法

如果顶点的格式已更改,则意味着(使用旧的API)您将必须进行一定数量的glVertexAttribPointer调用(可能是要使用的新VAO的一部分)绑定)以更改顶点数据的格式。无论哪种方式,调用此函数都可以改变缓冲区中每个属性的起始字节偏移量。

因此,如果您的缓冲区在布局1中包含256字节的数据,然后在布局2中包含256字节的数据,那么在设置布局2时作为字节偏移量提供的“指针”应该偏移256:新顶点数据的偏移量。

那样,由于任何偏移量都是顶点格式的一部分,因此glDrawArrays函数的两个网格的索引都为0。

是的,glDrawArrays的“第一个”参数是一个索引,而不是字节偏移量。

我试图避免在每次抽奖时都调用它们。

如果要避免这种情况,则需要按顶点格式对模型进行排序,以便以一种格式呈现所有模型,然后使用另一种格式呈现模型。更改布局并不便宜,因此,如果要考虑性能,请选择一小部分顶点格式,并使网格与它们相符。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。