Я разрабатываю программу на C++/OpenGL, которая рисует ландшафт всего мира. У меня есть база высот высот, хранящихся в виде плиток. Каждый раз, когда я запускаю программу, загружается плитка. Затем, когда человек движется, другая плитка должна загружаться, это не происходит каждый кадр, может быть, раз в 5 минут.OpenGL VBO в нескольких потоках
я загрузить начальную плитку в памяти видеокарты:
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
Только когда все данные были загружены, я могу установить контекст в поток рендеринга (main нить программы) .Это не заставляет ничего рисовать за этот промежуток времени, что делает программу бесполезной.
У вас есть идеи по решению? Нужно ли менять концепцию?
Я использую OpenGL 2.1. Будет ли обновление до OpenGL 3 решить проблему?
Пожалуйста, прекратите использование формы АРБ-расширения объектов буфера. Они были основной функциональностью почти десять лет; больше нет оправдания. –