Загрузка текстур при рендеринге (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);
}
Это действительно не тот путь, но он работает, если вы просто хотите быстро и грязно.