说我有一个包含一些数据的缓冲区对象。
我将glMapBuffer
与GL_WRITE_ONLY
一起使用并写入每个第二个字节(想想交错的顶点属性)。
然后我glUnmapBuffer
缓冲区。
我没有写入的字节是保留还是现在未定义?
我想知道,因为GL_WRITE_ONLY
的主要目的似乎是避免将缓冲区的先前内容从卡的内存传输到主内存。但是,驱动程序无法知道我实际编写了哪些字节以便仅部分更新缓冲区。
因此,驱动程序要么首先将内容传输到主内存,要么几乎在我能想到的每个平台上呈现GL_WRITE_ONLY
毫无意义。或者假设我写完整的映射区域。然而,手册页中没有提到这样的义务。
答案 0 :(得分:4)
简答:数据被保留。
我很想知道因为GL_WRITE_ONLY的主要目的似乎是 避免从卡上传输缓冲区的先前内容 记忆到主记忆。
嗯,实现有很多可能的方法来满足该请求,并且访问标志可以帮助决定要走哪条路径。例如,驱动程序可能决定在VRAM中对缓冲区进行一些直接I / O映射,而不是使用系统RAM进行映射。
您在此处看到的问题实际上是通过glMapBufferRange()
扩展中引入的更现代的GL_ARB_map_buffer_range
API来解决的。尽管名称可能表明这是用于映射缓冲区的一部分,但它实际上完全取代了glMapBuffer()
函数,并允许更精细的控制。例如,GL_MAP_INVALIDATE_RANGE_BIT
或GL_MAP_INVALIDATE_BUFFER_BIT
标记将数据标记为无效,并启用针对常规GL_WRITE_ONLY
情况的优化。但如果没有这些,数据将被保留,如何实现这是实现的问题。