10 лет блогу

Сегодня мой блог о разработке игр на языке D отмечает 10-летний юбилей! 30 сентября 2012 года я опубликовал первый пост, в котором поставил задачу написать 3D-игру на D с использованием OpenGL. С тех пор утекло много воды, я несколько раз переписывал заново свой движок, перешел с 32-битной на 64-битную архитектуру, сменил несколько операционных систем и версий OpenGL, но изначальная цель не поменялась.

В 2015 году блог привлек внимание русскоязычного филиала журнала PC Magazine, который проводил опрос, посвященный разработке игр: как устроены игры изнутри, как программируются серверы, как моделируется игровой мир, какие используются средства разработки. Материал по результатам опроса – в котором, в числе прочего, упоминается и мой движок – был опубликован на сайте журнала, но, к сожалению, теперь не доступен в связи с уходом PC Magazine из России. В 2019 году, спустя 7 лет со дня открытия блога https://dlanggamedev.blogspot.com, я переехал на коммерческий хостинг и личный WordPress. Администрирование собственного WP-сайта было для меня совершенно новым опытом, я изучил PHP и улучшил навыки верстальщика – однажды даже написал свой спам-фильтр для комментариев, но в этом оказалось мало смысла после перехода на reCAPTCHA v3.

За эти годы инди-геймдев, к сожалению, так и не стал для меня коммерчески выгодным занятием. Скажу прямо: работа над Electronvolt непомерно затянулась, и вряд ли ее выпуск как-то финансово оправдает вложенные усилия и время. Доход, который я получаю от всех моих хобби-проектов, основан на донатах через Patreon и PayPal. Но это не значит, что я разочарован – наоборот, в процессе я написал кучу полезного кода, который мне постоянно пригождается в других сферах деятельности. За эти 10 лет я глубоко погрузился в профессию графического разработчика и изучил множество технологий: в 2016 году даже рассматривал возможность стажировки в NVIDIA, но раздумал, так как не захотел переезжать в Москву. Позднее мне довелось четыре года проработать в цифровой рекламе в продакшн-компании SmartHead, где я сделал множество интерактивных баннеров и несколько рекламных игр. Самыми интересными проектами были игры “Привидения и котики” для Google и “Food Box Killer” для Ehrmann (вторая примечательна использованием движка Phaser 3), а также брендинг Forbes для BMW с анимацией на основе шейдерного эффекта WebGL. К сожалению, выложить эти проекты на сайт не могу из-за NDA, но вы можете их увидеть на сайте баннерного отдела SmartHead. Знания, которые я приобрел благодаря своему хобби, очень помогли в работе, и я даже как-то раз использовал D для одной специфической задачи – а именно, для написания генератора выпуклых оболочек для спрайтов под физический движок Matter.js.

Сегодня я занимаюсь, в основном, веб-разработкой и графическим дизайном на фрилансе. Много пишу на JS (браузерный код и Node.js), а D так и остался языком “для души”. Но, может, это и к лучшему – ведь должно же быть у человека чисто творческое занятие, в котором он полностью свободен и независим от чужих задач и потребностей: по образованию я художник, и к программированию отношусь как к отдельному виду искусства. На D легко и приятно писать, и я все еще считаю его лучшим из всех компилируемых языков – ни на минуту не пожалел, что вложил столько сил в код на нишевом языке с небольшим сообществом. Хотя часто жалею, что в сутках всего 24 часа – не успеваю отслеживать все интересные мне новые технологии. OpenCL, CUDA, Vulkan, WebGPU, аппаратная трассировка лучей – что-то прошло мимо меня, что-то я изучил лишь на самом базовом уровне. Но надеюсь, что смогу углубляться в эту сферу и дальше – и, конечно, вести блог еще 10 лет, минимум!

О звуковых движках

Что происходит со свободными звуковыми движками? Возвращаюсь к этой теме раз в несколько лет, и каждый раз ситуация все печальнее. Использовал когда-то Squall в эпоху Game Maker, он оказался заброшен с 2009 года. Потом долгое время сидел на OpenAL-soft, но у него тоже много лет не было обновлений (хотя в последние годы какое-то шевеление вроде началось). Ушел я с него по той причине, что захотелось движок с блэкджеком и шлюхами – то есть, со встроенной поддержкой всех аудиоформатов. Уже работая над Dagon, выбрал SoLoud, который активно разрабатывался до 2020 года, и с тех пор ни одного релиза.

Есть, конечно, движки для C++, в том числе довольно крутые – но, ребят, неужели делать API для C вышло из моды? В мое время это само собой разумелось. Не знаю теперь, что делать – не на закрытый FMOD же переходить. Возможно, форкну SoLoud, если так и не найду ему замены.

PBR-текстуры при помощи нейросети

Обнаружил интересную ESRGAN-модель Material Map Generator, которая генерирует карты нормалей и шероховатости из фототекстур. Работает довольно быстро и показывает весьма качественные результаты – у меня, например, из картинки с ракушками получилось вот такое:

Канал G пришлось инвертировать для совместимости с Blender, а диффузную текстуру я сделал с помощью утилиты Agisoft De-Lighter – тоже, кстати, очень полезный инструмент.

Для запуска нужен Python с установленными numpy, opencv-python и torch.

Пример ImGui в Dagon

В Dagon 0.14 появилось расширение для работы с популярным UI-тулкитом ImGui – dagon:imgui. Это у меня уже второй инструмент для создания пользовательских интерфейсов после Nuklear, и во многом ImGui оказался проще и удобнее – хотя, конечно, оба тулкита имеют свои особенности, и нельзя сказать, что один однозначно лучше другого. Но ImGui на сегодняшний день является де-факто стандартом, поэтому его поддержка стала довольно важной вехой в развитии движка. Расширение основано на биндинге BindBC ImGui, модуль bindbc.imgui.ogl (ImGuiOpenGLBackend) оказался полностью совместим с Dagon.

(далее…)

Dagon 0.14.0

Выпустил новую версию движка. Основное нововведение – рефакторинг системы текстур: в частности, текстуры теперь могут быть загружены напрямую, без необходимости создавать объект SuperImage, что позволяет создавать текстуры любого формата, поддерживаемого OpenGL – таким образом, достигается лучшая совместимость с DDS. 2D-текстуры и кубические карты объединены в один класс Texture, и работать с ними стало проще. Появилась поддержка формата сжатия ASTC.

(далее…)