2013-08-06 4 views
0

Я пытаюсь написать функции, которые могут рисовать общие фигуры без текстур. Это включает в себя систему примитивных многоугольников, но в качестве примера я буду использовать функцию моего прямоугольника:Редактирование данных буфера в массиве вершин

void Rectangle (float x1, float y1, float x2, float y2);

Я не уверен, как лучше всего справиться с этим, учитывая, что весь мой рендеринг использует VAO. Моя нынешняя мысль состоит в том, чтобы использовать одно VAO с одним прикрепленным к нему VBO и редактировать этот VBO каждый раз, когда вызывается одна из этих функций. Поэтому для примера прямоугольника я просто привяжу буфер и вызову glBufferData, проходящего в массиве с параметрами для точек прямоугольника, а затем передайте массив вершин на оставшуюся часть моей системы рендеринга.

Не удается найти информацию о том, хранит ли VAO ссылку на буфер или делает внутреннюю копию данных на основе буфера и формата. Можно ли редактировать буфер каждый раз, когда я собираюсь сделать его с помощью VAO, и если это так, я должен каждый раз вызывать glVertexAttribPointer?

+0

Iirc, ссылка указывает, что VAO хранит идентификаторы VBOs, привязанные к нему, но ничто не должно препятствовать вам связывать VBO с несколькими VAO, например. Точка использования VAO заключается в том, чтобы избежать необходимости всего кода котельной плиты, необходимого для настройки привязок для данного конвейера рендеринга. – didierc

+0

[там] (http: // http: //stackoverflow.com/questions/8704801/glvertexattribpointer-clarification) вы идете. – didierc

+0

Под «ссылкой» я имел в виду спецификации opengl. – didierc

ответ

2

VAO ссылаются на буферный объект, поэтому, если вы измените его содержимое или перераспределите его хранилище, это будет использовать любое использование объекта-буфера.

Однако вы не должны этого делать. ARB released an extension/core feature last month, основная цель которого - making this impossible. Это не единственное, что делает расширение, но в основном это то, что заставляет его работать.

Это то, что ARB и IHV думают о том, что вы перераспределяете хранение буферных объектов волей-неволей. Так что не делай этого. Если вам нужен buffer to stream data into, это здорово. Просто выделите достаточно большой и потоки в это. Вы можете использовать glBufferData(..., NULL) до invalidate the buffer (при условии, что вы не можете сопоставить его для недействительности или use glInvalidateBufferData). Но при этом вы никогда не должны менять размер буфера.

+0

Вы говорите, что я могу безопасно использовать функцию glBufferSubData, но не функцию glBufferData? –

+0

@ 4th_dimention: Кажется, вы неправильно понимаете разницу между «can» и «* should *». Вы * можете * перераспределить хранилище буфера, и оно будет видно из VAO или чего-нибудь еще, ссылающегося на объект буфера. Вы не должны этого делать. –

+0

В этом случае я должен использовать glBufferSubData, когда я хочу обновить буфер вместо glBufferData? –