Уроки по Dagon

Решил написать цикл вводных уроков по основным возможностям Dagon. Найти их можно тут. Конечно, по мере развития движка они неизбежно будут устаревать, но я постараюсь держать их в актуализированном состоянии.

Также недавно я получил в свое распоряжение руль, и, соответственно, добавил поддержку рулей в Dagon (вернее сказать, улучшил уже существовавшую обертку над API ввода SDL2). Пример Dagon с машиной уже работает с рулями – надеюсь скоро выложить видео.

Планы на будущее следующие: в ближайшее время собираюсь довести до ума поддержку PBR-материалов, после чего выпустить Dagon 0.7 с новым HDR-рендером. Дальше, скорее всего, буду смотреть в сторону deferred rendering, поскольку на прямом рендере стало уже сложно получать современную картинку.

Почему не Go?

Сейчас много говорят о языке Go – многие на нем даже что-то пишут, звучат призывы переходить на него. Но я бы не советовал. Я вижу больше евангелизма, чем реальных фактов и сравнений.

Go – это выражение идеологии, согласно которой у программиста нужно отнять все “слишком мощные и опасные” инструменты, чтобы исключить для него возможность выстрелить себе в ногу. Go не способствует полету программистской мысли, вместо этого он вынуждает программиста тратить время на решение проблем, которых в других языках попросту нет.

Go игнорирует весь опыт и успехи языкотворчества последних 30 лет.  Отсутствие шаблонов, нормального ООП, перегрузки функций и операторов, арифметики указателей – все это не имеет ничего общего с идеей простоты, о которой любят говорить евангелисты Go. Это реакционизм, желание закрыть глаза и не видеть современных задач, решение которых требует современных инструментов. Язык застрял в 70-х – технологии должны стремиться к простоте, но не к опрощению.

Go использует сборщик мусора. В D он тоже есть, но там можно написать свои собственные шаблонные New и Delete и писать в стиле C++, просто игнорируя сборщик мусора. Если вы попытаетесь сделать что-то подобное в Go, вам будут мешать все силы ада. Линус Торвальдс как-то сказал, что язык не может считаться системным, если он пытается скрыть от программиста механизм выделения памяти (“Any compiler or language that likes to hide things like memory allocations behind your back just isn’t a good choice for a kernel”). Он, правда, имел в виду C++, но тем не менее.

В Go неэффективная костыльная совместимость с C. Не знаю, как для других, но для меня C.int и C.char – это вырвиглазный ужас. Я уже не говорю о том, что вызов внешней функции в Go влечет переключение контекстов – учитывая, что ни один нормальный проект не обходится без библиотечных вызовов, тут уж просто без комментариев.

Наконец, Go почему-то не разрешает ставить открывающую операторную скобку на новой строке – это как-то связано с отказом от обязательной точки с запятой в конце утверждения. Для кого-то, наверное, это не проблема – это один из общепринятых стилей, но я лично люблю ставить скобку на новой строке, и не понимаю, почему обязан изменять своей привычке.

Подводя итог: хайп вокруг этого языка мне совершенно не понятен. Я не знаю, в каких именно областях хорош Go – какую ни возьми, везде найдется более подходящий язык. Для игр он точно не подходит. Go обычно позиционируется как современная замена C, но когда заходит речь о реальных задачах, которые решаются при помощи C, евангелисты Go кричат, что они не входят в область применения языка. Так чем же она ограничена, эта область? Консольными утилитами? Если выбирать между Go и C, то я уж лучше выберу C.

HDR уже здесь

Все улучшения, которые я сделал в Dagon за последние месяцы, доступны в репозитории движка. Обновлено также и демонстрационное приложение. Изменения касаются, главным образом, рендера – Dagon теперь полностью основан на HDR. Используется автоматическая экспозиция (динамическая адаптация к освещению), поддерживаются операторы тональной компрессии Reinhard и Hable/Uncharted. Движок теперь понимает файлы Radiance HDR/RGBE, которые можно использовать в качестве карт окружения.

Также появилась поддержка motion blur (который делается все в том же широком диапазоне), а все доступные фильтры постобработки стали частью стандартной сцены (BaseScene3D). В будущем надеюсь сделать их более настраиваемыми, а также добавить новые фильтры.

Итоги года

Близится конец года, и, значит, настало время для очередного подведения итогов. К сожалению, в связи с постоянными разъездами и дипломной работой у меня было мало времени на хобби-проекты, но какой-то прогресс все же имеется.

  • Для Atrium был разработан новый графический движок Dagon на основе OpenGL 3.3 и SDL2, поддерживающий множество современных технологий, в том числе CSM и кластерный рендеринг.
  • Я написал ради развлечения симулятор автомобиля с использованием физического движка dmech – в итоге, этот код стал частью демонстрационного приложения Dagon.
  • Вышли несколько важных релизов коллекции библиотек dlib – 0.10, 0.11 и 0.12. Появились новые компоненты – например, dlib.async и dlib.memory, поддержка анимированных изображений и APNG, а также загрузчик формата HDR.
  • Вышли три номера журнала “FPS” (46, 47, 48). В 2018 году журналу исполняется уже 10 лет!
  • “Blender. Настольная книга” теперь доступна на GitHub – в виде markdown-исходников, автоматически публикующихся через gh-pages.
  • На сайте LightHouse Software вышла моя статья по D – Векторная графика в dlib.

Напоследок, по сложившейся традиции, перечислю самые значимые для меня события в мире CG, СПО и геймдева:

  • Бэкенд DMD был перелицензирован под лицензией Boost, что наконец-то сделало компилятор полностью свободным.
  • Начало разработки Blender 2.8 с новым фотореалистичным вьюпортом Eevee.
  • Выход OpenGL 4.6.
  • Закрытие Steam Greenlight.
  • Официальное прекращение развития Flash – важный шаг в сторону открытого веба.
  • Анонс нового открытого фильма от Blender Institure – “Agent 327”.

    Новые скриншоты

    Еще несколько скринов грядущего HDR-рендера: