glUnmapBuffer同时保持glMapBuffer内存有效为只读

时间:2012-02-19 13:47:19

标签: c++ c opengl pbo

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

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

1 个答案:

答案 0 :(得分:6)

map和unmap的目的是说“我需要一个指向这个的指针”。并且“我已经完成了使用指向这个的指针。”这就是功能的作用。

取消映射缓冲区后,驱动程序现在可以自由:

  1. 如果映射的指针不是指向该缓冲区的直接指针,则将您编写的数据(如果您写了任何内容)复制到缓冲区对象。
  2. 如果映射指针指向该对象的指针,则在GPU内存中移动缓冲区对象。
  3. 请记住:映射指针不会拥有以返回指向该缓冲区的实际指针。它只返回一个指针,当读取时,将把数据存储在该缓冲区中,写入时,写入的字节将在取消映射时传输到缓冲区。

    此外,做你所建议的唯一理由是因为你想要读取缓冲区中的数据。好吧,因为你刚刚映射了缓冲区(大概是为了写入,否则你就不会将它取消映射),你知道它里面有什么。如果您需要CPU访问它,您应该只在本地存储数据;你会以这种方式获得更可靠的访问权。

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

    但是如果缓冲区被映射为读取,那么OpenGL不知道你什么时候要读取它(因为它无法告诉你什么时候从指针读取)。因此OpenGL无法保证其中的存储。简而言之:未定义的行为。你可以在那时获得任何

    所以你所谈论的内容没有意义。