通过glBufferData()更新VBO(特别是它的大小)可能会改变它的物理内存地址,但不是glGenBuffers()设置的缓冲区对象名.VBO通过调用glVertexAttribPointer()链接到VAO,其中有关VBO(缓冲区对象名称?存储器地址?)的信息存储在VAO中.当通过glBindVertexArray()绑定时,VAO可用于更新和绘图.GL当时是否重新计算VBO地址?当链接到的VBO通过glBufferData()更新时,VAO可能会也可能不会被绑定.
根据缓冲区对象名称何时转换为物理内存地址,我可以想象只需在更改VBO后再次绑定VAO,就可以为更改后的VBO更新VAO; 或者,可能需要通过另一次调用glVertexAttribPointer()来更彻底地更新VAO.
因此,这个问题的一部分是:关于VBO的哪些信息存储在VAO中?如果它只是缓冲区对象名称,则在更改VBO内容后不必再次调用glVertexAttribPointer().
也许这些细节不是API规范的一部分,因此唯一安全的做法是在每次更新链接的VBO后通过glVertexAttribPointer()更新VAO.
opengl ×1