Загрузка текстур при рендеринге (OpenGL)

Я хочу загрузить несколько мешей, включая OpenGL-текстуры, в то время как на экране отображается анимированный экран загрузки (отображается с помощью OpenGL).

Поэтому я делаю загрузку во втором потоке, который, конечно, не работает, потому что я не могу получить доступ к одному и тому же GL-контексту из двух потоков.

Я использую SDL 1.2, и все это должно быть независимым от платформы, поэтому я не могу использовать wgl-вещи.

Какие у меня есть возможности?

3 ответа

Используйте объекты Pixel Buffer для создания отображений адресного пространства для данных изображения (glMapBuffer), отображенная область памяти OpenGL может быть доступна из всех потоков процесса. Скопируйте данные изображения в это, используя вторичный поток, затем glUnmapBuffer а также glTexImage из ПБО в основной теме. Как отображение, так и загрузка текстуры происходят асинхронно, так что вы уже можете обрабатывать следующее изображение, пока предыдущее все еще передается в быструю память.

Все, что вам нужно, это просто способ связи между потоками, какую задачу следует выполнить дальше и когда эта задача будет завершена.

Да, вы можете получить доступ к ресурсам, созданным в другом потоке. вам нужно создать вторичный контекст 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);
}  

Это действительно не тот путь, но он работает, если вы просто хотите быстро и грязно.

Другие вопросы по тегам