gpt4 book ai didi

c++ - 具有非常小块的持久映射缓冲区 (glBufferStorage GL_MAP_PERSISTENT_BIT)

转载 作者:行者123 更新时间:2023-11-28 05:08:08 45 4
gpt4 key购买 nike

我在自己编写的渲染器中实现了持久映射缓冲区,与此处的本教程非常相似: persistent-mapped-buffers-in-opengl

为了简短起见,它的工作原理是这样的:

glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
glBufferStorage(GL_ARRAY_BUFFER, MY_BUFFER_SIZE, 0, flags);

映射(创建后仅一次...):

flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
myPointer = glMapBufferRange(GL_ARRAY_BUFFER, 0, MY_BUFFER_SIZE, flags);

更新:

// wait for the buffer   
glClientWaitSync(Buffer.Sync[Index], GL_SYNC_FLUSH_COMMANDS_BIT, WaitDuration);

// modify underlying data...

锁定缓冲区:

glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);

在我理解了这个想法之后,我能够毫无问题地实现它,也因此获得了相当多的性能。然而,由于我正在使用的游戏引擎,我有时会不可避免地收到很多非常小的 block 的 drawcall,只有几个顶点。如果发生这种情况,我会看到视觉失真,清楚地表明出了问题。

我尝试的是在更新缓冲区之前和之后添加更多等待。虽然这没有任何意义,但只是为了测试,我尝试删除 GL_MAP_COHERENT_BIT 并使用 glFlushMapppedBufferRange,我尝试使用单个缓冲区而不是多个缓冲区。

对我来说,围栏似乎无法正常工作,但我不明白这是怎么发生的。击剑不应该避免这样的麻烦,即使这意味着牺牲性能吗?但是,如果我改用 glBufferData,或者如前所述,如果 block 是几百个顶点并减少绘制调用,则同样的情况可以毫无问题地工作。
任何提示这可能是由什么引起的或我如何获得有关失败原因的更多信息的任何提示都将非常有帮助。根本没有 OpenGL 错误。

最佳答案

事实证明,问题出在一个完全不同的地方,而且是多种因素的结合。

对于多个缓冲区,它改为在中设置索引

glDrawArrays(GL_TRIANGLES, 0, VertSize);

需要为多个缓冲区设置偏移量

glVertexAttribPointer(VERTEX_COORD_ATTRIB, 3, GL_FLOAT, GL_FALSE, StrideSize, (void*) BeginOffset));

单个缓冲区失真的问题是由于缺少等待或者只有一个缓冲区时错误的“如果”。

我希望这可能对遇到此类问题的其他人有用,因为他们知道持久映射缓冲区不是一般问题。

关于c++ - 具有非常小块的持久映射缓冲区 (glBufferStorage GL_MAP_PERSISTENT_BIT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44163193/

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