使用GL_DYNAMIC_DRAW的OpenGL VAO

f1tvaqid  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(312)

我正在使用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?)?

5kgi1eie

5kgi1eie1#

缓冲区使用量:
使用情况是GL实现的一个提示,用于指示如何访问缓冲区对象的数据存储。这使GL实现能够做出可能会显著影响缓冲区对象性能的更明智的决策。**但是,它并不限制数据存储的实际使用情况。**使用情况可以分为两部分:第一,访问的频率(修改和使用),第二,该访问的性质。访问的频率可以是以下之一:
针对您的具体情况
DYNAMIC -数据存储内容将被反复修改和多次使用。
如果要更新缓冲区,则必须调用glBufferData或任何其他方法示例:glBufferSubDataglMapBuffer。这必须在绑定缓冲区时完成(不是 VAO ,而是缓冲区)

相关问题