У меня есть сетка ландшафта, хранящаяся в VBO. Сетка - это сетка, состоящая из прямоугольных треугольников. Другими словами, это выглядит как прямолинейная сетка с диагоналями. Ширина и высота сетки известны, поэтому легко вычислить индексы вершин для заданного XY или наоборот.
Сетка ландшафта будет редактируемой. Мой вопрос касается повторной буферизации данных вершин при редактировании ландшафта. Я буду в состоянии определить прямоугольную область вершин, которые загрязняются любой операцией редактирования, поэтому, очевидно, я бы предпочел отменить буфер только тех и оставить остальные в покое.
Первое, что приходит на ум, это glBufferSubData
. Но я не могу придумать способ выложить свой VBO так, чтобы glBufferSubData
влиял только на грязные вершины. Например, предположим, что моя сетка имеет 5 х 5 вершин. (На самом деле это будет намного больше; это всего лишь пример.) Вот так:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
(Каждое число на диаграмме выше представляет смещение вершины от начала VBO.)
Предположим, что область 3 х 3 в центре нуждается в ребуферизации. Это означает, что я хочу попасть в вершины 6, 7, 8, 11, 12, 13, 16, 17 и 18. Поэтому я могу назвать glBufferSubData
, начиная с индекса 6 и заканчивая 18:
0 1 2 3 4
5 *6 *7 *8 *9
*10 *11 *12 *13 *14
*15 *16 *17 *18 19
20 21 22 23 24
(На приведенной выше диаграмме вершины, отмеченные *
, перебуферованы.)
Обратите внимание, что вершины 10, 14 и 15 не являются грязными, и, тем не менее, они перезаписываются, потому что они находятся в диапазоне, заданном glBufferSubData
. Это кажется мне неэффективным. В случае большого меша я бы в большинстве случаев отбирал больше данных, чем мне нужно.
Есть ли известное решение этой проблемы? Должен ли я вызывать glBufferSubData
один раз в строку (что решило бы существующую проблему, но привело бы к собственным издержкам)? Или это стандартно просто буферизовать полный диапазон и съесть стоимость ненужной записи?
Кроме того, редактирование ландшафта происходит иногда, но не часто. Когда это произойдет, он будет анимирован, поэтому грязные вершины должны будут неоднократно обновляться во время анимации. Я думаю GL_DYNAMIC_DRAW
было бы хорошо. Это звучит правильно?