Вся правда о трассировке лучей в ReShade

Всё чаще на Shazoo публикуются видео, демонстрирующее работу RT (Ray Tracing) шейдера за авторством Паскаля Глишера, в ряде игр. Визуальные изменения картинки в таких видео варьируются от практически незаметных до просто шикарных. Или же, наоборот, совершенно не вписываются в изначально задуманный дизайнерами стиль. Легко заметить что эти посты, нередко сопровождаются критическими комментариями касаемо данной технологии. Как энтузиасту в данной теме мне кажется, что главная проблема в недостатке информации о том, на что мы смотрим в данных видео. Не помогает ситуации и то, что авторы снимают их с настройками “по умолчанию”. В прогрессе развития освещения в играх, за счёт трассировки лучей думаю можно не сомневаться. Это же решение, находится на полпути между полноценной трассировкой и растеризацией. И показывает отличные результаты при правильном применении.

Сегодня я опишу в каких играх применение этого шейдера имеет смысл, влияние RT на производительность, и как это всё настроить. Шейдер включает в себя две графические технологии: AO (Ambient Occlusion) и GI (Global Illumination, но здесь это ближе к Indirect lighting). Глобальное затенение AO присутствует в играх уже давно. SSAO, HBAO, HDAO (и прочие вариации) затеняют те области, где объекты находятся близко друг к другу. GI же освещает сцену путем преломления лучей. Так, выходящие из центра экрана лучи, сталкиваясь с ярким объектом, отражаются от него, перенимая цвет и яркость объекта и корректно (не всегда) разлетаются вокруг, освещая полученным окрашенным светом всё, с чем столкнутся. Так яркий объект посреди серой комнаты начинает освещать окружающее пространство. Indirect lighting - сравнительно редкая технология в играх, в виду высоких системных требований. А потому чаще используется “запеченное” непрямое освещение в статичных сценах, а не обработка всего и в реальном времени.

“Есть исключения, например, в CryEngine очень убедительный Indirect lighting работающий в реальном времени, с довольно низким потреблением ресурсов.”

Обе технологии в этом шейдере (как и всё в ReShade) работают в рамках того, что отображается на экране. Потому яркий объект, не освещающий окружающее пространство, исчезнув за гранью экрана, перестанет взаимодействовать с шейдером.

Ограничения Ограничения "Screen space"

Как легко догадаться, смысл использовать RT для улучшения визуала есть в тех играх, где ощущается строгая нехватка AO и GI. Хорошим примером для добавления обоих технологий будет игра The Witness. Стандартный визуал залитого солнцем и усеянного красочной растительностью острова идеально подойдет для демонстрации работы шейдера и его детальной настройки.

Уверен, что весь процесс с загрузкой ReShade с оф. сайта и установкой в папку содержащую .exe игры описывать смысла нет. Трудности могут возникнуть по двум пунктам. Необходимость выбрать API игры (DX9\10\11\OpenGL). Если не знаете наверняка, используйте метод перебора. Второе, но не по важности, ReShade должен видеть Depth Buffer игры. Проверяется это добавлением к списку устанавливаемых шейдеров “Display Depth.fx”. Если в обоих половинках экрана присутствует корректное не перевернутое изображение, значит буфер читается без проблем.
Архив с шейдером можно получить на Патреоне автора. Файл с расширением .png нужно отправить в папку reshade-shaders\textures а остальные в reshade-shaders\shaders.

Теперь к настройкам.
- Значение Ray Length - это расстояние, на которое тень или свет отраженный от объекта распространяется в кадре. Почти самый главный параметр, от правильной настройки которого зависит, будет ли сцена выглядеть как мазня или нет. Стандартное значение "15.000". Тень\свет от объекта будет распространяться за его пределы на это расстояние. Должен сказать, что почти в любой ситуации это значение слишком велико. Чтобы лишь близко находящиеся предметы затеняли\освещали друг друга, это значение нужно уменьшить. Для того, чтобы эффект распространился на большие расстояния, увеличить.
- Значение Ray Amount - это количество использующихся лучей. Ниже значение - выше производительность, и более шумная картинка. Выше - наоборот.
- Ray Step Amount - это количество отражений луча от поверхностей в рамках разрешенного ранее расстояния. Так, чем выше значение, тем контрастнее область затенения. Имеет чуть ли не большее влияние на производительность, чем предыдущий пункт.
- Ambient Occlusion Intensity - это интенсивность применяемого затенения. Большие значения могут сделать тень слишком выраженной. Регулируется, опираясь исключительно на ваше ощущение прекрасного. На производительность не влияет.
- Indirect Lighting Intensity - то же, что и прошлый пункт, только касаемо света.
- Пункт Next Bounce Weight по умолчанию скрыт и активируется добавлением строки “INFINITE_BOUNCES 1” (без кавычек) в меню “Edit preprocessor definitions”. Эта настройка регулирует мягкость распространения отраженного света. Как и предыдущие два пункта, не влияет на производительность и настраивается по вкусу.
- Fade Out Start / End определяет на каком расстоянии от камеры все применяемые эффекты начнут становиться прозрачными. Первое значение - это дальность начала, а второе - дальность, где эффект полностью исчезнет. Если в игре есть туман, скрывающий объекты на расстоянии, стоит подогнать второе значение под этот эффект. Если оно будет выше, то шейдер будет отображать участки затенения скрытые за туманом.
- Enable Debug View позволяет посмотреть на сцену через буфер глубины. Только геометрические формы объектов и наложенные шейдером эффекты.

Видео ниже демонстрирует описанные выше настройки в действии. Как можно заметить по счетчику кадров, при активации ReShade фреймрейт снижается в два раза. Эти значения не связаны с настройками графики в игре, только с настройками шейдера. Вне зависимости от сложности игровой сцены фпс будет снижаться существенно. Нельзя ускорить работу этого эффекта с помощью вычислительных блоков видеокарт линейки RTX. Только с помощью грубого повышения мощности GPU, или чудес оптимизации в будущем. Известно что на данный момент шейдер находится в альфа-версии, и в будущем возможно станет работать быстрее. Но это не точно. Но уже сейчас, в стандартном наборе загружаемых эффектов есть “PPFX_SSDO.fx”. Внезапно обновившийся шейдер из более ранней версии ReShade, теперь работает и на последних версиях программы. SSDO также добавляет AO и GI поверх картинки игры. Влияние на производительность существенно ниже, что впрочем выливается в значительно большее число настроек, чтобы этого добиться. Я бы хотел подробнее разобрать настройки SSDO, и в целом работу ReShade в следующих блогах.

Продолжение следует?..