Воксельный движок и оптимизация

Недавно я начал разрабатывать воксельный движок. Мне нужны только цветные воксели без текстуры, но в очень большом количестве (намного меньше, чем в 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). Как они этого достигают?

Что бы я хотел иметь в движке:

  • colorful voxels without texture, but shaded
    • many, many voxels, say minimum 512 x 512 x 128 to achieve something like video #2
    • тени (гладкие тени будут отличными, но это не обязательно)
    • необязательно: динамическое освещение (например, от летящих огненных шаров, которые загораются возле воксельных структур)
    • частота кадров минимум 40 FPS
    • камера имеет 3 способа свободы (перемещение по оси X, перемещение по оси Y, перемещение по оси Z), вращение камеры не требуется
    • наконец, необязательной функцией может быть Depth of Field (это будет мило ^^)

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

  • remove unseen voxels that resides inside voxel structure (covered from six directions by other voxels)
    • remove unseen faces of voxels - because camera have no rotation and always look aslant forward like in TPP games, so if we divide screen by vertical cut, left voxels and right voxels will show only 3 faces
    • сохраняйте воксели в словаре вместо трехмерного массива - переход через массив размером 512 x 512 x 128 занимает миллисекунды, что недопустимо - но словарь int: color, где int описывает упакованную трехмерную позицию, намного быстрее
    • использовать инстансинг там, где это возможно
    • окклюзия? (как это сделать?)
    • разделение пространства / октодерево (это хорошая идея?)

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


person komorra    schedule 12.10.2011    source источник
comment
Обратите внимание, что в обоих видеороликах показаны движки, которые, похоже, не поддерживают вращение. Кроме того, во втором видео, вероятно, используются рекламные щиты для объектов, находящихся вне фокуса, а не для объектов вокселей.   -  person Skizz    schedule 12.10.2011


Ответы (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#v=onepage&q&f=false

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

person David Williams    schedule 12.10.2011

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

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

person MSN    schedule 12.10.2011