Небольшая заметка о PBR
Я планировал рассказать о новой системе физического рендеринга Substrate в UE5 на основе подложек. Но для этого мне определенно могла потребоваться небольшая(!) заметка на тему того что такое "Физически корректный рендеринг"
Я пранировал сделать краткую справку, что из себя представляет Набор PBR текстур и как они в шейдере влияют на работу света... но что то дернуло меня ознакомится с оригинальными статьями по теме физического рендера поверхностей... затем послушать лекции SIGGRAPH*
*Special Interest Group on Graphics and Interactive Techniques — Специальная группа по графическим и интерактивным методам, конференция идущая с 1974го года.
И я понял -> что ничего не понял. Ведь:
“All models are wrong”
Да что там - даже ведущие инженеры разработчики внедряющие это в игровые системы жалуются на это:
PBR — это огромная нерешенная проблема, и когда я слышу, как люди мне говорят:
«Да, у нас есть PBR»,
я понимаю, что они на самом деле имеют в виду:
«Я понятия не имею, что такое PBR».
Хотя если честно: я сам не уверен, что понимаю, что такое PBR на самом деле. 🙂
Да мне стало чуть понятнее, но если честно от всего этого стало только хуже, так как количество непонятного и того что я не знаю увеличилось в разы. Так позвольте мне поделится полученным знанием о PBR том как он работает и возможных проблемах и направлениях в рамках которых исследовать тему. А так же своих мыслях о проблемах в современной графики и что для этого нужно сделать что бы исправить ситуацию.
“All models are wrong, but some are useful”
Вульгарное объяснение PBR
(собственно ради которого и писалась заметка)
PBR material:
Для начала что такое PBR материал? Это такой материал который будет выглядить +- корректно при любом внешнем освещение. Днем ночью, утром. В ярком свете и в рассеяном.
Формула описывающая поведение материла и его реакцию на свет.
PBR light:
В рамках упрощенной модели PBR - весь свет можно разделить на точечный источник и GI - глобальное рассеянное окружающие освещение.
И реакция поверхности может быть в виде следющих типов поведения света :
Если реакция на точечные источника света достаточно похожа почти на всех движках, то GI и работа с рассеянным/отраженным светом сильно зависит от реализации в движке. Будут то Запеченный свет, Воксели, Свет атмосферы, Люмен, или Лучики РТ, или набор проб полей:
PBR текстуры(или параметры):
Минимальный набор для создания PBR материала будет состоять из:
- Metal map - Карта металличности. Определяет какая шейдерная модель будет использоваться для каждого пикселя на экране.
0= диэлектрики, 1= 1металлы. - Base Color - Карта Диффузионного цвета или цвет спекуляра. Диффузионный цвет - это цвет свечения поверхности после отражения света.
Спекулярный или зеркальный цвет - это цвет блика метала при отражении. - Roughness или Gloss - карта шераховатости или гладкости. (они обратны друг другу) Определяет в общем случае "размытие" блика на поверхности и поведение отражений на материале .
Традиционно "полуметаллы" выбрасываются из шейдерной модели ради упрощения.
Дескать в обычной жизни большой кусок чистого кремния или Кусок углепластика не встретишь. Вот полный список металлойдов/полуметаллов:
Ну ну...
Металлы почти не диффузируют зато отражают окружающий свет, окрашивая его. Диэлектрики или не металлы - почти не отражают. Зато переизлучают.
В физическом плане это обычно означает что у диэлектриков параметр F₀от почти 0 до 15% (у кристалов 15-25%), а у металлов F₀ от 70% до 100%. Довольно сильная разница что бы реализовать 2 разные шейдерных модели. А параметр Угла Френеля F₀ оказывается четко привязан к такой физически замеряемой переменной как Индекс преломления.
Например такие игровые движки как unity unreal и godot работают со спекуляром диэлектриков в диапозоне от 0 до 8 %. Хотя скажем Фростбайт от ЕА использует расширенный до 16% диапозон.
ну и принцип
PBR Energy conservation
Для этого мы подходим к святаая святых PBR модели, а именно закону сохранения Энергии.
Который гласит, что формулы PBR в движке должны обеспечивать что сколько света вошло - столько и выйдет, за исключением Поглощенного света, и того что будет излучен в виде ИК спектра то есть тепла.
И да разогретые материалы будут светится - для этого бычно используют модель абсолютно черного тела и в движках реализуют через скрипты или функции Black Body в шейдерах:
Как закон сохранения выразить? Визуально?
Это означает что если у шейдера материала выставить Base Color = 1(Абсолютно белый материал или отражение ) и поместит его в белую самосветящуюся комнату (с 6 сторон светить) , то такой материал должен быть "невидим" на фоне.
Вот как тут у шарик справа в сравнение с несовершенным шариком слева:
Впрочем это из за-за оптимизации реальных уравнений Френеля с кучей синусов и косинусов:
Например уравнениями Шлика. Которые в разы проще:
Эффект Френеля - это такой краевой эффект на границе касательного взгляда:
Лучше всего эта разница описана в статье "Fresnel Equations Considered Harmful" от Naty Hoffman из Lucasfilm:
Так что допустимым для рендера становится и вариант тот шарик что хорошо наблюдается слева, если он не сильно выбивается на фоне.
По сути с точки зрения сохранения энергии - только один параметр Base color должен влиять на видимость материала в абсолютно белой печи. Другие параметры влияния иметь не должны влиять на результат с точки зрения идеи имплементации PBR.
Но как мы увидим далее - сохранение энергии это скорее пожелание чем строгое требование.
Зачем же тогда "Energy conservation" нужно? А для того что бы материал правильно реагировал на комбинацию прямого и непрямого освещения. Старые движки, такие как UE3 могли нормально отрисовать на себе только блики от источников света, а "рассеянное" освещение фейковалось параметрами уровня, или зависимости от времени суток. Но для эффективной симуляции - реакция материала на свет должна быть "динамической" в зависимости от интенсивности света вокруг.
Дисклеймер: На свой страх и риск читайте дальше.
Я честно пытался разделять темы - но одна тема тянет другую, другая третья и потом идет возврат к предыдущей. Слишком уж свет и моделирование поверхностей тесно связанная тема. Да можно было бы сделать перевод отдельных статей - но это уже слишком скучно для меня, в конце дам большую часть ссылок, почитаете сами если интересно.
И да - не пытайтесь скормить текст чат боту - он сломается.
История Оптики(Кратко)
(Очень кратко! Но! Если кому то покажется мало - то рекомендую ФЕЙНМАНОВСКИЕ ЛЕКЦИИ ПО ФИЗИКЕ, том 3. Излучение Волны и Кванты)
И начнем мы из далека - вопрос как ведет себя свет начал иследовать еще Огюстен Жан Френель ученый Физик - который родился в 18м веке и проводил свои опыты в 19м. Запомним этого персонажа - он очень важен
Именно опыты Френеля положили основу так называемой геометрической, она же лучевая (Ray) оптики, так же он сделал важные открытия в волновой оптике. Им были открыт показатель преломления и в честь Огюстена был назван один из важнейших параметров в PBR - фактор Френеля, а так же коэффициенты отражений Френеля на углах F0 , F82, F90.
Позже пошли активные исследования в волновой оптике были открыты явления интерференции и дифракции.
Когда было выяснено что у света есть длина волны и длина волны сильно влияет на поведения луча конкретного света (запомним этот момент!)
Позже в начале 20м век были изучены и некоторые квантовые эффекты, - которые "почти" нам в PBR и не пригодятся.
Изобретение PBR, точнее BRDF!
(A few moments later)
Совершим скачек во времни и перейдем к самому интересному - к CG!
Впервые ДФОС была определена Эдвардом Никодемусом в 1965 году.
ДФОС = Двухлучевая функция отражательной способности.
Он назвал ее BRDF, ли по русcки ДФОР функция
Она описывала как окрасится точка поверхности на основании углов падения и отражения - а так же положения источника света и положения глаз наблюдателя.
ах да, расшифровка: BRDF/ДФОР - это
Двухлучевая функция отражательной способности:
Это 4х мерная функция. Где каждая "мера" это свой вариант описания поведения того или иного аспекта поведения поверхности или света.
Где "4 меры" это углы падения и отражения, а так же формулы силы блика и рассеивания поверхности.
Это считает первым математическим приближением к реальному миру...
>>>Математическим<<< Почему я так делаю акцент на "математику"? Что же....
Данная математическая модель поведения света при взаимодействие с поверхностью все еще довольно далека от реальности. Так что весь BRDF подход - строится на том что у нас есть "математическая гипотеза" - как ведет себя свет, она выводится в виде формул и потом в ходе моделирования на суперкомпьютере отскока cветовых отражения лучей и мы получаем формулы что уже только потом проверяется под реальность.
Подгонка - это чистая математика. Это можно рассматривать как сжатие(даже можно сказать пережатие) реальных данных в (пере) упрощенные уравнения. Часто визульно хороший результат BRDF может быть сделан на не физических предположениях. Что бы просто объяснить реально замеряемое поведение материала через эту формулу.
Но почему не используют для основы... реальность? (точнее используют, но увы не все, и не сразу)
Конечно, реальный мир - это идеальное правильное изображение... но замерить в нем что либо без искажений и ошибок, в нем тот еще квест. На выезде это сделать сложно, лучше подготовить для этого целую лабораторию:
Погода в реальном мире не стабильна! Постоянно меняется освещение каждую секунду, труднодоступные поверхности, многослойные материалы, искажения линз ... все осложняется тем что зачастую то что мы видим как "один" цвет может оказаться содержащим свершено разную плотность излучения и вещество сильно зависит от входящих длин волн.
Реальные материалы с реальными, а не усредненными замерами поведения длин волн - дают довольно тяжелые для эмуляции данные:
Нужно ли говорить что разница между реальным и цифровой моделью в 3х цветах RGB модель поведения поверхности, может быть довольно велика и различаться? Зачастую данные могут расходится на 10-20% - а ошибка в 5% может быть очень и очень хорошим результатом!
Вот например различия между моделями BRDF и реальностью для примера. Это показывает как далеки модели от физической реальности:
Но это я забегаю вперед.
Так подгонять начали с модели света имени Ламберта (это другой ученый 18го века)
Эта модель освещения в компьютерной графике, описывающая идеальное диффузное (матовое) рассеяние света. Немного упрощенная для удобства.
В этой модели яркость поверхности одинакова для любого наблюдателя, независимо от угла обзора, и зависит только от угла падения света (косинуса угла между нормалью к поверхности и направлением на источник света)
Но это не очень хорошо. Не хватает Бликов и первое поколение моделей поведения света для BRDF была модель Фонга(Phong) 1973 где была добавлена модель спекулярного блика:
И позже дополненная в 1977м Джимом Блином, что получило название: BlinnPhong (Все эти модели материалов до сих пор есть в 3д редакторах, таких как Мая)
Но наиболее полная и популярная формула поведения света была выведена в1981м
Куком-Торрансом (Это разные люди R. L. Cook and K. E. Torrance) которые представили математическую(!) модель для моделирования поведения света на идеи так называемых "микрофасетках" - дав определение "Шершавости"
Вы наверное (не) захотите спросить - что такое фасеты? Ведь так? Ну если даже нет, то. я все равно поясню:
Фасеты - это обозначение идеально шлифованных граней в ювелирном деле.
Ну если взглянть на 1(!) пиксель текстуры "Шершавости" :
Соотвественно Микрофасеты - это воображаемые грани на крошечном участки поверхности, которые мы не можем различить между собой на макроуровне, так как они сливаются воедино давая лишь "характерную кривую отражения" (Specular Lobe)
Формула задающая плотность граней - выглядит так:
Для удобства - они представляются в виде идеальных ровных (!) треугольников. Но модель поведения отражения света от микрофасетов была определена путем математического вычисления на основе рейтрейсинга по разному набору граней, в разной комбинации и создания модели "лепестка" (Specular Lobe) спекулярного (зеркального) отражения от поверхности.
Эта штука называется функцией Нормального диффузного распределения (NDF)
Собственно есть множество разных результатов такого математического подсчета шероховатости. Их наверное больше сотни!
Особо много наработок и реальных замеров было в лаборатории Митсубиси - MITSUBISHI ELECTRIC RESEARCH LABORATORIES -им это было очень нужно для создания рендеров будущих дизайнов машин:
Так что проверяйте сами какая модель используется в рендере или игровом движке (Например в Unreal использутся модель GGX для NDF)
Собственно реальные физические уровни шероховатости никто и не считает - их определяют "на глаз". Точнее используя довольно сложные инструменты, которые сложно взять с собой.
Так что бы вы были вкурсе, консенсус инженеров сошелся что из всех моделей Phong, Beckmann, Trowbridge-Reitz (оно же GGX) - именно GGX наиболее близка к значительной части окружающих нас материалов. Если быть точнее - то наименее далека - и дает меньшую ошибку - в среднем.
Ох и вы наверное захотите спросить(нет?) как замерить Эту кривую в реальности? Например один из самых простых способов который изобрели в Unity Technologies:
Вам нужно поместить образец материала на специальный вращающейся стенд - и фотографировать материал под разными углами со вспышкой и без, с четким сохранением угла.
Это работает - но ужасно не практично >_<.
Ибо далеко не все материалы будет удобно так "фиксировать", а живые существа вероятно вырываться и убегать... Хотя и тут есть свои способы.
Как это делали в Calisto Protocol. О чем у них есть хорошее выступление на GDC The Character Rendering Art of 'The Callisto Protocol'
Ну лажно это мы забегаем вперед. Как мы видим - термин PBR - сам по себе не совсем корректен. Ибо он идет от математики, и если быть точнее то геометрической оптики.
Но описывает ли она ВСЕ материалы? Определенно нет! Но всегда можем поиграться с шероховатостью позже модифицировав базовое значение в шейдере в зависимости от углов или растояний. Нужно не бояться это делать, ведь текущая модель Микрофасет никак не учитывает возможность: существования разнообразных других вариантов микроповерхностей - из веретена(ткань), Арок и пещер(пор).
А что насчет световозращательных поверхностей таких как скотчлайт?
Катафот он же световозвращатель или ретрорефлектор дает максимальную яркость когда мы на него смотрим по нормали.
У Бена Кловарда было отличное видео как имитировать катафот на UE и Unity! Но этот способ увы от внешних лампочек не зависит. Но PBR это хороший старт - а дальше все зависит от вас!
Из реальных альтернатив нашел только доклад NVIDIA, где та предоставила свою модель "мягких" пыльных поверхностей состоящую из шариков:
Но вернемся к шершавости . И точнее как этот параметр ведет себя на тесте белой печи....ой:
Штож....на самом деле PBR в это плане буквально НЕ работает. Могу заметить, что почти все современные BRDF модели на самом деле не проходят испытания в белой печи. Тон у материала не сохраняется независимо от параметров:
Более грубые материалы темнеют из-за активной потери энергии...
Если для темных поверхностей - можно ручками суммировать карту шероховатости к альбедо через умножение на коэффициент подбираемый руками. То как быть со светлыми? которые из за шершавости могут ощутимо потемнеть?
Это происходит на самом деле от того что модели шероховатости были разработаны на моделях одиночного отскока света.
Более правильно было бы имитировать множественный отскок... но для этого хорошо бы знать точную геометрию микроповерхности!
Например Дисней создал отдельную модель параметра Sheen (блеск) - для объяснения множественного пере отражения на множестве перпендикулярно торчащих ворсинок
Эффект довольно тонкий и виден только на краях, вот пример поближе:
Хотя стоит отметить что модель Sheen от Диснея не является согласованной с сохранением энергии.
Для большинства поверхностей микрогеометрия является изотропной: вращательно-симметричной, без какой-либо присущей им направленности.Но некоторые поверхности имеют характерную анизотропную структуру микрогеометрии:
И это сильно влияет на то как бликует поверхность:
Так для симуляции анизтропии, хорошо подойдут так называемые Карты потока (Flow maps).
Они в чем то похожи карты нормали, где 2 канала описывают следующие параметры: направление движения по UV(лево-право, вверх -вниз)
Строение микроповерхности - очень и очень сильно влияет на то как мы увидим зеркальный блик от микрорельефа поверхности, давайте представим себе вот такую рефленую поверхность:
Не стоит говорить что для наблюдателя А - материал будет бликовать по макcимуму. А наблюдатель Б увидит только диффузионный свет.
То есть корректнее было бы называть такой подход как Geometry Based Render или более дипломатично Physics Inspired Render. Что собственно должно обозначать или геометрический подход или "вдохновение миром" но не точное соответствие, на
Но подождите - оптика состоит из 3х разделов:
- Geometry(Ray) optic
- Wave optic
- Quantum optic
Так давайте поговорим про длины волн и допускаемые упрощения. со стороны физической модели!
PBR свет:
Так давайте разберемся что такое PBR свет и как его моделировать:
Итак - свет это волна.
И мы можем своими глазами видеть целый потрясающий диапазон света из безграничного многообразия электромагнитных волн!
От 400 до 700 нм ...
Но подождите! Как мы видим?
Для этого у нас в глазу есть всего 4 типа рецепторов: Черно белые Палочки замеряющие общую интенсивность и цветочувствительные Колбочки:
И наш глаз принимает все многообразие цветов всего на 3 рецептора!
(палочки палят общую интенсивность!)
А что это значит? Это значит что с точки зрения имитации человеческого зрения в CG - нам совершенно не нужна сложная кривая фронта света - нам нужны только 3(!) параметра цвета
R G и B - соотвествующие чувствительности человеческого глаза! Именно через них и выражается цвет что мы видим.
Для нас реально нет разницы - светит ли в глаз полным диапазоном воспринимамего спекта или исключительно узким RGB частотами... Для нашего глаза, оба эти распределения будут восприниматься одинаково
Как не грустно это признавать - наши глаза это весьма несовершенные приборы которые легко обмануть и которые способны потерять кучу передаваемой извне информации. И не только всего диапазон спектра - но и всякой мелочи вроде поляризации света (некоторые насекомые и молюски способны видеть его )
Но это сильно упрощает головную боль для эмуляции в Рендеринге.
Как и отсекает возможность симуляции некоторых световых эффектов - таких как Флуоресцентная краска для ночных клубов.
Ультрафиолевых чернил, которые светятся под действием УФ излучения в видимом спектре. Увы - такое пока придется задавать в готовых игровых движках через скрипты и Эммисив карты, а не симулировать на основе физики материала.
Другой аспект PBR - который так же иммитируется , а не симуляция переизлучения поглощенного света в виде Инфракрасного следа:
Так что всякие нагревы поверхностей придется кодить отдельно и разные слои игры.
Собственно весь вся математика в CG для света может строится на нескольких вариантах работы с цветом: RGB, HSV и Lab . Ибо посылать массив цветового потока - ни одна видеокарта в реальном времени не потянет.
Впрочем если вы делаете собственный 3д движок - то может именно вы захотите учесть этот эффект излучения видимого света после поглощения УФ или ИК(нагрева)? Так вы хотя бы сможете удивить публику и получить гранты на разработку военных симмуляторов.
Но вернемся к истории введения PBR - я закончил на 1981м когда резко перешел к рассмотрению шероховатости. Это все медленно развивалось и улучшалось по мере роста вычислительных мощностей и накопления эксперементальных данных. Мультфильмы и игры 90х использовали простейшие модели без PBR настоящий проры произошел в конце 2000х когда разные студии пытались пихать модели поверхностей в игры и фильмы.
Но не очень удачно... я нашел не сильно большой списк таких попыток:
- ILM (Iron Man, Terminator: Salvation) 2008
- Pixar (Wall-E, Up) 2008
- Bungie (Halo 3) 2008
- Imageworks (Alice in Wonderland) 2009
- Treyarch (Call of Duty: Black Ops) 2010
Пока наконец не вышел фильм от Диснея в 2012 Ральф! (Wreck-It Ralph) И следом за ним - легендарная статья Диснея, в которой было все разобрано по полочкам и сформулированы принципы ХУДОЖЕСТВЕННОГО PBR(!!!) которые все кинулись осваивать.
"Physically Based Shading at Disney"
Это поменяло все! Так как вместо непонятных физических понятий не совсем понятных художникам - демонстрировался набор принципов как с помощью простых крутилок от 0 до 1: можно навертеть нужный результат:
Это первая из первых моделей затенения, специально разработанная для художников, чтобы :
"Позволить им (почти) всегда делать все физически правильно и получать вменяемый результат и при этом быть максимально простым в использовании"
Последующие модели PBR во многом ведут свою родословную от Диснея - пусть и с определенными упрощениями и допущениями. Люди получили набор настроек которые позволяли получить рендер материала который работал в любых комбинациях в любых условиях освещения!
Например вслед PBR за Дисней кинулся переделывать свой движок Тим Свини - в результате уже через пару лет вышел UE4(2014й) на замену UE3.
Как читать BRDF SLICE?
Вы наверняка заглянули в доклад Диснея - и увидели там сканы BRDF от MERF так похожие на конфеты.
И наверняка у вас возник вопрос "как их считывать" , чтож команда Respawn Entertainment на GDC2017 дала нам хороший урок по их дешифровки
Представим что у нас есть фейковый BRDF в виде радужного градиента:
Тогда он наносится на сферу поворачиваемую против часовой стрелки.
Тогда на срез BRDF, представляет собой поведение матрила в зависимости от 2х углов:
- Угол Падения света
- Угол зрения камеры наблюдателя.
И по разным сторонам плитки проявляются характерные зоны реакци на свет: Зона отражения по Ференлю,
Иногда зона "ретро-отражения" называется " grazing retero-reflection"
Данная картинка описывает положение грани по отношению к источнику свету и зрителю. Думаю на картинку нужно пдольше посмотреть самостоятельно и подумать...
Где углы θ от b θ от h выполняют повороты сферы, а угол φ от d - вращение сферы от перпендикуляра
Соответственно на срезе BRDF мы видим характерные зоны - как меняется вещество в зависимости от угла падения света и угла взгляда на поверхность.
BRDFs В основном зависит от Функция. 𝑁 ⋅ 𝐻 и 𝐿 ⋅ 𝑉!
И наверное вам захочется увидеть сравнение разных моделей на шариках:
Слева на права - идет квадрат "шероховатость", которая выражается в виде квадрата "художественной" шероховатости Альфа
И шарики будут помещены в 3 разных интерьера:
Под Грацией нашел HDR из Grace Cathedral
Uffizi - HDR соотвествующие галереи в Уфицци. А кампус - вероятно относится к окружению кампуса в Цурихе.
1) BRDF на ламберте(? НЕТ! Но тут так написано), чисто синтетический срез поверхности без ретроотражений:
Так как чистый срез BRDF на ламберте - это одноцветная плитка. Что хорошо видно по уравнению:
И из статьи Диснея
2) Disney BRDF - Диснеевская модель поверхности из мультиков и ее
поведение:
3) Oren Nayar 1993
σ = 0.5 альфа - в случае Орен-Наяра работает чуть по другому - без квадрата.
4) New Model
* "Новая модель" это и есть название. Насколько в курсе - это модель параметра Френеля перепараметризовано на основе уравнений Лазаньи-Шлика. И позже легла в основу "Open PBR Surface". Идея в том что в ней Помимо F0 еще и параметр F82. из за нарастающей ошибки света в поведении материала на реальном образце металлов. Значение отклонения % отражения реальных физических замеров может достигать до 3%! (что уже заметно тренированному взгляду)
Вот примерная таблица ошибок между между PBR на основе Шлика и Лазаньи Шлика в сравнении с реальными замерами материалов:
И вы наверное захотите спросить этот вопрос "почему"?
(я захотел - значит и вы должны! Разве это не так работает?)
Почему Disney Principled PBR стал так популярен?
Все дело в том что любое представление работы материала можно разделить на две большие группы: Физически замеряемые параметры приборами, и воспринимаемые результаты в виде конкретных наблюдаемых эффектов и параметров.
Так например мы можем "видеть" лишь часть явлений оптики. Например интенсивность света. И то не абсолютную - а относительную, так как наш глаз имеет свойство подстраиваться под общий средний уровень освещения.
А ту же "поляризацию света" в отличие от некоторых членистоногих мы не увидим. Хотя она существует:
Например поляризацию мы можем увидеть за счет специальных очков с нужнми фильтрами: например через MasterImage 3D с круговой поляризацией и без них, на которых запечатлены мертвые жуки Cetonia aurata.
Обратите внимание, что без очков и жуки, и их зеркальные отражения имеют блестящий цвет, как будто панцирь жука - из металла. Правый поляризатор убирает блеск с жуков, но сохраняет его у их зеркальных отражений. Левый поляризатор действует противоположным образом, меняя направление отраженного света на противоположное. Это происходит из за явления Структурной окраски(Structural coloration) - Явления обусловленного волновыми свойствами света, а именно дифракцией света на устойчивой микроструктуре сравнимой по размерам с длиной волнй от 200 до 1000 нм. Такие явления получили название "Thin-film optics" и стали активно добавляться в рендер недавно.(OpenPBR, Substrate)
Или мы часто не увидим разницу между естественным отражением от поверхности и изображением на мониторе от RBG матрицы.
Точнее наш мозг "адаптируется" под укороченный диапазон монитора всранение всевозможными цветами которые вообще различает наш глаз. В среднем хороший монитор (такой как Retina у Apple) способен передать 2/3 видимого цветового пространства, в то время как плохой - только половины:
Зачем это нам? А затем эта тонкая взаимосвязь между спектральными данными и определением цветового пространства RGB особенно важна при работе со значениями F₀ для металлов!
Хроматические цвета, которые мы присваиваем, должны находиться в пределах гаммы нашего рабочего цветового пространства. Металл, реальный спектральный коэффициент отражения которого выходит за пределы гаммы, может в результате выглядеть слегка ненасыщенным или смещенным при отображении в более ограниченном пространстве, например BT.709. Телевизионного сиганла.
Так же мы не видим микрофасеты (но можем увидеть по эффетку 1го порядка размытию, и буквально можем пощупать!), не видим преломление света и воздуха(а оно есть!) вне особых условий раздела среды. Зато мы видим "ЦВЕТ"(на палочках и колбочках) и Интенсивность.
И именно BRDF DISNEY проанализировав наборы реальных сканов материалов MERF смогла выделить для себя(и нас) простые ползунки позволяющие создать BRDF +- похожий на базу, удобный для художников, так вот базовые принципы материала Диснея:
- Параметры выбирались более интуитинво понятные - а не корректно-физические.
- Параметров должно быть как можно меньше, что бы не вызвать комбинаторного взрыва.
- Параметры не должны влиять на другие параметры как можно меньше.
- Параметры от 0 до 1 должны описывать поведение реального материала. Выход за пределы допустим если параметр имеет художественную ценность. (Анизотропия, Sheen, Спекуляр)
- Выход за пределы (в минус или больше 1) допустим если параметр имеет художественную ценность.(Анизотропия, Sheen, Спекуляр).
Всем подход дисней так понравился - что большая часть игровых движков решила взять себе это решение с минимум изменений.
И по сути сформировалось 2 "школы" PBR:
- 1.Metal/Roughness
- 2.Specular/Glossiness
Отличия в первую очередь в картах Metal/Specular и Base Color.
1й способ через карту металла - блее оптимизированный для реал тайма. А 2й способ подхода к рендеру "более" честный.
Разница в том что в подходе Specular-Glossiness - разницы метал/не металл нет. Движок не разделяет эти процессы. Карта 3х RGB Спекуляр напрямую задает цветной блик Параметра Френеля:
(от 0 0 0) до (255 255 255)
В то время как в Metal -Roughness используется карта маталличности для ручного переключения шейдерной модели между металлическим и не металлическим поведением поверхности. А Дифффуз у металлов отключается - карта Base как раз начинает отвечать за цвет металла.
Карта Шершавости и карта глянца/блеска - это обратные велечины:
Gloss = (1-Roughness) и наоборот.
Для справки движок UE4 использовал Metal -Roughness подход.
Но с выходом Unreal 5.7 системы Substrate старая модель PBR была заменена на систему подложек (универсальная модульная шейдрена система описывающая поведение материала, где нет необходимости выбирать одну шейдерную систему и молится что бы она подходила всей 3д модели) совместимую с OpenPBR (и MaterialX), где карта металличности больше не нужна, и можно как задать прямой параметр F₀, или задать F₀ через IOR.
(Иронично что многие это до сих пор не знают и пытаются делать по старому, не замечая что движок переводит старый PBR metalness/Roughness подход в систему Substrate!)
Или вообще задать в качестве Френеля настоящий(!) Физический LUT поведения зеркального отклика блика от поверхности как это можно сделать в Unreal 5.
В настройках Detail можно добавить нужные градиенты:
Описано как это сделать тут:
Но вернемся из 2020х обртано в 2012+...
Но какие движки были первыми? Кто взял решение диснея?
Но вернемся к рендеру - одной из первых игр с полноценным PBR была Метал Гир от Кодзимы на движке Fox. Она довольна интересна в том плане - что Конами использовала некоторые подходы которых в чистом виде нет в других движках(но мы можем их добавить в шейдере!)
Так для теста материалов для игры, программисты Кодзимы смоделировали их Конферанс зале:
Без шуток. Где еще идеально на работе будешь тестировать материалы в своем же офисе? А Без шуток - они реально это сделали:
Что бы команда художников, могла спокойно приносить внутрь реального зала предметы и смотреть как они выглядят. И потом добиваться такого же визуала и внутри своего ЛИСьего движка:
Проверяя их на экране что был установлен прямо в зале. Полагаю это было довольно удобно:
(!)Так что если вы собираетесь сделать свою реалистичную игру - то один из первых уроков FOX engine и Кодзимы в том - что нужно сделать кусок своего офиса - что бы в нем можно было тестировать материалы.
Нужно понимать что в те времена у разработчиков еще не было таких "привычных" библиотек предоставляемых со стороны команды Substance(их купила Adobe позже) как Painter и Designer. Так что разработчикам, что хотели осваивать PBR пайплайн - приходилось с нуля создавать свои собственные материалы и библиотеки.
Именно поэтому первые игры начлаа 2010х и по 2016 на PBR принципе кажутся более "разнообразными" в визуальном плане чем многие современные игры страдающие от проклятия Unreal5 look/slope. (Эффект при котором почти все игры сделанные на одном движке, одних материалах и текстурах выглядят идентично, что не удивительно.) Впрочем сегодня виноват далеко не сам движок - а "удобные инстурменты" Substance Painter и Designer, которые просто отучают людей эксперементировать над созданием материалов.
В случае Fox engine были не только уникальные материала. Но и собственные шейдерные трюки. Например они шероховатость для некоторых материалов сильно зависела от "угла" взгляда и/или от расстояния.
Это получило название "Viev Dependent Roughness" или переводя с японского "Шероховатость зависящая от точки зрения"
Чем ближе взгляд был к касательной плоскости , тем более зеркальным был материал. И давал физически большее сильный блик:
По сути они сделали шероховатость для "шлифованных материалов" которые были обработаны с одной достаточно грубо, что бы быть шероховатыми при взгляде сверху(нормали), и при этом давали довольно ровные плоскости при взгляде по касательной когда из за затенения нейровности были не видны....
Модель микрофасеток для такой шероховатости можно представить себе такой:
Соответсвенно при достаточно низком угле камеры совпадающим с касательной - неровности высокой плотности должны скрываться за более гладкими плато.
Добавляет ли большинство современных разработчиков такие эффекты в свои игры, даже там где это нужно? Очень сильно сомневаюсь.
Большая часть разработчиков наверняка надеется, что сам подход PBR материалов идеален сам по себе и додумывать/дорабатывать ничего не нужно в игровом движке - ибо анрил/юнити и сделает все за них. Что же пожелаем им удачи, ведь в случае неудачи - они всегда можно обвинить кого то-другого, но не себя за то что визуал выглядит "Дженерик".
Для справки такой эффект в других движках легко моделируется за счет математики на основе угла Френеля в шейдере. Благо его маска считается движком всегда и почти ничего не стоит для GPU.
Шейдер материала с таким поведением шершавостьи идеально подойдет для моделирования шлифованных обработанных камней и древесины. Впрочем можно поступить и обратным образом при моделировании структурной окраски материала - который под касательным углом меняет шероховатость и цвета как те крылья бабочек.
Можно ли передать поведение цвета и света на крыльях с помошью стандартного PBR набора теустур? Нет. Так что вернемся к Конами и материалам:
Создание PBR текстур (в древности)
Для игры Метал Гир, Конами изготавливало свои собственные текстуры, и наверное вам захочется узнать как же они это делали в те времемена когда еще не было ни Пейнтра, ни Дизигнера.
Это сейчас "удобно" создавать материалы процедурным образом за счет Substance Designer, А потом наносить данные материалы в Substance Painter на модель...
Что же, для снятия небольших материалов - у той же Конами была подготовлена специальная комната
И в качестве базовой цветовой мищели использовалась специальная бумага с 18% Эталонным диффузом и ColorChecker - цветовая мишень с эталонными цветами.
Эти штуки нужны для точно калибровки получаемой фотографии, так как "слишком умные" камеры уже тогда пытались менять итоговую картинку. Это нужно было что бы откалибровать камеру перед съемкам и создать настройки.
Полсе чего в зону фотографирования помешался образец текстуры:
К образцу применялись настройки камеры полученные на калибровке камеры: (Да- калибровать нужно каждый раз)
После чего материал отдавался художникам - что бы они зачистили в фотографии следы затенений и бликов. Используя заплатки и прочие инструменты фотошопа:
Как создавать шершавость из PSD файла? Масками по основным цветам, поле чего делали заливки и сверху наносили шумовой узор несовершенств характерный для материала.
После чего для оценки параметров шероховатости и бликов, команда отдельно изучает поведение материла под разными углами освещения что бы оценить примерное поведение отражения материала составить модель поведения BRDF SLICE.
После чего в движке создается пресет материала с нужной шершавостью.
Покраска же большинства объектов в нужные материалы - делалось не вне движка - а внутри его, за счет слоя карт Material ID в буфере Геометрии
В слое рендера Material ID - определял дополнительные особенности материалов. В первую очередь он использовался для переключения вариации материалов: железо/золото/ржавчина.
Это влияло на :
Параметр Френеля, Прозрачность и Зеркальный Цвет для металлов.
Которые брались из свойств ассетов.
Вот так один и тот же пистолет с разными картами мог выглядеть совершенно по разному:
Так же ID отвечал за "износ" и параметр шероховатости. пушки сверху блестят, снизу изношенные.
(Сегодня ID материала часто настраивают в 3д редакторе для создания масок покрасе в Сабстенсе, но почему бы их не использовать в самой игре для создания большего числа вариаций? )
А так же была настройка шероховатости для свойств сухости и влаги.
(Кстати тоже сильно недооцениваемый элемент погружения - материалы зависящие от внешних условий. )
На этом особенности движка FOX engine говорить прекращаем и
вернемся к прочим особенностям PBR... и поговорим о той проблеммах маштаба!
Проблема МультиМасштаба и PBR
Одна из серьезных проблемм материала PBR в игровых движках напрямую связана с вопросом фильтрации текстур и потери "качества" у данных с расстоянием. Так игровые движки упрощают текстурные данные карты в MIP карты :
Это удобно, но увы с увеличением масштаба и расстояния - 3д объекты на сцене могут терять данные об их внешнем виде в результате чего на расстоянии ассеты становятся буквально скучными.
По сути наши PBR материалы хорошо если работают на расстояниях 1-15 метров от камеры игрока. На это можно не обрашать внимание если делаем игру в коридорорах. Но что если у нас будут большие открытые участки?
То за пределами этих диапазона 1-15 метров - нужно значения нужно как то менять, что бы скомпенсировать потери сжатия информации. И очень хорошо это видно на примере карт шераховатости и карт нормали, на которых весь PBR (не считая параметра френеля и работает).
И весь секрет Полишенеля в том... что наши карты шершавости и карты нормалей - хранят в своей сути одни и те же данные данные:
-> данные о сложности геометрии поверхности которые должны переходить в друг друга, а не мипмапится независимо друг от друга! Нормали должны становятся ориентациями микрограней, если смотреть на них издалека. И наоборот - шершавость. вплотную превращаться в нормали!
Делают ли игровые движки это из коробки? Нет.
Если мы сопоставим нашу нормальную и карту шераховатости независимо друг от друга, то получится, что карты нормалей тяготеют к упрощению до плоских поверхностям по мере удаления и общий уровень шершавости слишком стремится к среднему значению, теряя информцию.
Это проблема не нова и называется "зеркальным сглаживанием" в CG.
И специально для вас я нашел материал где она хрит как то решалась!
Для борьбы с зеркальным сглаживанием в индустрии было предложено множество методов. Если еще раз упрощать то проблемма возникает из за потери информации от растоояния. Теряется настоящая форма NDF - лепестка излучения которое должно идти от поверзности.
Она становится слишком гладкой в быстрых алгоритмах мипкарт, вместо того что быть по настоящему сложной!
По хорошему в игровых движках для PBR рендера нужно иметь возможность контролировать форму кривой отклика материала от расcтояния.
Особенно от этого страдают такие материалы как снег/лед из за включений в поверхность кристаллов льда, камни с микровключениями кристаллов, или даже банальный поцарапанный окрашенный метал, где блестящие металлические полосы дают блики из под слоя краски.
Но это отчасти можно поправить, например в оффлайне.
Изветен метод "Bump to Roughness method from Pixar" который используется для решения этой проблемы в Пиксар.
Другой способ коррекции часто используют при создании LODов. Запекая уникальный материал на каждый уровень детализации с хайполи индивидуально. Но этот подход требует большой ручной работы.
Да и с появлением таких технологий как Nanite от Эпик Геймз и megageometry от NVIDIA - этот способ очевидно не подойдет. И есть ли у нас вменяемая альтернатива?
Как ни странно относительно простое решение есть - в статье "Material Advances in Call of Duty: WWII" от АктивижнБлиззард 2017го.
Заметка и так разрослась. Так что пройдусь кратко. Sledgehammer Games предоставила два возможножных алгоритма получения карты глянца. По двум алгоритмам, как суммировать мипкарту нормалей и блеска:
(!) напоминаю что: Gloss = 1-Roughness!
Предполагая, что можно ограничиваемся аппаратной фильтрацией мипкартой, то для нас остается два решения, ни одно из которыхне является идеальным:
-либо используем модель площади микроповерхности и фильтруем, используя неправильную меру площади,
-либо используем Смоделированную область макроповерхности и соответствующим образом отфильтруйте слегка измененное, но неправильное распределение.
Проблема в том что нужны дополнительные исследования что бы понять какой вариант ближе к реальности. Увы несмотря на то что это доклад 2017го года - новых данных особо не прибавилось.
В Call of Duty: WWII Sledgehammer Games использовали модель площади макроповерхности, и все значения, рассчитанные в этой статье, основаны на нормализации площади макроповерхности, как я понимаю - модель макроповерхности соответствует усреднению нормали в мипкарте, так что можно брать 3 канал соотвествующий (если это я не так понял - просьба поправить!)
И финальная апроксимация формулы выглядит так:
Ось X - это Gloss, а ось Y - средняя нормальная длина. Справа апроксимированные данные уточненные так что бы кривая не выходила за пределы: (0.65 <->1) Формула апроксимации наверху.
Примерно так модифицируется мипкарта Блекска от расcтояния: в COD: WW2
MIP с 0 по 5 демонстрационной карты Блеска. MIP с большим номером и с меньшим разрешением справа становятся все темнее, чтобы представить большее отклонение от нормы на normal карте.
Важно отметить, что идея гладкой поверхности упрощается до зеркальной зеркальной при увеличении растояния без каких-либо дополнительных изменений, если средний вектор длины у нормали меньше 0.5-0.65: поэтому если нормаль меньше этого значения - модифификация
Так что читайте и изучайте SIGGRAPH и смотрите подходящие к вам решения...
Микромасштаб
Но что насчет микро масштаба? Кажется очевидным что если текстура окажется вблизи камеры то она не должна быть "размытой", логично что текстуры материалов можно "улучшить" за счет добавления техники Detail Textue и микрорельефа.
Эта обычно шумовая текстура с паттерном микроповерхности не обязана быть "огромной", для наших нужд хватит и тайлов 64х64, 128х128...
Тут уже проще, так как данное решение часто используется уже в движках, в виде подготовленных для нас функции:
Которая внезапно работает...
...неправильно!!!
Эх - и инженеры Epic games не святые.
Так как это решение не будет учитывать ...уже готовую текстуру нашей базовой шероховатости! А ведь именно текстура шероховатости материала должна быть "маской" влияющий на эффект силы и добавления детальной карты нормали! Видите ли тут вход для Альфы? Нет, так что лучше сделать свой набор функций для добавления микрорельефа.
Так как шершавость и карты нормалей в своей сути одно и то же, но на разных масштабах. Дополнительно можно добавить и общее уменьшение шероховатости вблизи на чуть более гладкое - зеркальное. Но по факту это будет художественным решением.
Это ленивый способ использовать готовую функцию, да - готовое решение конечно придаст вашей текстуре деталек вблизи, но что бы эффект был более корректный - нужно немного переделать функцию под себя .
Diffuse Roughness =/= Specular Roughness
Шершавость одна и та же и для дифуза и для спекуляра. Но это частое и довольно сильное допущение и упрощение, которое часто используют во всех игровых движках для реал тайма. По факту же - шершавость для "диффуза" и "зеркального блика" почти будет РАЗНОЙ!
Но для того что бы это передать в игровом дивжке нужно использовать уже модели PBR основанные на многослойных материалах. Где слой с несовершенствами будет добавляться не в карту "шероховатости", а в виде отдельного слоя материала со своим IOR.
Так например это в реальности очень хорошо можем увидеть такое поведение на таких материалах как Стекло, Металл, Покрытый лаком Мрамор, замершие узоры на стекле.
Это происходит от того что поверхность и "дефекты" на поверхности которые мы "приписываем" шероховатости - буквально состоят из включения другого материала с другими базовыми свойствами.
Это может быть пыль или жировой отпечаток грязных рук, капли воды или кристаллы льда - все это будет очень сильно влиять на то как должен себя вести свет падая на поверхность.
Это конечно нам нужно будет отнюдь не везде - а только у некоторых специфичных материалах.
И это можно сделать только в движках поддерживающих многослойные BRDF как Unreal 5 , хотя как я ранее уже замечал - многие не будут этого делать просто потому что даже не задумываются об этом явлении. Когда в следующих перейду к рассмотрению Substrate - обязательно покажу как это можно реализовать.
Дальнейшее развитие идей PBR.
Надеюссь из этой заметки вы поняли насколько ограничен текущий PBR и что нужно не бояться его дорабатывать под себя.
Справедливости ради многие команды вполне себе уперлись в ограничения Disney PBR на основе которого были основаны первые подходы, к которым современные 3д художники так привыкли.
Так что в ходе исследований возможностей раздвинуть границы(многие из которых были указаны выше, а многие темы только обсуждаются) многие команды по разработки CG графики обнаружили, что они по сути пытаются решить одну и ту же задачу. Это выразилось в то, что довольно быстро все специалисты из совершенно разных команд начали общаться и делиться своими наработками в рамках "Open PBR" -который позиционируется как следующий шаг в достижении Реализма.
В частности - новая модель, хоть и предлагает возможность использования стандартных PBR текстур - делая переход на новый процесс менее болезненным, но и делает ставку на более "физический" подход к материалу учитывающий физическое моделирование разных слоев вещества:
И от учета точного IOR материалов, при расчете прохождения луча света - вплоть до учета структурной окраски и дифракции света. Вместо не точного коэффициента "металличности".
Например вопрос множественной слоистости - я касался вскольз, будем разбираться с ним в дальнейших заметках по системе Substrate в Unreal Engine 5.7+ где "Субстрат" стал заменой старым шейдерным моделям для расчетов.
Более подробную спецификацию Open PBR - которая активно дополняется, можно почитать тут:
Если вы технический инженер - и вам интересно поучаствовать в этом деле - можете поискать контакты и присоединится к команде безумцев которых не устраивают текущий пайплайн, и хотят двигать индустрию дальше...
Поговорим об "Атмосфере"
Одна из главных проблем PBR, что на результат замеров часто влияет окружающая среда, источники света и уровень излучения. И при этом так же всем эти параметры должны быть удобны для художников, то есть понятным образом влиять на поведение поверхности.
Говоря о влиянии окружающей среды - один из аспектов который отбрасывается почти полностью при моделировании, это учет того момента , что Эффект Френеля зависит не только от IOR материала , но и от IOR окружающей среды - а значит материалы и поверхности должны вести себя по разному в воздухе (IOR = 1.0003), в Воде (IOR= 1.333).
Для воздуха IOR Считается =1 и преобразование в коэффициент френеля простое:
Собственно поведение кривой будте таким:
А вот формула для преобразования в коэффциент Френеля из свойств материалов в общем случае.
Довольно просто не правда ли?
Используя чистый коэффициент Френеля - можно учитывать влияние атмосферы.
Многие создатели игр - часто забывают(не знал но забыл!) об этом - полезно будет контролировать итоговый параметр F0 материала окружающей среды через таблицы параметров IOR в движке - если нашей камере игрока доведется побывать например на разных планетах, жидкостях и под водой. Кажется это мелочь - но на самом деле она способна поменять восприятие игры кардинально!
Изменение IOR c 1 до 1.333 при погружении в воду способно изменить поведение отражений на диэлектриках (IOR = 1.5+_) влияет очень сильно, в отличие от металов.
Учтя этот момент - мы сможем показать игру реальное поведение света на других планетах! То чего не смог сделать Starfield ...
О каком еще аспекте PBR который отбраковывается?
Поговорим о "Пористости"
И зачем оно нужна?
Пористость - это свойство поверхности впитывать "влагу". Этот параметр нужно вводить в PBR если мы планируем делать эффекты погоды и дождя.
Влажные поверхности очень сильно отличаются от сухих!
Да - часть эффектов можно задать через слой "воды" на поверхности BRDF по модели Clear Coat, или многослойного BRDF как в OpenPBR. Но вода буквально впитывается в материал и меняет его свойства!
Любой материал можно определить как намокающий и Не намокающий. Все люди с глазами способны визуально отличить мокрую поверхность от сухой. Главное визуальное отличие, которое запоминают люди, заключается в том, что мокрые поверхности выглядят темнее, более блестящими и имеют едва заметные изменения в насыщенности и оттенке.
Например, металлы - почти не намокают, поэтому их можно просто отключить статическим переключателем. Как и сверх гладкие хорошо отшлифованные материалы, или покрытые лаком.
Например, есть большая разница между сухим необработанным камнем и влажным необработанным камнем, но очень маленькая разница между хорошо отполированным влажным камнем и хорошо отполированным сухим камнем.
Это происходит из за такого явления как "пористость"
С точки зрения визуала- поры обычно малозаметны и неотличимы от обычной микрогеометри шероховатости. Но они очень сильно начинают влиять когда их начинает заполняются жидкость с другими физическими свойствами.
Так свет попадая в каплю воды в порах быстро теряет энергию делая итоговые свойства поверхности более темным, но при этом потери энергии у разных частот спектра происходит неравномерно, от тот отраженный свет становится более "цветным" и "насыщенным"
Мокрый материал обычно отражает длинные «красные» волны больше, чем короткие «синие» волны.
Но увы тема поведения материала при намокани имеет не очень много научных работ и исследований.
В целом если собираетесь делать в своей игре погодные условия - можно учесть что все материалы могут быть разделены на несколько видов:
- Не намокающие
(Но по ним должна течь вода и капли!)
Металл и покрытые лаком материалы, а так же материалы с высокой степенью шлифовки. Так же живые ткани довольно сильно сопротивляются смачиванию. - Намокающие твердые материалы.
Это грубые камни, кора деревьев.
По ним должны стекать капли и должен менять цвет базового слоя. - Намокающие мягкие материалы
Капли воды по ним не стекают - но они хорошо впитывают влагу сильно меняя свой цвет. Это ткани и сыпучие материалы - такие как песок.
Но влажность и эффекты дождя это отдельная сложная тема которую стоит рассматривать отдельно. И добавление таких эффектов способно сделать погружение в вашу игру гораздо более глубоким.
Пока что в рамках этой заметки поделюсь графиком зависимости коэффициента влажного альбедо к сухому. И оно не линейно!
Еще раз проговорим что влажное альбедо является нелинейной функцией сухого альбедо: при увлажнении низкое альбедо снижается сильнее, чем более высокое. Следствием этого результата является то, что цвет влажной поверхности более насыщенный, чем цвет сухой поверхности, поскольку увлажнение ещё больше усиливает разницу в альбедо для разных длин волн.
При этом важно отметить, что при очень низком альбедо ( < 0,039) кривая поднимается выше 1,0 (не показано на графике). Это связано с тем, что альбедо воды (чистой воды — 0,02 при нормальном падении света, но наличие примесей в воде могут увеличить это значение) выше этих низких значений альбедо, что приводит к буквальному осветлению тёмной поверхности.
Увы в интернете есть лишь два крупных источника по данной теме и влиянию пор и влажности на PBR.
Это современная лекция Ubisoft с GDC про Тропическую погоду:
И древние лекции 2012-2014 про "дождливый материал" Sebastien Lagarde технического инженера внесшего свой вклад в разработку движков Фростбайт и Юнити.
На сегодня все - надеюсь вам этот мой хаотичный поток сознания возникший в ходе поглощения лекций и материалов с GDC и SIGGRAPH показался полезным. И поможет улучшить визуал ваших игры вместо банального использования 3х текстур без модификаций в движке через шейдерную модель по умолчанию. Что обычно приводит к проклятому UE-like дженерик виду.
Пользуйтесь - улучшайте и развивайте. Многие темы будут еще рассмотрены мной отдельно и подробно когда я буду писать материалы по конкретной реализации Substrate Unreal. Или нет. Как повезет. Так что подписывайтесь что бы не пропустить.