编辑顶点数组中的缓冲区数据

Posted

技术标签:

【中文标题】编辑顶点数组中的缓冲区数据【英文标题】:Editing Buffer Data In a Vertex Array 【发布时间】:2013-08-08 02:11:56 【问题描述】:

我正在尝试编写可以绘制没有纹理的通用形状的函数。这包括一个原始多边形形状的系统,但作为示例,我将使用显示我的矩形函数:

void 矩形(float x1,float y1,float x2,float y2);

鉴于我的所有渲染都使用 VAO,我不确定如何最好地处理这个问题。我目前的想法是使用一个附有单个 VBO 的 VAO,并在每次调用其中一个函数时编辑这个 VBO。因此,对于矩形示例,我将简单地绑定缓冲区并调用 glBufferData,传入一个带有矩形点参数的数组,然后将顶点数组传递到我的渲染系统的其余部分。

我找不到关于 VAO 是存储对缓冲区的引用还是根据缓冲区和格式制作数据的内部副本的信息。每次我要使用它的 VAO 绘制时都可以编辑缓冲区吗?如果是这样,我每次都必须调用 glVertexAttribPointer 吗?

【问题讨论】:

Iirc,参考资料说 VAO 存储绑定到它的 VBO 的 ID,但没有什么可以阻止您将 VBO 绑定到多个 VAO。使用 VAO 的目的是避免为给定的渲染管道设置绑定通常需要的所有样板代码。 there 你去吧。 “参考”是指 opengl 规范。 【参考方案1】:

VAO 引用缓冲区对象,因此如果您更改其内容或重新分配其存储空间,缓冲区对象的任何使用都会看到这一点。

但是,您不应该这样做。 ARB released an extension/core feature last month 的主要用途是 making this impossible. 这不是扩展的唯一作用,但它基本上是使其其余部分工作的原因。

这就是 ARB 和 IHV 对您重新分配缓冲区对象存储空间的看法。所以不要这样做。如果您需要buffer to stream data into,那就太好了。只需分配一个相当大的并流入其中。您可以使用glBufferData(..., NULL) 到invalidate the buffer(假设您无法将其映射为失效或use glInvalidateBufferData)。但是当你这样做时,你永远不应该改变缓冲区的大小。

【讨论】:

你是说我可以安全地使用 glBufferSubData 函数,但不能安全地使用 glBufferData 函数? @4th_dimention:您似乎误解了“可以”和“应该”之间的区别。您可以重新分配缓冲区的存储空间,它将从 VAO 或任何其他引用缓冲区对象的东西中可见。您不应该这样做。 在这种情况下,当我想更新缓冲区而不是 glBufferData 时,我应该使用 glBufferSubData 吗? @4th_dimention:请访问我的问题中的一些链接。我把它们放在那里是为了更好地解释你应该做什么。

以上是关于编辑顶点数组中的缓冲区数据的主要内容,如果未能解决你的问题,请参考以下文章

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

Swizzling 顶点数组、顶点缓冲区对象和着色器

绑定到“顶点数组对象”后,我应该删除“顶点缓冲区对象”吗?

带着色器的顶点缓冲区对象/顶点数组对象

OpenGL更新顶点数组/缓冲区

OpenGL 顶点数组/缓冲区对象