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