Использование DynamicVertexBuffer в XNA 4.0 - PullRequest
0 голосов
/ 16 января 2011

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

Тем не менее, не все кубы имеют вершины (некоторые являются воздушными, что является прозрачным), и не все грани кубов тоже нужно рисовать (они обращены друг к другу), так как мне отслеживать, какие вершины хранятся где в буфере? Кроме того, некоторые грани должны быть нарисованы в последнюю очередь, а именно те, у которых есть прозрачность (например, стекло или листья), и эти грани также должны быть нарисованы в обратном порядке, чтобы не испортить альфа-смешение.

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

Кроме того, количество вершин может меняться, но DynamicVertexBuffer не кажется мне очень динамичным, поскольку я вообще не могу изменить его размер. Нужно ли заново создавать буфер каждый раз, когда мне нужно добавить или удалить лица?

1 Ответ

3 голосов
/ 16 января 2011

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

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

Подобные крупномасштабные проблемы видимости намного быстрее выполняются в коде, чем в графическом процессоре.Например, если вы сидите в начале координат и смотрите + x, вы можете сразу проигнорировать все кубы в направлении -ve x, это очень простой пример.

Для более полного примера поиска по октавурендеринг.Этот вид рендеринга вполне соответствовал бы вашему плану мира.

Последний совет - когда я говорю «генерировать пакеты буферов вершин» - я имею в виду пакетирование кубов вместе таким образом, чтобы минимизировать изменения в состоянии графического процессора (например,текстура, тот же шейдер и т. д.).Минимизация изменений в состоянии графического процессора - это ключ к оптимизации рендеринга - после того, как вы сделали все возможное, прежде всего выбрав грани рендеринга.

...