2012-01-04 3 views
2

У меня есть сетка рельефа, хранящаяся в 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 будет хорошо. Правильно ли это звучит?

ответ

3

Вы должны использовать буферный объект mapping. Вы можете получить доступ к буферному объекту в виде массива памяти, действительно обращаясь к разреженным вершинам. Драйвер (надеюсь) оптимизирует его для вас.

Правильное использование GL_DYNAMIC_DRAW.