Несколько мешей в одном буфере вершин? - PullRequest
7 голосов
/ 13 октября 2009

Нужно ли использовать один буфер вершин на сетку или я могу хранить несколько сеток в одном буфере вершин? Если да, то должен ли я это делать и как мне это сделать?

Ответы [ 4 ]

5 голосов
/ 13 октября 2009

Вы можете хранить несколько сеток в одном буфере вершин. Вы можете повысить производительность, поместив несколько маленьких мешей в один буфер. Для действительно больших сеток вы должны использовать отдельные буферы. SetStreamSource позволяет указать смещение буфера вершин для текущего меша.

pRawDevice->SetStreamSource( 0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride() );
2 голосов
/ 13 октября 2009

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

Обычно, чтобы объединить их, вы просто создаете 1 большой буфер вершин со всеми данными вершин, уже трансформированными в него миром, один за другим. Затем вы устанавливаете индексный буфер, который отображает их один за другим. Тогда у вас есть все, что рисует в минимальных колл-коллах. Конечно, если вы перемещаете одну вещь, которая требует обновления части буфера вершин, именно поэтому это идеальная ситуация для статической геометрии.

Если все объекты одинаковы, вы будете использовать только 1 буфер вершин (с 1 определением объекта в нем) и 1 индексный буфер в любом случае, верно? Матрицы перемещают или оживляют объект ...

Если все объекты разные и движущиеся / анимируемые, то я бы просто придерживался отдельных VB. Я сомневаюсь, что вы заметите разницу, объединив их все вместе.

0 голосов
/ 16 октября 2009

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

0 голосов
/ 13 октября 2009

С OpenGL вы можете использовать glVertexPointer(), чтобы начать рисование с определенного смещения внутри VBO. не уверен насчет D3D.

...