2016-12-12 4 views
0

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

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

Вот два из основных вопросов, я смотрел на:

OpenGL VAO best practices

OpenGL How Many VAOs

ответ

0

Термин вы ищете является Instancing.

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

Вы можете использовать вычислительные шейдеры или преобразовывать обратную связь для обновления и хранения продукта модели в VAO по одному экземпляру на кадр (вместо вычисления его на каждую вершину каждого экземпляра).

+0

Возможно, в моем вопросе, возможно, было несколько неясным. Я знал об инстинкте, но модели для каждого дерева могут быть немного разными, но использовать ту же текстуру ... возможно, картонные коробки могли бы стать лучшим примером. Если вы посмотрите на ответ на вторую ссылку, я дал свой ответ на первый вопрос, о чем я говорю. – TomShar

+0

Непонятно, что вы спрашиваете. Он говорит о статической геометрии, спрашиваете ли вы об анимации. Что касается картона, звучит так, что на самом деле их можно нарисовать с помощью инстинктов ..? – ybungalobill

+0

Я понял, что он говорил, имея несколько объектов один за другим в одном VBO и используя glDrawMulti *(), чтобы нарисовать все (скажем, 5) объекты, которые имеют разные формы, но используют ту же текстуру. Я спрашиваю, как вы даете им разные преобразования, поскольку вы просто рисуете все предметы в VBO в том же положении, которое бесполезно? Похоже, вы предлагали работать только в том случае, если вы пытаетесь сделать одно и то же несколько раз. Я прошу об рендеринге разных элементов, используя один вызов glDraw, потому что все объекты находятся в одном VBO. – TomShar