gpt4 book ai didi

multithreading - 多线程中的 OpenGL VBO

转载 作者:行者123 更新时间:2023-12-04 16:55:06 30 4
gpt4 key购买 nike

我正在用 C++/OpenGL 开发一个程序,它可以绘制整个世界的地形。我有一个存储为瓷砖的海拔高度数据库。每次我启动程序时,都会加载一个磁贴。然后随着人的移动,应该加载另一个图块,这不会每帧发生一次,可能每 5 分钟一次。

我在视频卡的内存中加载初始图块:

glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, VBOsz * 3 * sizeof(float), tile_data, GL_STATIC_DRAW_ARB);

...有法线、颜色和索引缓冲区

我画了它们:
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, VBOsz * 3 * sizeof(float), tile_data, GL_STATIC_DRAW_ARB);


glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

...
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, IndexBuffer[idx]);
glDrawElements(GL_TRIANGLES, IndexBuffersz, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

由于我希望程序尽可能流畅,所以我无法计算同一帧的顶点+颜色+法线+其他纹理,因为创建一个tile大约需要20秒。

所以我决定创建一个加载器线程来检查何时需要加载新图块,然后加载它。当一切都完成时,它应该只是交换 VBO(因此 [idx].

所以对于加载线程,我知道我需要第二个 OpenGL 上下文,我创建了一个并在它们之间共享列表。这个想法是可行的,但是在加载器线程中,当我发送新的 VBO 数据时,我需要这个函数:wglMakeCurrent

只有当所有数据都加载完毕后,我才能将上下文设置为渲染线程(主程序的线程)。这会导致在这段时间内没有绘制任何内容,从而使程序无用。

您对解决方案有什么想法吗?我需要改变这个概念吗?

我正在使用 OpenGL 2.1。升级到 OpenGL 3 会解决问题吗?

最佳答案

这真的没有那么复杂。

您只需创建两个缓冲区对象:一个用于当前渲染,另一个用于将来。当未使用的缓冲区充满数据时,渲染线程会从该缓冲区切换到渲染。先前使用的缓冲区变为未使用的缓冲区。

您可以通过以下两种方式之一上传数据。一种方法是让您的数据创建线程创建一个数据数组,渲染线程将使用 glBufferData 将这些数据上传到缓冲区对象。 .显然,这将需要一些同步,但您需要的是同步代码:您的渲染线程最终必须在数据准备好时得到通知,以便它可以使用新数据进行渲染。

另一种方式是让您的渲染线程被告知需要开始生成数据。此时,它将映射未使用的缓冲区对象并将映射的指针传递给数据创建线程。该线程将直接将数据生成到该映射指针中。当它完成时,它会通知渲染线程,它将取消映射缓冲区,然后使用数据进行渲染。

这两种方法都不需要多个上下文或通过 OpenGL 代码进行线程处理。

请注意,不要让缓冲区变大和变小,才能最好地提高性能。选择一个尺码并坚持下去;您不想使用 glBufferData 调整缓冲区大小.

关于multithreading - 多线程中的 OpenGL VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8912986/

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