3

我想在屏幕显示动画加载屏幕(使用 OpenGL 渲染)时加载一些网格,包括 OpenGL 纹理。

所以我在第二个线程中加载东西,这当然不起作用,因为我无法从两个线程访问相同的 GL 上下文。

我使用的是 SDL 1.2,整个事情必须独立于平台,所以我不能使用 wgl-stuff。

我有哪些可能性?

4

3 回答 3

3

使用 Pixel Buffer Objects 为图像数据创建地址空间映射(glMapBuffer),映射的 OpenGL 内存区域可以从进程的所有线程中访问。使用辅助线程将图像数据复制到此,然后glUnmapBufferglTexImage主线程中的 PBO 复制。取消映射和纹理上传都是异步发生的,因此您已经可以处理下一个图像,而前一个图像仍会传输到快速内存。

然后,您所需要的只是一种在线程之间进行通信的方式,该线程将执行下一个任务以及该任务何时完成。

于 2012-12-15T16:21:23.627 回答
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);
}  

这真的不是要走的路,但如果你只是想要一个快速的肮脏的方式,它就可以工作。

于 2012-12-15T14:33:52.467 回答
1

是的,您可以访问在另一个线程上创建的资源。您需要做的是在辅助线程上创建辅助 opengl 上下文并使用 wglShareLists 在 2 个上下文之间共享数据。

当然在主线程上使用它之前你需要再次绑定它。

还要检查这个问题 SDL / OpenGL:Implementing a "Loading thread"

于 2012-12-15T16:29:42.977 回答