OpenGL VBO в нескольких потоках

Я разрабатываю программу на C++/OpenGL, которая рисует рельеф всего мира. У меня есть база данных высот, хранящаяся в виде плиток. Каждый раз, когда я запускаю программу, загружается плитка. Затем, когда человек перемещается, должна загружаться другая плитка, это происходит не каждый кадр, может быть, раз в 5 минут.

Я загружаю начальную плитку в память видеокарты:

glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, VBOsz * 3 * sizeof(float), tile_data, GL_STATIC_DRAW_ARB);

... Есть нормали, цвет и индексные буферы

И я рисую их:

glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, VBOsz * 3 * sizeof(float), tile_data, GL_STATIC_DRAW_ARB);


glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, VertexBuffer[idx]);
glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

...

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, IndexBuffer[idx]);
glDrawElements(GL_TRIANGLES, IndexBuffersz, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

Поскольку я хочу, чтобы программа была как можно более гладкой, я не могу просчитывать вершины+цвет+нормали+другие текстуры в том же кадре, так как на создание тайла уходит около 20 секунд.

Поэтому я решил сделать поток загрузчика, который будет проверять, когда нужно загрузить новый тайл, и затем загружать его. Когда все будет готово, он должен просто поменять VBO местами (отсюда и [idx]).

Итак, для потока-загрузчика я знаю, что мне нужен второй контекст OpenGL, я создал его и обмениваюсь списками между ними. Идея работает, но в потоке загрузчика, когда я посылаю новые данные VBO, мне нужна эта функция: wglMakeCurrent

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

Есть ли у вас идеи по поводу решения? Нужно ли мне изменить концепцию?

Я использую OpenGL 2.1. Решит ли обновление до OpenGL 3 проблему?

5
задан genpfault 18 January 2012 в 15:53
поделиться