Воксели и путь к реализации (длиннопост)
Привет!
Я тут на выходных задумался о вокселях и их реализации. Как я заметил пока есть 2 основных способа отрисовать воксели: ○ процедурный меш; ○ path tracing через шейдер.
● Какой подходит для реализации зависит от проекта и на сколько маленькие воксели хочется реализовать.
Я заинтересовался на сколько возможно и быстро получится сделать воксели как в игре Minecraft(1 картинка).
Minecraft отрисовывает воксели более традиционным(1-м) способом. У этого есть свои плюсы и минусы.
Из-за такого подхода есть ограничение на сколько далеко можно отрисовать мир 1:1 пока fps станет неиграбельным( а еще игровая логика нужна помимо отрисовки.
Поэтому одна из основных оптимизацияй для такого рода миров это уменьшать количество информации которое будет собираться и отправляться с CPU на GPU для отрисовки.
■ Как уменьшить этот объем ?
□ Одна из первых оптимизаций которую можно увидеть на 2-м скриншоте - это не отрисовывать полигоны с обратной стороны соседних чанков.
□ Вторая оптимизация, которую я не успел еще реализовать - это алгоритм greedy meshing. Это когда мы объеденим по осям несколько полигонов в 1.
□ Третья оптимизация - это то над чем я просидел большую часть выходных, а именно LOD(Level of Detail). На скриншоте белые чанки это LOD 0 и до LOD 5, они самые красные. Чем дальше от игрока, тем меньше шагов по массиву вокселей и больше сами воксели. Это позволяет создать ощущение габаритов и массивности мира, без больших потерей в кадрах.
□ Четвертая оптимизация до которой также не дошли руки у меня - это попробовать отрисовывать чанки использую Triangle Strip. Такой подход позволит не дублировать вершины при создании сторон вокселей, но это добавляет свои ограничения и возможные подводные камни на которын еще предстоит надкнуться.
P.S. На втором скриншоте красный столбик - это чанк в котором стоит игрок. Для реализации использовал Rust и библиотеку Bevy.
P.P.S В этом демо нет многих вещей как динамической подгрузки новых, выгрузки старых чанков, а также обновления текущих и взаимодействия с ними.