Несколько вершинных буферов на сетку - PullRequest
0 голосов
/ 21 февраля 2011

Я столкнулся с ситуацией, когда размер моего меша со всеми его вершинами и индексами превышает верхний предел (оптимального) объекта буфера вершин (~ 8 МБ).Мне было интересно, могу ли я разделить сетку между несколькими буферами вершин и каким-то образом сохранить достоверность индексов.Т.е. треугольник с индексом в первой вершине и индексом в последней (т. Е. В отдельных VBO).

Все время поддерживая это в объектах Vertex Array.Мои мысли таковы: избавьте себя от хлопот, а для таких мешей (messes: P) просто используйте необходимый размер (> 8 МБ);что я и делаю в данный момент.Но в идеале мой буферный менеджер (wip) на данный момент использует оптимальные размеры;Тогда мне, возможно, придется сделать особый случай.

Есть идеи?

Примечание: я также сделал кросс-пост в стеке gamedev , так как я не былконечно, для которого это было бы более подходящим (это частично вопрос дизайна).

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

8 МБ данных вершин - это достаточно много для одной модели.Я уверен, что эта модель может быть разделена на отдельные сетки.Хорошим местом для разбиения сетки являются острые края, поскольку вершины вдоль этих ребер имеют разные нормальные векторы, поэтому они не идентичны и не могут использоваться совместно.

Однако более важным, чем размер VBO, является размер пакета рендеринга, передаваемого вglDrawElements (или glDrawArrays).По моему опыту, оптимальный размер пакетов рендеринга составляет от 100 до 2000 треугольников до того, как давление в кеш-памяти возрастет. Но вы должны измерить это в своей системе самостоятельно.

0 голосов
/ 22 февраля 2011

Насколько мне известно, вы можете установить только один glVertexPointer. Таким образом, вы можете установить этот указатель на хранилище больших данных, но это будет в памяти клиента и без VBO. Если вы не хотите использовать VBO, может быть только один раз.

Но на самом деле вы можете сохранить все свои данные в качестве текстуры и использовать геометрический шейдер для перестройки модели только из индексов. Предел текстуры на моем Radeon 3870HD составляет 8192 на измерение, но вы с большей вероятностью исчерпаете память, используя более чем 1D текстуру (512 МБ памяти на моей карте и полная 2D RGB текстура составляет около 805 МБ). В геометрическом шейдере вы можете соединить свои вершины в соответствии с поддерживаемыми индексами и создать меш, но это довольно большой обходной путь и не очень практичный.

Как уже упоминалось, такие точные модели довольно бесполезны. В большинстве 3D-дизайнеров у вас есть модификатор, чтобы получить гораздо меньше полигонов, не влияя на визуальность, вы просто выбираете деталь, которая перегружена. Это также огромный удар по производительности, когда вы думаете о том, что большую часть времени вы видите около 50% модели, а остальные отбрасываются тестами.

...