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.