2011-12-31 3 views
1

Я хотел знать, предназначены ли OpenBL VBO для использования только для больших массивов геометрии или имеет смысл использовать их даже для небольших массивов. У меня есть код, который позиционирует разнообразную геометрию относительно другой геометрии, но некоторые из «листовых» геометрических объектов довольно малы, 10x10 квадроциклов и тому подобное (200 треугольников за штуку). У меня может быть очень большое количество этих мелких листовых предметов. Я хочу иметь другую матрицу преобразования для каждого из этих маленьких листовых объектов. Кажется, у меня есть 2 варианта:Производительность использования большого количества небольших VBO

  1. Используйте отдельный VBO для каждого листового объекта. Я могу в итоге получить большое количество VBOs.

  2. Я мог хранить данные для нескольких объектов в одном VBO и применять соответствующие преобразования при изменении данных для данного листового объекта. Это кажется странным, потому что часть точки OpenGL состоит в том, чтобы эффективно выполнять большое количество матричных операций в аппаратном обеспечении. Я бы делал в программном обеспечении что-то, что OpenGL разработано очень хорошо для аппаратного обеспечения.

Имеет большое количество VBOs неэффективно, или я должен просто пойти дальше и выбрать вариант 1? Есть ли более эффективные способы решения ситуации с наличием большого количества мелких предметов? Должен ли я использовать вершинные массивы или что-то в этом роде?

ответ

1

некоторые хорошая информация находится по адресу: http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

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

Один огромный буфер не получит огромной разницы в производительности ... Я думаю, что лучшим вариантом было бы хранить несколько (но не все) объектов на один VBO.

renderin с использованием одного буфера: нет проблем с этим ... у вас просто есть один буфер, который связан, а затем вы можете использовать glDrawArrays с разными параметрами. Например, если один меш состоит из 100 Verts, а в го буфера у вас есть 10 из этих сеток вы можете использовать

glDrawArrays(triangles, 0, 100); 
glDrawArrays(triangles, 100, 100); 
glDrawArrays(triangles, ..., 100); 
glDrawArrays(triangles, 900, 100); 

таким образом минимизировать изменение буферов и еще вы можете сделать его достаточно эффективным.

Являются ли эти «маленькие» объекты одинаковыми? они имеют одинаковую геометрию, но разные преобразования/материалы? Потому что, может быть, стоит использовать «instancing»?

+0

Что такое instancing? – Gravity

+0

вот некоторая информация: http://sol.gfxile.net/instancing.html, но в основном это оптимизированный способ многократного рендеринга одних и тех же объектов (но с разными преобразованиями и материалами) – fen

2

Самое оптимальное решение , если ваши данные являются статическими и состоят из одного объекта, будет использовать display lists и один VBO только для одной сетки. В противном случае общее правило заключается в том, что вы хотите избегать делать что-либо другое, кроме рендеринга в основном контуре рисования.

  • Если вы никогда не должны добавлять или удалять объект после инициализации (или трансформироваться любой объект), то это, вероятно, более эффективным, чтобы связать один буфер постоянно и изменять значения Stride/смещения для отображения различных объектов.

  • Если у вас есть только базовый набор геометрии, который останется неподвижным, используйте для этого один VBO и отдельные VBOs для геометрии, которые можно добавить/удалить/изменить.

  • Если вы можете удалять объекты по желанию или удалять объекты по своему желанию, каждый объект должен иметь собственный VBO, чтобы упростить управление памятью.

+0

Даже если моя геометрия остается статической, как я могу иметь дело с тем, что различные преобразования могут быть применены к различным объектам геометрии листа? Или это не считается статическим? Является ли более эффективным размещать все в одном буфере, а затем использовать повторяющиеся вызовы 'glDrawRangeElements', чем создавать столько буферов, сколько у меня есть объекты геометрии? – Gravity

+0

В этом случае я бы просто начал с раздельных VBOs для каждой сетки (не каждого объекта, каждой сетки) и занимался их преобразованиями отдельно. Если вы обнаружите, что это проблема производительности, я бы оптимизировал. –

+5

О, господин, списки отображения устарели ..... –

Смежные вопросы