我想加载一些网格物体,包括OpenGL纹理,同时屏幕显示动画加载屏幕(使用OpenGL渲染)。
所以我在第二个线程中加载东西当然不起作用,因为我无法从两个线程访问相同的GL上下文。
我使用的是SDL 1.2,整个过程必须与平台无关,所以我不能使用wgl-stuff。
我有哪些可能性?
答案 0 :(得分:3)
使用像素缓冲区对象为图像数据(glMapBuffer
)创建地址空间映射,可以从进程的所有线程访问映射的OpenGL内存区域。使用辅助线程将图像数据复制到此,然后从主线程中的PBO复制glUnmapBuffer
和glTexImage
。取消映射和纹理上传都是异步的,因此您可以处理下一个图像,而前一个图像仍然会转移到快速内存。
然后,您只需要在线程之间进行通信,然后执行该任务以及完成此任务。
答案 1 :(得分:1)
这肯定不是最优雅的解决方案,但您可以使用空栏绘制加载屏幕,加载一些资源并增加条形,然后再次绘制它。重复,直到你装完所有东西 在伪:
loadgraphics(){
int progress=0;
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
}
这真的不是要走的路,但是如果你只是想要一个快速的肮脏的方式它就有效。
答案 2 :(得分:0)
是的,您可以访问在另一个线程上创建的资源。 你需要做的是在辅助线程上创建一个辅助opengl上下文并使用 wglShareLists在两个上下文之间共享数据。
当然在主线程上使用它之前,你需要再次绑定它。