2014-10-22 2 views
0

Я хочу создать несколько потоков для загрузки объектов с текстурами, но это не сработает. Я читал, что я должен создать новый контекст OpenGL в каждом потоке, но когда я это сделаю, программа выйдет из строя. Это другой способ сделать это?Загрузка многопоточных объектов в OpenGL

Я использую freeGLUT. Эти функции я хочу использовать в потоках:

glGenBuffers() 
glBindBuffer() 
glBufferData() 
glGenTextures() 
glBindTexture()  
glTexImage2D() 
glGenerateMipmap() 
glTexParameteri() 
glTexEnvi() 

ответ

3

Ни один из тех, кого вы можете вызвать в другом потоке. Если вы не создадите другой связанный контекст openGL в другом потоке, но это не просто.

Что более простое создание объекта в памяти в другом потоке, а затем его основной поток сбрасывает его в VBO. после того, как сигналы загрузочной нити это сделали.

Другой вариант - это сначала создание и распределение буфера в основном потоке и использование glMapBuffer, чтобы получить указатель, который вы можете записать (даже из другого потока), и позволить загрузочному потоку хранить свои данные там и передавать сигнал, когда это будет сделано после чего основной поток может отменить его.

+0

Итак, как создать новый контекст в GLUT? Я не хочу перестраивать свои функции загрузки. – Klapek

+1

GLUT не обеспечивает назначенное управление контекстом. Он, безусловно, выполняет некоторые функции при создании окна, но не подвергает его API. Если вы действительно этого хотите, вы можете напрямую использовать WGL/GLX/AGL, или SDL/glfw/etc. Однако вы этого не сделаете; он не даст вам преимуществ в производительности, совсем наоборот. Кроме того, очень мало вещей можно разделить между контекстами, и состояние явно не является одним из них, поэтому ваши 'bind' и' texenv' не могут быть выполнены в нескольких потоках. – keltar

+0

@keltar, но буферный объект может быть общим, что вам нужно для многопоточной загрузки. –