суббота, 19 мая 2018 г.

Экспорт в Dagon из Blender

Работаю над экспортером контента для Blender. Для хранения сцен я решил использовать свой контейнер Box, в который пакуются меши в формате OBJ, текстуры и файлы с описаниями объектов и материалов. Формат поддерживает граф сцены - то есть, объектам можно назначать родителей.


Кстати, модель средневекового дома (и еще несколько моих игровых моделей) вы можете купить по более чем скромным ценам на CGTrader, чем поддержите мой проект по созданию современного 3D-движка для D.

четверг, 17 мая 2018 г.

dlib 0.13.0 и Dagon 0.7.0

На днях состоялись новые релизы двух основных моих проектов - dlib 0.13.0 и Dagon 0.7.0.

Изменения в dlib:
  • Из основной ветки был удален пакет dlib.async. Решение об удалении было принято из соображений безопасности. К сожалению, у пакета в настоящее время нет активных мейнтейнеров, некому исправлять баги, поэтому я посчитал dlib.async недостаточно стабильным для существования в качестве официальной части dlib - хотелось бы, чтобы все компоненты dlib были в одинаковой степени актуальны и поддерживаемы. dlib.async продолжит существование в рамках ветки async, но пользователям рекомендую обратить внимание на более актуальные и законченные асинхронные движки - такие, как vibe-core
  • Добавлен модуль dlib.image.canvas с реализацией класса Canvas - векторного рендер-движка с интерфейсом, похожим на HTML5 canvas. В настоящее время он поддерживает отрисовку полигонов и фигур Безье с заливкой и контуром. Рендеринг осуществляется в заданное пользователем изображение SuperImage.
  • Улучшен декодер файлов Radiance HDR/RGBE - теперь он читает файлы, начинающиеся со строки "#?RGBE"
  • Добавлены функции tone mapping'а (hdrTonemapReinhard, hdrTonemapHable), новые алгоритмы выделения краев (edgeDetectLaplace, edgeDetectSobel), новые методы для структуры Color4f (toLinear, toGamma)
  • Добавлены новые функции для векторов (reflect, refract, faceforward)
  • Добавлены функции для вычисления касательного вектора кривых Безье (bezierTangentVector2, bezierTangentVector3).
Изменения в Dagon:
  • Полноценный HDR-рендеринг с автоматической экспозицией и tone mapping'ом
  • Поддержка HDR-карт окружения в формате Radiance HDR/RGBE
  • Улучшенные каскадные тени (более эффективное заполнение каскадами пирамиды видимости)
  • Переписан весь код, отвечающий за PBR. Теперь используется модель Кука-Торренса вместо Блинна-Фонга. Добавлена поддержка текстур шероховатости (roughness) и металличности (metallic)
  • Переписана система пост-обработки. Все фильтры теперь являются частью стандартной сцены (BaseScene3D), их остается только включить и настроить. Добавлены фильтры размытия при движении, свечения и цветокоррекции (LUT), улучшен фильтр хроматической аберрации
  • Улучшено встроенное процедурное небо - теперь движок сам генерирует геометрию небесного купола
  • Добавлены слои для сортировки объектов при рендеринге
  • Камера от первого лица облегчает рендеринг оружия в шутерах, предоставляя матрицу оружия
  • Улучшена поддержка джойстиков, добавлена поддержка рулей
  • Dagon теперь использует dlib 0.13.0.
Обновление демонстрационного приложения с использованием Dagon 0.7.0 планируется в ближайшие дни.

вторник, 15 мая 2018 г.

Улучшенные glow и lens distortion

Реализовал более качественный многопроходный эффект свечения и адаптировал шейдер хроматической аберрации из Wagner:


Пост-обработка в Dagon теперь стала намного проще - все встроенные фильтры легко включаются/выключаются и настраиваются при помощи специального API, являющегося частью класса BaseScene3D. Есть и возможность добавлять свои фильтры.

понедельник, 7 мая 2018 г.

Тени с учетом карты высот

Обычные теневые карты ничего не знают о рельефе поверхности и ведут себя так, будто она гладкая. Но если у нас есть parallax mapping и, соответственно, данные о высоте фрагмента, можно улучшить картинку путем смещения не только текстурных координат, но и теневых:

vec4 shadowCoord = shadowMatrix * vec4(eyePosition + eyeNormal * height * 0.3, 1.0);


Таким образом, мы создаем фейковую точку, расположенную выше реальной поверхности, и тень для нее будет рассчитываться как если бы поверхность была действительно рельефной. Эффект особенно заметен на краях тени, углах и скруглениях - там, где при обычном расчете теневых координат была бы сплошная тень, появляются освещенные участки:


Главный недостаток метода - расчет теневых координат происходит пофрагментно, а не повершинно, но на современном железе это не слишком большая жертва.

Не знаю, использовалась ли такая техника раньше, и как она называется - может быть, что-то вроде height-corrected shadow mapping?

вторник, 1 мая 2018 г.

Улучшенный color grading

Мне удалось избавиться от эффекта бэндинга при цветокоррекции с использованием таблицы цветов - скоро все изменения будут доступны в репозитории.

воскресенье, 29 апреля 2018 г.

Блокировка Blogger

Похоже, что массовые блокировки РКН, связанные с Telegram, коснулись и моей любимой блог-платформы - перестали загружаться изображения с серверов Blogger. Делаю такой вывод, потому что через VPN все работает нормально. Если это действительно так, то желаю ответственным за этот беспредел всего нехорошего.

Не очень люблю писать на политические темы, но, честно говоря, я уже устал молчать. Сначала Rutracker, потом Issuu, LinkedIn, Telegram. GitHub тоже пару раз блокировали - практически все, чем я регулярно пользуюсь. Чтоб им провалиться всем - чиновникам, спецслужбам и вообще всей этой паршивой власти. Пора называть вещи своими именами: они либо непроходимые идиоты, не ведающие, что творят, либо тоталитарная фашистская мразь. Я лично склоняюсь к первому, хотя, по сути, одно другому не мешает. Или второе является следствием первого.

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

Да, мы можем подключить VPN или поставить TOR. Мы думаем, что сможем кого-то так перехитрить. Что это может продолжаться вечно - ведь они дураки, и мы всегда на два шага впереди. Но это наивно - просто в один "прекрасный" день мы проснемся в стране без доступа к внешнему Интернету. И это будет только начало - думаю, нет необходимости перечислять все прелести тоталитарного режима. Так можно ли и дальше молчать и делать вид, что все нормально? Нужно ли и дальше дискутировать - в демократичном ли государстве мы живем? Это уже не дискуссионный вопрос, факты говорят сами за себя. Когда власть принимает античеловечные законы, а потом проводит репрессии, ссылаясь на их законность - как это называть? У меня только два варианта, и я их привел выше.

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

Мы не рабы, пока не соглашаемся с ролью рабов. Мы не будем терпеть над собой произвол. Власть нам не господь бог, чтобы покорно сносить любые ее издевательства. Я призываю всех не поддаваться лживой пропаганде, которая сейчас льется из всех щелей, критически оценивать реальность, не игнорировать факты. Видеть своими глазами и думать своей головой. И, конечно, помнить о своих правах.

четверг, 19 апреля 2018 г.

Уроки по Dagon

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

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

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

воскресенье, 18 марта 2018 г.

Почему не 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.

пятница, 26 января 2018 г.

HDR уже здесь

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


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