渲染时加载纹理(OpenGL)

时间:2012-12-15 13:45:43

标签: c++ multithreading opengl textures openglcontext

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

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

我使用的是SDL 1.2,整个过程必须与平台无关,所以我不能使用wgl-stuff。

我有哪些可能性?

3 个答案:

答案 0 :(得分:3)

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

然后,您只需要在线程之间进行通信,然后执行该任务以及完成此任务。

答案 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在两个上下文之间共享数据。

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

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