OpenGL: много маленьких VBO в порядке или нет? - PullRequest
1 голос
/ 03 февраля 2012

У меня много объектов, но я хочу, чтобы один из этих объектов (тот, над которым наводит курсор мыши) "светился" (быстро менял цвета).

Таким образом, один из способов сделать это состоит в том, чтобы каждый объект имел свой собственный VBO. У меня не будет цветового массива. Тогда у меня будет около тысячи VBO, каждый с примерно 20 квадраторами ... и если это выбранный объект, я буду вызывать glColor3f (бла, бла, бла) перед ним, иначе это будет цвет по умолчанию.

Другой способ - собрать их всех в одном большом VBO. У меня будет массив цветов. Затем я сделаю что-то вроде glBufferSubDataARB в массиве цветов, чтобы один объект светился.

Какой путь лучше и почему? Также предложите другой способ, если оба способа плохие.

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

Вы знаете что-нибудь? Просто забудьте о массиве цветов. Цветовой массив не имеет смысла, потому что у вас нет другого цвета для каждой вершины, но для целых групп объектов.

Поместите все данные вершин в один VBO без каких-либо цветных данных.

Затем переберите цвета (или группы объектов), для каждого из которых вы будете вызывать glColor3f и glDrawArrays, где параметры first и count соответствуют числу вершин, принадлежащих объектам этого цвета .

Когда вы когда-нибудь перейдете от конвейера с фиксированными функциями к шейдерам, вы просто замените glColor3f на glUniform3f.

0 голосов
/ 03 февраля 2012

Сколько разных цветов? Можете ли вы поместить их все в VBO одновременно и просто использовать glColorPointer, чтобы выбрать другую часть VBO для выбранного объекта для каждого кадра? Изменение смещения в VBO более эффективно, чем привязка другого буфера или загрузка новых данных в буфер.

По сути, я предлагаю нарисовать кучу обычных невыбранных объектов, затем вызвать glColorPointer, чтобы выбрать цвет выделения, затем нарисовать выбранный объект, затем вызвать glColorPointer, чтобы вернуть смещение VBO назад, а затем нарисовать оставшиеся объекты.

Тот факт, что все данные о вершинах и цветах находятся в одном VBO, не означает, что вам нужно визуализировать все объекты одним вызовом.

0 голосов
/ 03 февраля 2012

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

РЕДАКТИРОВАТЬ: Кроме того, чтение причины, по которой вы хотели использовать несколько VBO, заставляет задуматься.Почему бы не передать переменные цвета как однородную переменную в шейдере?

...