Изменение только определенного типа элемента данных буфера VBO? - PullRequest
2 голосов
/ 13 июля 2011

У меня сейчас VBO, использующий одиночный буфер, в нем есть элементы вершин, texcoord и color.

Теперь, возможно ли эффективно обновить только текскорды без обновления вершины / цвета? Эффективность должна быть такой же, как при обновлении отдельных буферов.

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Вы можете отобразить определенный диапазон вашего VBO в пользовательскую память, используя glMapBufferRange .Конечно, если ваши данные вершин, цветов и текстовых координат чередуются, это будет эквивалентно glMapBuffer .

РЕДАКТИРОВАТЬ:

Если ваш VBO:

[XYZ XYZ XYZ XYZ RGBA RGBA RGBA RGBA TxTy TxTy TxTy TxTy]

Вы можете загружать только координаты текстуры, сопоставляя последнюю часть буфера ([TxTy TxTy TxTy TxTy]) и обновляя ее.Вы также можете использовать glBufferSubData для этого.Обновление этого буфера будет быстрее, чем полного.

Но если вы используете чередующиеся данные:

[XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy]

Тогда вы не сможете обновить часть буфера.

2 голосов
/ 13 июля 2011

Вы можете отобразить VBO в пространство памяти и затем обновить texcoords, просматривая данные и изменяя их.

Одним недостатком является то, что весь VBO, после модификации, необходимо будет повторно отправить в видеопамять для рендеринга;если вы часто изменяете это, пропускная способность шины может стать проблемой.

Если вы пытаетесь внести какую-то алгоритмическую модификацию в ваши texcoords, вы, вероятно, могли бы сделать этот расчет в шейдере.Другой вариант - создать массив новых значений на стороне ЦП, отправить эти значения в шейдер и выполнить замену во время рендеринга;однако, с помощью этой опции, вы могли бы просто исключить текскорды из исходного VBO.

...