Я разрабатываю программу на 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 проблему?