是否可以glUnmapBuffer
GL_STREAM_DRAW
像素缓冲区对象,并且仍然保持先前由glMapBuffer
返回的指针所指向的数据对于只读操作有效使用SSE 4.1流媒体加载?
如果没有,是否有任何技术原因?或者这个“功能”刚被遗漏了?
答案 0 :(得分:6)
map和unmap的目的是说“我需要一个指向这个的指针”。并且“我已经完成了使用指向这个的指针。”这就是功能的作用。
取消映射缓冲区后,驱动程序现在可以自由:
请记住:映射指针不会拥有以返回指向该缓冲区的实际指针。它只返回一个指针,当读取时,将把数据存储在该缓冲区中,写入时,写入的字节将在取消映射时传输到缓冲区。
此外,做你所建议的唯一理由是因为你想要读取缓冲区中的数据。好吧,因为你刚刚映射了缓冲区(大概是为了写入,否则你就不会将它取消映射),你知道它里面有什么。如果您需要CPU访问它,您应该只在本地存储数据;你会以这种方式获得更可靠的访问权。
如果你进行另一次像素传输,从该指针读取就意味着OpenGL必须执行同步,因为PBO的整个点是异步传输。也就是说,当您执行glReadPixels
或其他任何操作时,OpenGL可以等到实际完成此操作,直到您映射缓冲区或使用glGetBufferSubData
。
但是如果缓冲区被映射为读取,那么OpenGL不知道你什么时候要读取它(因为它无法告诉你什么时候从指针读取)。因此OpenGL无法保证其中的存储。简而言之:未定义的行为。你可以在那时获得任何。
所以你所谈论的内容没有意义。