Улучшения в Adaptation и Tone mapping по результатам открытого тестирования
Одними из частых отзывов по результатам первого открытого теста были «слишком светло при взгляде из помещений на улицу, ослепляет» и «блики на земле ослепляют».
Мы попробовали улучшить эту часть, и сейчас расскажем о проблеме и решении.
Динамический диапазон освещения, воспринимаемый человеком — не говоря уже о диапазоне, в котором игра строит кадр — намного больше, чем диапазон, выдаваемый обычным LDR монитором (от 0 до 1, всего 256 градаций яркости каждого цветового канала).
Процесс преобразования HDR-изображения в LDR-картинку на мониторе называется tone mapping.
Хотя любой диапазон (хоть от 0 до бесконечности) технически возможно отобразить в диапазон от 0 до 1, при этом будут неизбежны разнообразные потери (яркости, цветности, и контраста — пример).
Задачей «хорошего» tone mapping является передача максимального числа деталей, то есть сохранение контраста и одновременно — создание убедительного, приятного для глаз изображения. Существует множество решений этой задачи, но, как правило, и фотографы и кинематографы всё равно используют экспозицию, соответствующую яркости изображения в интересующей зрителя области кадра (фото).
Кроме того, возможности нашего человеческого глаза всё-таки тоже ограничены, хоть он и воспринимает намного больший диапазон яркостей, чем способен передать монитор. Находясь на ярком солнечном свету, вы всё же не сможете различать детали в тени, например, в окнах неосвещенных помещений, так же как и наоборот — яркий свет может «ослепить» после адаптации глаза к тени.
Разумеется, игра должна доставлять комфорт, поэтому мы не можем себе позволить производить темновую адаптацию в течение часа, как это происходит в жизни, но всё же использование адаптации представляется наиболее разумным компромиссом между реалистичностью, качеством, детализацией и информационной насыщенностью изображения.
Один из используемых в фотографии методов — локальный оператор tone mapping (пример). Он позволяет получить фотографию с максимальным уровнем локального контраста и одновременно сохранить все детали. К сожалению, этот метод плохо подходит для динамического изображения (такого, как кино или игры), поскольку он основан на методе определения «областей» разной яркости, и при движении камеры приводит к миганию по яркости частей изображения, появлению тёмных или ярких гало и прочим неприятным артефактам.
Поэтому в играх, как правило, используется автоматическая адаптация/экспозиция всего изображения.
Автоматическая адаптация всего изображения используется в играх достаточно давно (чуть меньше двух десятилетий), и сами механизмы её реализации отличаются в не очень значительных деталях. Упрощённо, игра получает среднюю (или медианную) HDR-яркость изображения и старается выставить такое значение экспозиции, что эта яркость будет неизменной в пределах определённой сцены (оставаясь при этом в разрешённых настройками пределах).
Dagor Engine использует гистограмму по яркости, это позволяет опираться не на среднее, а на медианное значение (или значение определённого перцентиля), что решает проблему некомфортной адаптации к некоторым очень ярким, но маленьким областям (лампочки, блики, искры). На основании отзывов с первого открытого теста мы проанализировали, что ещё мы можем улучшить, чтобы сделать игру более комфортной.
Первый тест был посвящен Битве за Москву, в осенне-зимних пригородах Волоколамска. На этой карте мы увидели следующие особенности:
-
Снег (белый и яркий). Адаптация к снегу приводила к тому, что он становился более серым и спокойным, что хотя и возможно в жизни, но едва ли выглядит приятно (мы привыкли, что снег воспринимается белым) и, кроме того, делает помещения очень тёмными (при взгляде снаружи).
-
Много бликующей «грязи». Грязь — достаточно тёмная сама по себе, но блики при падении света под углом делают её бликующей и яркой. Адаптация не срабатывала, так как довольно много чёрной грязи одновременно не бликует (при других углах).
-
Тёмные бревенчатые дома. Адаптация делает их спокойно-серыми, и они смотрятся неплохо, но такая экспозиция приводит к тому, что снег и небо в окнах «слепит». Разумеется, для игрового процесса было бы лучше, если бы глаз не адаптировался так сильно к тёмному дереву — ведь наше внимание в немалой степени приковано к тому, что находится за окном.
Чтобы улучшить поведение игры в этих проблемных областях, мы остановились на следующем решении. Вместо автоматической адаптации к яркости изображения мы используем адаптацию к освещённости изображения (на самом деле, мы в итоге остановились на взвешенной модели, и используем среднее между той и другой адаптацией).
Адаптация по освещённости во многом соответствует тому, как мы воспринимаем (и как фотографы стараются передавать) окружающий мир. Несомненно, глаз рано или поздно адаптируется к яркости снега или угольной сажи, если смотреть только на них, но на фотографии (или в игре) мы предпочитаем видеть снег более белым, а уголь — более чёрным. Фактически, дополнительно учитывая альбедо (цвет) освещаемой поверхности, мы можем улучшить итоговое изображение.
Снег, с точки зрения процесса адаптации, становится менее ярким (так как свет не становится ярче только оттого, что он упал на снег, а не на чёрную грязь), а значит, адаптация воспринимает всё изображение менее ярким, и в итоге снег выглядит более белым, а детали в тени становятся светлее.
Стало (снег белее, в тенях светлее) | Было |
Чёрная грязь “становится” более яркой, а значит, блики на ней не так ослепляют (хотя сама грязь будет выглядеть темнее). |
|
Стало (грязь темнее, блики менее ослепляющие) | Было |
Тёмное дерево бревенчатого дома изнутри будет темнее, но зато снег и небо в окне не будут так ослеплять. |
|
Стало (сами помещения темнее, но свет за окном не ослепляет) | Было |
|
|
Стало | Было |
Надеемся, эти улучшения придутся нашим игрокам по вкусу!