我想在屏幕显示动画加载屏幕(使用 OpenGL 渲染)时加载一些网格,包括 OpenGL 纹理。
所以我在第二个线程中加载东西,这当然不起作用,因为我无法从两个线程访问相同的 GL 上下文。
我使用的是 SDL 1.2,整个事情必须独立于平台,所以我不能使用 wgl-stuff。
我有哪些可能性?
我想在屏幕显示动画加载屏幕(使用 OpenGL 渲染)时加载一些网格,包括 OpenGL 纹理。
所以我在第二个线程中加载东西,这当然不起作用,因为我无法从两个线程访问相同的 GL 上下文。
我使用的是 SDL 1.2,整个事情必须独立于平台,所以我不能使用 wgl-stuff。
我有哪些可能性?
使用 Pixel Buffer Objects 为图像数据创建地址空间映射(glMapBuffer
),映射的 OpenGL 内存区域可以从进程的所有线程中访问。使用辅助线程将图像数据复制到此,然后glUnmapBuffer
从glTexImage
主线程中的 PBO 复制。取消映射和纹理上传都是异步发生的,因此您已经可以处理下一个图像,而前一个图像仍会传输到快速内存。
然后,您所需要的只是一种在线程之间进行通信的方式,该线程将执行下一个任务以及该任务何时完成。
这肯定不是最优雅的解决方案,但您可以使用空栏绘制加载屏幕,加载一些资产并增加栏,然后再次绘制。重复,直到你加载了所有东西。
在伪:
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);
}
这真的不是要走的路,但如果你只是想要一个快速的肮脏的方式,它就可以工作。
是的,您可以访问在另一个线程上创建的资源。您需要做的是在辅助线程上创建辅助 opengl 上下文并使用 wglShareLists 在 2 个上下文之间共享数据。
当然在主线程上使用它之前你需要再次绑定它。