【问题标题】:OpenGL 2.1: glMapBuffer and usage hintsOpenGL 2.1:glMapBuffer 和使用提示
【发布时间】:2012-01-13 22:46:41
【问题描述】:

我一直在使用glBufferData,我认为您必须指定使用提示(例如 GL_DYNAMIC_DRAW)。

不过,最近是suggested to me on Stack Overflow,我使用glMapBufferglMapBufferRange 来修改不连续的顶点数据块。

使用glMapBuffer 时,您似乎没有指定使用提示。所以,我的问题如下:

  • 如果您从未在某个 VBO 上调用过 glBufferData,那么在该 VBO 上使用 glMapBuffer 是否有效?
  • 如果是这样,OpenGL 是如何猜测用法的,因为它没有给出提示?
  • glMapBufferglBufferData 的优缺点是什么? (我知道他们做的事情并不完全相同。但似乎通过使用glMapBuffer 获取指针然后写入该地址,您可以做与glBufferData 相同的事情。)

【问题讨论】:

    标签: opengl vbo


    【解决方案1】:
    • 如果您从未在给定 VBO 上调用 glBufferData,那么在给定 VBO 上使用 glMapBuffer 是否有效?

    不,因为要映射一些内存,必须先分配。

    • 如果是这样,OpenGL 是如何猜测用法的,因为它没有给出提示?

    它没有。您必须至少调用一次 glBufferData 来初始化缓冲区对象。如果您不想实际上传数据(因为您将使用 glMapBuffer),只需为数据指针传递一个空指针。这就像 glTexImage 一样,在其中创建缓冲区/纹理对象,用 glBufferSubData/glTexSubImage 填充,或者在缓冲区对象的情况下以及通过内存映射填充。

    • glMapBuffer 与 glBufferData 的优缺点是什么? (我知道他们做的事情并不完全相同。但似乎通过使用 glMapBuffer 获取指针然后写入该地址,您可以做与 glBufferData 相同的事情。)

    glMapBuffer 允许您从另一个线程异步写入缓冲区。对于某些实现,OpenGL 驱动程序可能让您的进程直接访问 GPU 的 DMA 内存,甚至更好地访问 GPU 本身的内存。例如在具有集成显卡的 SoC 架构上。

    【讨论】:

      【解决方案2】:

      不,这似乎是无效的。您必须调用glBufferData,否则OpenGL 无法知道您的缓冲区的大小。

      至于哪个更快,我和整个互联网似乎都没有明确的答案。测试一下看看。

      【讨论】:

      • 谢谢。所以 glMapBuffer 只用于修改已经使用 glBufferData 至少写入一次的数据?
      • glBufferData 视为创建缓冲区对象的原因。你不必在那里写任何东西;您可以将 NULL 作为指针参数传递。但您需要先创建存储,然后才能映射它。
      猜你喜欢
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多