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

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

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

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

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

2

Решение

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

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

3

Другие решения

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

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

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

1

Да, вы можете получить доступ к ресурсам, созданным в другом потоке.
что вам нужно сделать, это создать вторичный контекст opengl во вторичном потоке и использовать
wglShareLists для обмена данными между двумя контекстами.

Конечно, прежде чем использовать его в главном потоке, необходимо снова связать его.

также проверьте этот вопрос
SDL / OpenGL: реализация "Загрузка потока"

0
По вопросам рекламы [email protected]