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

ron*_*nag 3 c c++ opengl pbo

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

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

Nic*_*las 7

map和unmap的目的是说"我需要一个指向这个的指针".并且"我已经完成了使用指向这个的指针." 这就是功能所做的.

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

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

记住:映射指针不具有一个实际的指针返回到该缓冲区.它只返回一个指针,当读取时,将把数据存储在该缓冲区中,并且在写入时,写入的字节将在取消映射时传输到缓冲区.

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

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

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

所以你所说的话没有意义.