Теперь система могла быстро просматривать, где и какие конкретно блоки находятся в пределах одного чанка. Допустим, на поверхности у нас трава, под ней камень, слева песок, а сверху — воздух. Получив этот массив данных, система рисовала секцию чанка как один цельный, сшитый меш (полигональная сетка 3D-объекта). Получая на выходе этакую диораму, которая сама по себе представляла небольшой блок кода с матрицей, заполненной байтами информации.
Стоило игроку сломать или поставить блок, как алгоритм тут же обновлял состояние чанка, перепечатывая его геометрию до актуального состояния в реальном времени.
На этом моменте у Коула возник вполне резонный технический вопрос.
— Почему секции мы берем именно шестнадцать на шестнадцать блоков? Почему не тридцать два?
— Потому что графический API (переводчик между кодом и видеокартой) использует шестнадцатибитные индексы для построения меша. Это база, это знать надо!
— Я знаю как работает Апишка! — Недовольно буркнул из наушников Коул.
— Так вот, тогда ты должен знать. — Спокойно продолжил я. — Что это ограничивает один сшитый меш примерно шестьюдесятью пятью тысячами вершин. То есть: четыре тысячи блоков в чанке умножь на четыре вершины для каждой видимой грани куба, и получишь шестнадцать тысяч. Плюс, заложи еще десять тысяч вершин сверху на будущие сложные объекты, лестницы, столбики и прочий декор. И в итоге ты получаешь запас прочности больше чем в половину лимита, чтобы игра тупо не крашнулась при рендере. Этого должно с головой хватить, чтобы хитрожопые игроки не сломали нам игру слишком быстро.
— Ну да, логично. Лучше перестраховаться. — Как-то с уважением протянул Коул, явно записывая услышанное в текстовый документ, судя по щелканью клавиатуры.
Теперь, когда у нас уже была рабочая система, позволяющая хранить и изменять огромный мир, при этом не сжигая ПК, нужно было заняться финальной стадией оптимизации визуала — куллингом. Проблема заключалась в том, что игра все еще честно отрисовывала все грани всех блоков внутри чанка. И даже при условии, что у нас теперь был всего один игровой объект на секцию, за счет рендера внутренних, невидимых глазу граней, он был неоправданно тяжелым и давал лишнюю нагрузку на видеопамять.
Как это можно было легко исправить? С помощью простейшей проверки соседа для каждой стороны блока при построении меша. Выглядела логика примерно так:
камень рядом с камнем → сосед есть, грань невидима, *не рисуем;
камень рядом с воздухом → соседа нет, грань нужна, *рисуем.
Таким образом, программа оставляла физически видимыми только ту часть меша, на которые, игрок потенциально мог посмотреть. Создавая под ногами условную полую землю, состоящую только из верхней корки толщиной в один пиксель. Дуб из девятого сезона Рика и Морти точно бы заценил этот метод.
По итогу, спустя два плотных дня разработки, с перерывами на тренировки, мы получили почти готовый пре-альфа билд. Он позволял вообще без напряга для системы генерировать процедурный мир практически без ограничений по дальности. Правда, пока он все еще был абсолютно плоским и девственно серым,
— Эта игра популярна среди аутистов? — Спросил Дэвид, спустя пятнадцать минут безотрывной постройки унылого серого домика.
— Не знаю, статистики. — Пожал я плечами. — Но раз тебе нравится, то, значит, видимо, да. Затягивает.
— Очень смешно, Луи Си Кей нашелся тут… — Скривился Выдра, не отрывая взгляда от монитора. Кивнул на принесенную им кипу бумаг на краю стола. — Ознакомься, подпиши. Это готовые договоры на размещение Зомбаков в сторах и еще там договор о пожертвованиях. Хорошо даже, что он есть, сможем меньше налогов заплатить.
— Оу. Нам наконец-то дали возрастной рейтинг? — моментально оживился я, пропустив мимо ушей скучную инфу про налоги.
Подхватил листы и с облегчением принялся бегать глазами по сухим юридическим строчкам договоров. Надо сказать, после бесконечных строчек кода, пестревших перед глазами последние двое суток, увидеть обычный человеческий текст было отрадно.
Проставив подписи, я на пинках выгнал упирающегося Дэвида из-за компа, как раз на том моменте, когда юрист уже приступал к возведению оборонительной стены вокруг своего минипоселения. Затянуло его знатно. А ведь это был всего лишь пустой, серый каркас будущей игры!
И чтобы это исправить, нужно было наполнить мир «Майнкрафта», как это ни удивительно, разнообразными блоками. Ведь пока наши секции чанков строились сугубо из двух сущностей: серого блока и блока воздуха. Которого… ну, в общем, нет его по факту. Вот такая вот бинарная скука.
Первым делом мы вынесли логику в один общий скрипт — «БлокМенеджер». В нем мы записали все значения блоков с их уникальными особенностями. Теперь система при генерации могла спавнить любые типы кубов, просто обращаясь к этому менеджеру, чтобы узнать, какие у них физические характеристики.
Условно, решил я поставить блок камня. В этот момент игра обращалась к блок-менеджеру и считывала следующую инфу:
ID: 3 (камень)
Прочность: 3
Текстура: ячейка 5 из общего атласа