Voxel Engine и оптимизация

Недавно я начал разработку воксельного движка. Мне нужны только цветные вокселы без текстуры, но в очень большом количестве (намного меньше, чем у Minecraft) - и вопрос в том, как нарисовать сцену очень быстро? Я использую C#/xna, но это, на мой взгляд, не очень важно в этом случае, давайте поговорим об общих случаях. Посмотрите на эти две игры:

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ

Особенно я думаю, что видео № 2 представляет отличные методы оптимизации (моя карта gfx начинает задыхаться только при 192 x 192 x 64). Как они достигают этого?

Что я хотел бы иметь в двигателе:

  • красочные воксели без текстуры, но затененные
    • много, много вокселей, скажем минимум 512 x 512 x 128, чтобы достичь чего-то вроде видео № 2
    • тени (гладкие тени будут хорошими, но это не обязательно)
    • опционально: динамическое освещение (например, от летящих огненных шаров, которые загораются вблизи воксельных структур)
    • частота кадров минимум 40 кадров в секунду
    • камера имеет 3 способа свободы (перемещение по оси x, перемещение по оси y, перемещение по оси z), вращение камеры не требуется
    • наконец, необязательная функция может быть Глубина резкости (это будет мило ^^)

Какую оптимизацию я уже знаю:

  • удалить невидимые воксели, которые находятся внутри воксельной структуры (покрытой с шести направлений другими вокселями)
    • удалите невидимые грани вокселей - потому что камера не вращается и всегда выглядит наклонной вперед, как в играх TPP, поэтому, если мы разделим экран по вертикальному срезу, левые воксели и правые воксели покажут только 3 лица
    • сохраняйте воксели в словаре вместо 3-мерного массива - переход по массиву размером 512 x 512 x 128 занимает миллисекунды, что недопустимо - но словарь int:color, где int описывает упакованную трехмерную позицию, намного быстрее
    • использовать экземпляр где применимо
    • поглощающий? (как это сделать?)
    • деление пространства / октри дерево (это хорошая идея?)

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

2 ответа

1) Voxatron использует программный рендер, а не графический процессор. Вы можете прочитать некоторые подробности об этом, если вы читаете комментарии в этом блоге:

http://www.lexaloffle.com/bbs/?tid=201

Я сам не выглядел подробно, поэтому не могу сказать вам намного больше, чем это.

2) Я никогда не играл в 3D Dot Game Heroes, но у меня нет никаких оснований полагать, что он вообще использует воксели. Я имею в виду, я не вижу никаких добавленных или удаленных кубов. Скорее всего, это просто статическая полигональная сетка с нанесенной красивой текстурой.

Что касается его реализации, не пытайтесь нарисовать мир, рендеринг кубов, так как это очень медленно. Вместо этого вы должны обработать объем и генерировать сетки, лежащие на пересечении сплошных вокселей и пустых. Разбейте объем на области подходящего размера (например, 32x32x32) и создайте сетку для каждого.

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

Вы можете прочитать его в книгах Google здесь: http://books.google.com/books?id=WNfD2u8nIlIC&lpg=PR1&dq=game%20engine%20gems&pg=PA39

И вы можете найти соответствующий исходный код здесь: http://www.thermite3d.org/

Поскольку вы используете XNA, вы можете просто использовать инстансинг для получения желаемого эффекта: http://www.float4x4.net/index.php/2010/06/hardware-instancing-in-xna/ http: //roecode.wordpress.com / 2008/03/17 / XNA-каркасного gameengine-развитие-часть-19-аппаратный Instancing-ПК-только /

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

Другие вопросы по тегам