我希望在屏幕上显示OpenGL动画加载界面的同时加载一些包含OpenGL纹理的网格。
我将加载过程放到一个另外的线程中,但是这个方法不起作用,因为我无法从两个线程中访问同一个GL-context。
我正在使用SDL 1.2,并且整个过程必须是跨平台的,所以我不能使用wgl-stuff。
我有哪些可能性呢?
我希望在屏幕上显示OpenGL动画加载界面的同时加载一些包含OpenGL纹理的网格。
我将加载过程放到一个另外的线程中,但是这个方法不起作用,因为我无法从两个线程中访问同一个GL-context。
我正在使用SDL 1.2,并且整个过程必须是跨平台的,所以我不能使用wgl-stuff。
我有哪些可能性呢?
glMapBuffer
),可以从进程的所有线程访问映射的OpenGL内存区域。使用辅助线程将图像数据复制到这个内存区域,然后在主线程中使用glUnmapBuffer
和glTexImage
从PBO上传纹理。解除映射和纹理上传都是异步的,因此您可以在前一张图片仍被传输到快速内存时处理下一张图片。是的,您可以访问在另一个线程上创建的资源。 您需要在第二个线程上创建一个辅助OpenGL上下文,并使用wglShareLists在两个上下文之间共享数据。
当然,在主线程上使用它之前,您需要再次绑定它。
还要检查这个问题 SDL / OpenGL:实现“加载线程”
这肯定不是最优雅的解决方案,但您可以使用空白条绘制加载屏幕,加载一些资源并增加条形图,然后再次绘制它。重复此过程,直到您加载完所有内容。
伪代码如下:
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);
}
这真的不是正确的方法,但如果你只想要一个快速而简单的方法,它还是能够起作用的。