VBO的第一次初始化。在哪里绑定重要吗?

Posted

技术标签:

【中文标题】VBO的第一次初始化。在哪里绑定重要吗?【英文标题】:First Inizialization of VBO. Does it matter where to bind? 【发布时间】:2018-02-15 21:50:58 【问题描述】:

假设我只想创建和填充缓冲区。

GLuint ret;
glGenBuffers(1,&ret);
glBindBuffer(GL_ARRAY_BUFFER, ret);
glBufferData(GL_ARRAY_BUFFER,size,data,usage);
glBindBuffer(GL_ARRAY_BUFFER,0);

我在两次调用中使用哪个目标真的很重要吗? (当然它们必须相同)。 例如:我可以在绑定到GL_ARRAY_BUFFER 目标时填充写入缓冲区,然后在代码中将健全的缓冲区绑定到GL_UNIFORM_BUFFER 目标并使用它的数据填充glBindBufferRange 的统一块吗?

【问题讨论】:

您所展示的一切都不是“VAO”。 根据代码示例,我假设 OP 表示 VBO 是的,我的意思是 vbo,标题已编辑。 【参考方案1】:

没关系;任何目标都应该有效。我已经创建了缓冲区,其目标与之前的预期用途相匹配,但没有任何区别。

我猜 OpenGL 实现(即驱动程序)可能会根据传递的目标以不同的方式分配内存,但我还没有看到这方面的证据。

此外,较新的glNamedBufferDataglBufferData 执行相同的操作而不需要先前的glBindBuffer 调用,它没有target 参数。这强烈暗示目标是可以互换的。

【讨论】:

以上是关于VBO的第一次初始化。在哪里绑定重要吗?的主要内容,如果未能解决你的问题,请参考以下文章

一个 VBO 可以绑定多个 VAO 吗?

在 OpenGL ES 中,多个程序可以使用相同的 VBO 并绑定到它们的属性吗?

OpenGL顶点数组对象不记录VBO和IBO绑定

lwjgl 纹理多重绑定到一个 VBO

VBO - 我可以在初始化时做啥?

关于opengl的绑定和解绑的时机