Voxel Engine и оптимизация
Недавно я начал разработку воксельного движка. Мне нужны только цветные вокселы без текстуры, но в очень большом количестве (намного меньше, чем у Minecraft) - и вопрос в том, как нарисовать сцену очень быстро? Я использую C#/xna, но это, на мой взгляд, не очень важно в этом случае, давайте поговорим об общих случаях. Посмотрите на эти две игры:
Особенно я думаю, что видео № 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
вызов. В вашем случае поток экземпляра будет представлять собой один сплошной блок, а другой поток будет представлять информацию о преобразовании и цвете.