map和unmap的目的是说"我需要一个指向这个的指针".并且"我已经完成了使用指向这个的指针." 这就是功能所做的.
取消映射缓冲区后,驱动程序现在可以自由地:
记住:映射指针不具有一个实际的指针返回到该缓冲区.它只返回一个指针,当读取时,将把数据存储在该缓冲区中,并且在写入时,写入的字节将在取消映射时传输到缓冲区.
此外,执行您建议的唯一原因是因为您想要读取缓冲区中的数据.好吧,因为你只是映射了缓冲区(大概是为了写入,否则你就不会将它取消映射),你知道它里面有什么.如果您需要CPU访问它,您应该只在本地存储数据; 你会以这种方式获得更可靠的访问权限.
如果你进行另一个像素传输,从该指针读取就意味着OpenGL必须执行同步,因为PBO的整个点是异步传输.也就是说,当你执行glReadPixels或其他什么时,OpenGL可以等到实际完成此操作,直到你映射缓冲区或使用glGetBufferSubData.
但是如果缓冲区被映射为读取,那么OpenGL不知道你什么时候要读取它(因为它无法判断你何时从指针读取).因此OpenGL无法保证其中的存储.简而言之:未定义的行为.你可以得到任何东西.
所以你所说的话没有意义.