gpt4 book ai didi

c++ - 是否重用未定义的 glMapBufferRange 指针?

转载 作者:行者123 更新时间:2023-11-28 02:10:00 26 4
gpt4 key购买 nike

我通过 mapBufferRange 使用统一缓冲区并按如下方式更新每一帧(假设缓冲区和缓冲区已经正确绑定(bind)):

    float* uboBlock0 = reinterpret_cast<float*>(
glMapBufferRange(GL_UNIFORM_BUFFER, 0,
buffSizeInFloats, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT));

// cache it here and dont map/unmap for test - float* uboBlock0 = getUboBlockMemory();
memcpy(uboBlock0, obj, buffSize);
glUnmapBuffer(GL_UNIFORM_BUFFER);

但是,如果不是在使用之前映射缓冲区,而是简单地缓存 float* uboBlock0 ,它仍然会在每一帧正确更新。即使我切换 uboBlocks,并分别更新它们,它仍然可以正确更新。它甚至可以在两个独立的 nvidia 卡上运行。我阅读了关于映射缓冲区的 opengl 规范,但我看不到任何对此行为的描述(https://www.opengl.org/registry/doc/glspec45.core.pdf 6.3)所以我想知道我是否只是“幸运”并且不应该期望它起作用,或者这是否可以?

最佳答案

这是完全未定义的行为,似乎只是偶然地在您的实现中起作用。

OpenGL 4.5 core profile specification
在第 6.3.1 节“取消映射缓冲区”中明确指出:

Unmapping a mapped buffer object invalidates the pointer to its data store

在取消映射后,您绝不能使用指向映射缓冲区的指针。

然而,对于相当现代的 GL,ARB_buffer_storage功能作为核心功能提供,它允许您持久地映射缓冲区对象。在这种情况下,您可以在 GL 仍处于映射状态时使用缓冲区。您当然必须手动同步对该内存区域的所有访问,以便在 GL 完成处理之前数据不会被覆盖。

关于c++ - 是否重用未定义的 glMapBufferRange 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36045233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com