在渲染过程中加载纹理(OpenGL)

3

我希望在屏幕上显示OpenGL动画加载界面的同时加载一些包含OpenGL纹理的网格。

我将加载过程放到一个另外的线程中,但是这个方法不起作用,因为我无法从两个线程中访问同一个GL-context。

我正在使用SDL 1.2,并且整个过程必须是跨平台的,所以我不能使用wgl-stuff。

我有哪些可能性呢?

3个回答

3
使用像素缓冲对象来创建图像数据的地址空间映射(glMapBuffer),可以从进程的所有线程访问映射的OpenGL内存区域。使用辅助线程将图像数据复制到这个内存区域,然后在主线程中使用glUnmapBufferglTexImage从PBO上传纹理。解除映射和纹理上传都是异步的,因此您可以在前一张图片仍被传输到快速内存时处理下一张图片。
接下来,需要一种方法在线程之间通信,以确定下一个任务要执行的时间以及何时完成该任务。

1

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

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

还要检查这个问题 SDL / OpenGL:实现“加载线程”


还可以查看问题“OpenGL:用于加载资源的辅助线程?”。 - Robert Fey

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);
}  

这真的不是正确的方法,但如果你只想要一个快速而简单的方法,它还是能够起作用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接