Я занимаюсь разработкой программы на 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?