3

对于使用 SSE 4.1 流式加载的只读操作,是否可以glUnmapBuffer使用GL_STREAM_DRAW像素缓冲区对象并仍然保留先前返回的指针所指向的数据?glMapBuffer

如果没有,是否有任何技术原因?还是这个“功能”只是被遗漏了?

4

1 回答 1

8

map 和 unmap 的目的是说“我需要一个指向这个的指针”。和“我已经用完了指向这个的指针。” 这就是函数的作用。

当您取消映射缓冲区时,驱动程序现在可以自由地:

  1. 如果映射指针不是指向该缓冲区的直接指针,则将您写入的数据(如果您写入任何内容)复制到缓冲区对象。
  2. 如果映射的指针是指向该对象的指针,则在 GPU 内存中移动缓冲区对象。

请记住:映射指针不必返回指向该缓冲区的实际指针它只是返回一个指针,读取时会将数据存储在该缓冲区中,写入时,写入的字节将在取消映射时传输到缓冲区中。

此外,执行您建议的唯一原因是因为您想读取缓冲区中的数据。好吧,既然您刚刚映射了缓冲区(可能是为了写入,否则您不会取消映射它),您知道其中有什么。如果您需要 CPU 访问它,您应该将数据存储在本地;这样,您将获得更可靠的访问权限。

如果你做另一个像素传输,从那个指针读取它意味着 OpenGL 必须执行同步,因为 PBO 的整个点是异步传输。也就是说,当您执行glReadPixels或执行其他操作时,OpenGL 可以等待实际完成此操作,直到您映射缓冲区或使用glGetBufferSubData.

但是如果缓冲区是为读取而映射的,那么 OpenGL 不知道你什么时候要从它读取(因为它不能告诉你什么时候从指针读取)。所以OpenGL不能保证里面的存储。简而言之:未定义的行为。那个时候你可以得到任何东西

所以你说的没有意义。

于 2012-02-19T15:15:37.020 回答