Я хочу загрузить несколько мешей, включая OpenGL-текстуры, в то время как на экране отображается анимированный экран загрузки (отображается с помощью OpenGL).
Поэтому я делаю загрузку во втором потоке, который, конечно, не работает, потому что я не могу получить доступ к одному и тому же GL-контексту из двух потоков.
Я использую SDL 1.2, и все это должно быть независимым от платформы, поэтому я не могу использовать wgl-вещи.
Какие у меня есть возможности?
Используйте объекты Pixel Buffer для создания отображений адресного пространства для данных изображения (glMapBuffer
), отображенная область памяти OpenGL может быть доступна из всех потоков процесса. Скопируйте данные изображения в это, используя вторичный поток, затем glUnmapBuffer
а также glTexImage
из ПБО в основной теме. Как отображение, так и загрузка текстуры происходят асинхронно, так что вы уже можете обрабатывать следующее изображение, пока предыдущее все еще передается в быструю память.
Все, что вам нужно, это просто способ связи между потоками, какую задачу следует выполнить дальше и когда эта задача будет завершена.
Это, безусловно, не самое элегантное решение, но вы можете просто нарисовать экран загрузки с пустой полосой, загрузить некоторые ресурсы и увеличить полосу, а затем нарисовать ее снова. повторяйте, пока не загрузите все.
в псевдо:
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);
}
Это действительно не тот путь, но он работает, если вы просто хотите быстро и грязно.
Да, вы можете получить доступ к ресурсам, созданным в другом потоке.
что вам нужно сделать, это создать вторичный контекст opengl во вторичном потоке и использовать
wglShareLists для обмена данными между двумя контекстами.
Конечно, прежде чем использовать его в главном потоке, необходимо снова связать его.
также проверьте этот вопрос
SDL / OpenGL: реализация "Загрузка потока"