glUnmapBuffer,同时将glMapBuffer内存保持为只读

glUnmapBuffer while keeping glMapBuffer memory valid as read-only

本文关键字:只读 内存 glMapBuffer glUnmapBuffer      更新时间:2023-10-16

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

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

映射和取消映射的目的是说"我需要一个指向这个的指针。"answers"我已经用完了指向这个的指示器。"这就是函数的作用。

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

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

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

此外,执行您建议的操作的唯一原因是,您希望读取缓冲区中的数据。好吧,既然你只是映射了缓冲区(可能是为了写,否则你就不会取消映射),你就知道里面有什么。如果你需要CPU访问它,你应该把数据存储在本地;这样你就可以更可靠地访问它。

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

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

所以你说的没有意义。