У меня есть сетка рельефа, хранящаяся в VBO. Сетка представляет собой сетку, состоящую из правых треугольников. Другими словами, он выглядит как прямолинейная сетка с диагоналями. Ширина и высота сетки известны, поэтому легко вычислить индексы вершин для заданного XY или наоборот.OpenGL 2.1: Ребуферирующий субрегион в VBO
Рельефная сетка будет доступна для редактирования. Мой вопрос касается отклонения данных вершин при редактировании ландшафта. Я смогу определить прямоугольную область вершин, которые загрязнены какой-либо операцией редактирования, поэтому, очевидно, я предпочел бы отталкивать только тех и оставить остальных в покое.
Первое, что приходит на ум, это glBufferSubData
. Но я не могу придумать способ выложить свой VBO таким образом, чтобы glBufferSubData
влиял только на грязные вершины. Например, предположим, что моя сетка имеет 5 x 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 x 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
(В диаграмма выше, вершины, помеченные *
являются rebuffered.)
Обратите внимание, что вершины 10, 14 и 15 не загрязнены, и все же они получают rebuffered, потому что они находятся в пределах, указанных в glBufferSubData
. Это кажется мне неэффективным. Для большой сетки я бы отказался от большего количества данных, чем мне нужно в большинстве случаев.
Есть ли известное решение этой проблемы? Должен ли я звонить glBufferSubData
один раз за строку (что бы решить настоящую проблему, но пришло бы с ее собственными издержками)? Или это стандарт, чтобы просто заполнить весь диапазон и съесть стоимость ненужного письма?
Кроме того, редактирование ландшафта происходит иногда, но не часто. Когда это произойдет, оно будет анимировано, поэтому грязные вершины должны будут обновляться повторно во время анимации. Я думаю, GL_DYNAMIC_DRAW
будет хорошо. Правильно ли это звучит?