假设我有一个包含一些数据的缓冲区对象。
我使用glMapBufferwithGL_WRITE_ONLY并每隔一个字节写入一次(想想交错的顶点属性)。
然后我glUnmapBuffer缓冲。
我没有写入的字节是保留的还是现在未定义的?
我想知道因为 的主要目的GL_WRITE_ONLY似乎是避免将缓冲区的先前内容从卡的内存传输到主内存。但是,驱动程序无法知道我实际写入了哪些字节以便仅部分更新缓冲区。
所以要么驱动程序首先将内容传输到主内存,GL_WRITE_ONLY在我能想到的几乎所有平台上都毫无意义。或者假设我写了完整的映射区域。然而,手册页中没有提到这种义务。
简短回答:数据被保留。
我想知道因为 GL_WRITE_ONLY 的主要目的似乎是避免将缓冲区的先前内容从卡的内存传输到主内存。
嗯,实现有很多潜在的方法来满足这个请求,访问标志可能有助于决定走哪条路。例如,驱动程序可能决定对 VRAM 中的缓冲区进行一些直接 I/O 映射,而不是使用系统 RAM 进行映射。
您看到的问题实际上是由扩展中glMapBufferRange()引入的更现代的API解决的GL_ARB_map_buffer_range。尽管名称可能暗示这是用于映射部分缓冲区,但它实际上glMapBuffer()完全取代了该功能并允许进行更精细的控制。例如,GL_MAP_INVALIDATE_RANGE_BIT或GL_MAP_INVALIDATE_BUFFER_BIT标志将数据标记为无效并启用您在一般GL_WRITE_ONLY情况下想到的优化。但是没有这些,数据将被保留,而如何做到这一点是实现的问题。
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |