相关疑难解决方法(0)

OpenGL:用于加载资源的辅助线程?

使用C和Win32,我想知道如何实现用于加载资源(纹理和VBO)的辅助OpenGL线程.

从我发现的,这应该用wglShareLists()来完成,但我不确定如何设置辅助线程:

我是否需要新的设备上下文或仅需要新的渲染上下文?

我需要调用哪些wgl函数?

c opengl winapi

11
推荐指数
1
解决办法
6470
查看次数

多线程内的OpenGL VBO

我正在开发一个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);
Run Code Online (Sandbox Code Playgroud)

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

我画它们:

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));
Run Code Online (Sandbox Code Playgroud)

...

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);
Run Code Online (Sandbox Code Playgroud)

由于我希望程序尽可能平滑,我无法计算相同帧的顶点+颜色+法线+其他纹理,因为创建一个图块需要大约20秒.

所以我决定制作一个加载程序线程来检查何时需要加载新的tile,然后加载它.什么时候完成,它应该只是交换VBO(因此[idx].

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

只有在加载了所有数据后,我才能将上下文设置为渲染线程(主程序的线程).这导致在这段时间内没有任何东西被绘制,这使得程序无用.

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

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

opengl multithreading vbo

5
推荐指数
2
解决办法
6871
查看次数

标签 统计

opengl ×2

c ×1

multithreading ×1

vbo ×1

winapi ×1