Cryptovoxels - это виртуальный мир на блокчейне Ethereum. Следите за нами в Twitter или присоединяйтесь к Discord.
Я проснулся в субботу утром в 5 часов утра и, усевшись на диван, попил кофе и немного электро (новый альбом Planete великолепен) и решил попробовать переписать воксельный меш Cryptovoxels.
Немного предыстории - Cryptovoxels использует ao-mesher Mikalo Lysenkos с момента его создания. Я написал ao-mesher - ›преобразователь мешей babylon.js, и теперь мир стал там, где он есть сейчас. Ао-мешер отличный, он делает:
- Отбор (не отображать лица, скрытые между двумя непрозрачными блоками)
- Окружающая окклюзия (используйте раскраску вершин, чтобы сделать углы темнее)
- Жадное построение сетки (превратите копланарные грани в одну большую грань, чтобы меньше треугольников)
Однако с ao-mesher было несколько проблем:
- Для этого требуется шейдер с 4-кратными вызовами texture2d (), чтобы при поиске текстуры в атласе текстур не возникало странных искажений.
- Это действительно грубый фрагмент кода, поэтому добавить к нему более продвинутое освещение было невозможно.
- Я хотел написать свой Mesher, чтобы узнать, что он будет включать
Итак, я сел с первых принципов и написал сетку.
Написание простой сетки
У меня было несколько целей для моего нового Mesher:
- Простой код (так что я могу позже перенести его в единство)
- Супер пупер быстро (без сумасшедших оптимизаций)
- Поддержка поддельного глобального освещения
- Выбраковка сетки, но не жадная сетка
Как ни странно, сетка отбраковки, несмотря на то, что она создает намного больше лиц, намного быстрее рендерится на моем Galaxy S6 и Oculus Go. Я думаю, что шейдер, который я написал для рендеринга жадных сетчатых граней, был довольно медленным, и возможность использовать стандартный материал babylon.js намного быстрее.
Теория
Однократное прохождение через трехмерный ndarray, если блок меняется с этого блока на соседний в направлении + x, + y или + z, затем нарисуйте лицо. Я не разделяю вершины между гранями, что немного глупо, но я не мог придумать простой способ сделать это (идеи приветствуются!)
Освещение
У Seed of Andromeda есть отличный пост об использовании заливки для освещения в мире, основанном на вокселях. Я использую это здесь для большого эффекта. Я начинаю заливку светом по краям участка, а затем продвигаюсь внутрь. Это означает, что внутренности зданий затемнены, и свет проникает только через окна и световые люки. Это действительно выглядит фантастически.
Что осталось?
У меня нет ambient occlusion, и есть ошибка с поиском текстуры. Итак, я исправлю эту ошибку, и я мог бы снова запечь окклюзию окружающей среды, код теперь настолько прост, что я не думаю, что было бы очень сложно взглянуть на окружающие воксели и решить, какой цвет установить. вершина. Что ж, я говорю, что это будет легко, я еще не сделал этого, так что это может быть очень сложно.
Из этого следует, что текущий код воздействия солнечного света может быть легко расширен, чтобы позволить светоизлучающие вокселы внутри структур. А также красные, зеленые и синие воксели, чтобы у вас могло быть флуоресцентное / неоновое освещение внутри вашего магазина для создания настоящего киберпанк-образа.
Мы обсуждали светоизлучающий воксель в Discord, и сообщество подняло идею дефицита светоизлучающих вокселей, возможно, токена ERC20, который вы сжигаете, чтобы связать свет с посылкой. Таким образом можно разработать и продать участки с красивой геометрией и соответствующим освещением. В любом случае, это был отличный хакерский уик-энд, надеюсь, мы скоро его развернем.
—
Cryptovoxels - это виртуальный мир на блокчейне Ethereum. Следите за нами в Twitter или присоединяйтесь к Discord.