我正在使用OpenGL,在开发过程中,我发现GL_DYNAMIC_DRAW缓冲区模式声明缓冲区数据可能会更改,我想如果我在绑定到某个 VAO 时调用glBufferData(...),是否意味着每次我再次绑定此VAO时,内存中的所有数据都将自动重新上传到GPU?
代码中的相同想法:
data = [...] # List of arrays (actual data)
buffers = glGenBuffers(4) # Create buffers
vao = glGenVertexArrays(1) # Create VAO
glBindVertexArray(vao) # Bind VAO
for i, (buf, data) in enumerate(zip(buffers, data)):
glBindBuffer(GL_ARRAY_BUFFER, buf)
glBufferData(GL_ARRAY_BUFFER, data.nbytes, data, GL_DYNAMIC_DRAW)
glEnableVertexAttribArray(i)
glVertexAttribPointer(i, 3, GL_FLOAT, GL_FALSE, some_straid, ctypes.c_void_p(0))
glBindVertexArray(0) # unbind every thing ...
...
def on_render():
glClear(...) # clear screen
glUseProgram(...) # enable shader
glBindVertexArray(vao) # will this call upload new data to gpu?
glDrawArrays(GL_TRIANGLES, 0, 3) # draw
glBindVertexArray(0) # unbind VAO
glUseProgram(0) # unbind shader
glutSwapBuffers()
如果没有,更新这些缓冲区的最佳方法是什么(每次调用glBufferData?)?
1条答案
按热度按时间5kgi1eie1#
缓冲区使用量:
使用情况是GL实现的一个提示,用于指示如何访问缓冲区对象的数据存储。这使GL实现能够做出可能会显著影响缓冲区对象性能的更明智的决策。**但是,它并不限制数据存储的实际使用情况。**使用情况可以分为两部分:第一,访问的频率(修改和使用),第二,该访问的性质。访问的频率可以是以下之一:
针对您的具体情况
DYNAMIC -数据存储内容将被反复修改和多次使用。
如果要更新缓冲区,则必须调用
glBufferData
或任何其他方法示例:glBufferSubData
、glMapBuffer
。这必须在绑定缓冲区时完成(不是 VAO ,而是缓冲区)