我正在尝试编写可以绘制没有纹理的通用形状的函数。这包括一个原始多边形形状的系统,但作为一个例子,我将使用show my rectangle function:
void Rectangle(float x1,float y1,float x2,float y2);
鉴于我的所有渲染都使用了VAO,我不知道如何最好地处理这个问题。我目前的想法是使用一个VAO并附加一个VBO,并在每次调用其中一个函数时编辑该VBO。因此,对于矩形示例,我将简单地绑定缓冲区并使用矩形点的参数调用glBufferData传入数组,然后将顶点数组传递到我的渲染系统的其余部分。
我找不到的信息是VAO是否存储对缓冲区的引用,或者是否根据缓冲区和格式制作数据的内部副本。每次我要使用它的VAO绘制时是否可以编辑缓冲区,如果是这样我每次都必须调用glVertexAttribPointer?
答案 0 :(得分:2)
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
)。但是,当你这样做时,你永远不应该改变缓冲区的大小。