Поверхностное рассеивание в играх что это
Sub Surface Scattering
Теперь с введением radiosity (диффузного отражения) в множество популярных 3D пакетов, у нас появилась возможность получать более реалистичные изображения не тратя десятки тысяч долларов на программы (MAYA? хм. Простите). Так что такое radiosity? Это вычисление «отскоков» световых лучей испускаемых источниками света и самосветящимися моделями. Так вы говорите у вас есть стол на кухне и только один источник света над столом? Без radiosity, всё что что будет освещено этим источником света так это верх стола и пол. С radiosity свет отражается от пола и освещает (частично) низ стола также как и его ножки и всё вокруг. Посмотрите на рисунок 1 для примера.
Sub surface scattering (под-поверхностное рассеивание) это ответвление radiosity, но в отличии от него учитывает информацию о материале из которого «сделана» 3D модель (например, из мрамора, древесины, кожи и т.д). Различные материалы отражают свет по разному. Если вы смотрите на лист в солнечный день и поставите под него руку то увидите сквозь лист её очертания. Этот эффект называется полупрозрачностью, в отличии от прозрачности при которой вещи видны насквозь полностью. Полупрозрачность иллюстрируется на таких материалах как кожа, молоко, листья, кусочек бумаги, на тонкой занавеске и др.
Теперь, с типичным рендерером свет влияет материалы в общем то тем же самым способом. У Вас, вероятно, есть средство управления зеркальностью и диффузией, но это не то. Это означает, что прожектор на 3D руку будет влиять так же как и, например, на деревянную 3D доску (так как значения зеркального и диффузного отражения одинаковы). Sub surface scattering принимает во внимание полупрозрачность материала и (используя radiosity) отражает назад нужные световые лучи в правильном направлении.
Так, а что же такое BSSRDF? Расшифровывается как Bidirectional Surface Scattering Distribution Function (Двунаправленная Функция Поверхностного Рассеивания и Распределения). Эта функция это намного более аккуратный способ описания путей входа и выхода света из материала. BSSRDF может описать перемещение света между любыми двумя лучами которые попадают на поверхность, тогда как BRDF предполагает что свет входит и выходит из материала в одной и той же точке. Подумайте вот об этом: Сделаем вид что мы сходим в дом BSSRDF и поплаваем его фантастическом, размером с Олимпийский, бассейне. Так как мы находимся в сфере влияния BSSRDF, мы можем нырнуть поглубже, затем поплавать вокруг и в конце концов вылезти на мелководье. С другой стороны, если мы находимся в бассейне BRDF, то, если мы прыгнули в воду с вышки, то и выходить из воды должны тоже через вышку. Звучит глупо, да? Хорошо, в этом приложении это так. Но в компьютерном графическом рендеринге различия между BSSRDF и BRDF могут быть как большими так и малыми. Если мы, например, рендерим машину, то различия могут быть незначительны. Но когда мы рендерим что-то содержащее полупрозрачность (например кожу, молоко, листья, ткань и др.) то результат будет совершенно неверным. Конечно, вы можете включить radiosity, мягкие тени и прочее, но результат всё равно будет неверным.
Так что же такое «sub surface scattering»? Это эффект когда свет входит в материал под определенным углом, а покидает в совершенно ином месте и под иным углом. Всё просто, неправда ли? Но принимая во внимание все то, что мы узнали к этому времени, легко заметить почему настолько желательно достигнуть точности в выражении. Уже проделана огромная работа (Паулем Дебевеком, Университетами Cornell, Brown и Stanford и другими) для восстановления точного уравнения.
Хорошо, ели вы добрались так далеко, то, надеюсь, вы уже лучше понимаете что такое под-поверхностное рассеивание и как оно влияет на рендеринг. Я ни в коем случае не эксперт по этому предмету. Я только думал, что смогу помочь другим понять это явление, как его понимаю я.. Пожалуйста не стесняйтесь посылать мне электронную почту с исправлениями или вопросами.
Поверхностное рассеивание в играх что это
Думаю, с понятием разрешения знакомы уже более-менее все игроки, но на всякий случай вспомним основы. Все же, пожалуй, главный параметр графики в играх.
Изображение, которое вы видите на экране, состоит из пикселей. Разрешение — это количество пикселей в строке, где первое число — их количество по горизонтали, второе — по вертикали. В Full HD эти числа — 1920 и 1080 соответственно. Чем выше разрешение, тем из большего количества пикселей состоит изображение, а значит, тем оно четче и детализированнее.
Влияние на производительность
Очень большое.Увеличение разрешения существенно снижает производительность. Именно поэтому, например, даже топовая RTX 2080 TI неспособна выдать 60 кадров в 4K в некоторых играх, хотя в том же Full HD счетчик с запасом переваливает за 100. Снижение разрешения — один из главных способов поднять FPS. Правда, и картинка станет ощутимо хуже.
В некоторых играх (например, в Titanfall) есть параметр так называемого динамического разрешения. Если включить его, то игра будет в реальном времени автоматически менять разрешение, чтобы добиться заданной вами частоты кадров.
Вертикальная синхронизация
Если частота кадров в игре существенно превосходит частоту развертки монитора, на экране могут появляться так называемые разрывы изображения. Возникают они потому, что видеокарта отправляет на монитор больше кадров, чем тот может показать за единицу времени, а потому картинка рендерится словно «кусками».
Вертикальная синхронизация исправляет эту проблему. Это синхронизация частоты кадров игры с частотой развертки монитора. То если максимум вашего монитора — 60 герц, игра не будет работать с частотой выше 60 кадров в секунду и так далее.
Есть и еще одно полезное свойство этой опции — она помогает снизить нагрузку на «железо» — вместо 200 потенциальных кадров ваша видеокарта будет отрисовывать всего 60, а значит, загружаться не на полную и греться гораздо меньше.
Впрочем, есть у Vsync и недостатки. Главная — очень заметный «инпут-лаг», задержка между вашими командами (например, движениями мыши) и их отображением в игре.
Поэтому играть со включенной вертикальной синхронизацией в мультипеере противопоказано. Кроме того, если ваш компьютер «тянет» игру при частоте ниже, чем заветные 60 FPS, Vsync может автоматически «лочиться» уже на 30 FPS, что приведет к неслабым таким лагам.
Лучший способ бороться с разрывами изображения на сегодняшний день — купить монитор с поддержкой G-Sync или FreeSync и соответствующую видеокарту Nvidia или AMD. Ни разрывов, ни инпут-лага.
Влияние на производительность
В общем и целом — никакого.
Сглаживание(Anti-aliasing)
Если нарисовать из квадратных по своей природе пикселей ровную линию, она получится не гладкой, а с так называемыми «лесенками». Особенно эти лесенки заметны при низких разрешениях. Чтобы устранить этот неприятный дефект и сделать изображения более четким и гладким, и нужно сглаживание.
Здесь и далее — слева изображение с отключенной графической опцией (или установленной на низком значении), справа — с включенной (или установленной на максимальном значении).
Технологий сглаживания несколько, вот основные:
Влияние на производительность
От ничтожного (FXAA) до колоссального (SSAA). В среднем — умеренное.
Качество текстур
Один из самых важных параметров в настройках игры. Поверхности всех предметов во всех современных трехмерных играх покрыты текстурами, а потому чем выше их качество и разрешение — тем четче, реалистичнее картинка. Даже самая красивая игра с ультра-низкими текстурами превратится в фестиваль мыловарения.
Влияние на производительность
Если в видеокарте достаточно видеопамяти, то практически никакого. Если же ее не хватает, вы получите ощутимые фризы и тормоза. 4 гигабайт VRAM хватает для подавляющего числа современных игр, но лучше бы в вашей следующей видеокарте памяти было 8 или хотя бы 6 гигабайт.
Анизотропная фильтрация
Анизотропная фильтрация, или фильтрация текстур, добавляет поверхностям, на которые вы смотрите под углом, четкости. Особенно ее эффективность заметна на удаленных от игрока текстурах земли или стен.
Чем выше степень фильтрации, чем четче будут поверхности в отдалении.
Этот параметр влияет на общее качество картинки довольно сильно, но систему при этом практически не нагружает, так что в графе «фильтрация текстур» советуем всегда выставлять 8x или 16x. Билинейная и трилинейная фильтрации уступают анизотропной, а потому особенного смысла в них уже нет.
Влияние на производительность
Тесселяция
Технология, буквально преображающая поверхности в игре, делающая их выпуклыми, рельефными, натуралистичными. В общем, тесселяция позволяет отрисовывать гораздо более геометрически сложные объекты. Просто посмотрите на скриншоты.
Влияние на производительность
Зависит от игры, от того, как именно движок применяет ее к объектам. Чаще всего — среднее.
Качество теней
Все просто: чем выше этот параметр, тем четче и подробнее тени, отбрасываемые объектами. Добавить тут нечего. Иногда в играх также встречается параметр «Дальность прорисовки теней» (а иногда он «вшит» в общие настройки). Тут все тоже понятно: выше дальность — больше теней вдалеке.
Влияние на производительность
Зависит от игры. Чаще всего разница между низкими и средними настройками не столь велика, а вот ультра-тени способны по полной загрузить ваш ПК, поскольку в этом случае количество объектов, отбрасывающих реалистичные тени, серьезно вырастает.
Глобальное затенение (Ambient Occlusion)
Один из самых важных параметров, влияющий на картинку разительным образом. Если вкратце, то AO помогает имитировать поведения света в трехмерном мире — а именно, затенять места, куда не должны попадать лучи: углы комнат, щели между предметами и стенами, корни деревьев и так далее.
Существует два основных вида глобального затенения:
SSAO (Screen space ambient occlusion). Впервые появилось в Crysis — потому тот и выглядел для своего времени совершенно фантастически. Затеняются пиксели, заблокированные от источников света.
HBAO (Horizon ambient occlusion). Работает по тому же принципу, просто количество затененных объектов и зон гораздо больше, чем при SSAO.
Влияние на производительность
Глубина резкости (Depth of Field)
То самое «боке», которое пытаются симулировать камеры большинства современных объектов. В каком-то смысле это имитация особенностей человеческого зрения: объект, на который мы смотрим, находится в идеальном фокусе, а объекты на фоне — размыты. Чаще всего глубину резкости сейчас используют в шутерах: обратите внимание, что когда вы целитесь через мушку, руки персонажа и часть ствола чаще всего размыты.
Впрочем, иногда DoF только мешает — складывается впечатление, что у героя близорукость.
Влияние на производительность
Целиком и полностью зависит от игры. От ничтожного до довольно сильного (как, например, в Destiny 2).
Bloom (Свечение)
Этот параметр отвечает за интенсивность источников света в игре. Например, с включенным Bloom, свет, пробивающийся из окна в помещение, будет выглядеть куда ярче. А солнце создавать натуральные «засветы». Правда, некоторые игры выглядят куда реалистичнее без свечения — тут нужно проверять самому.
Влияние на производительность
Чаще всего — низкое.
Motion Blur (Размытие в движении)
Motion Blur помогает передать динамику при перемещениях объекта. Работает он просто: когда вы быстро двигаете камерой, изображение начинает «плыть». При этом главный объект (например, руки персонажа с оружием) остается четким.
Какие настройки графики всегда лучше отключать
Эти настройки производительности имеют совсем небольшое визуальное воздействие.
Все мы любим выставлять настройки графики на максимум. Но не все они имеют положительный эффект. Даже с элитным аппаратным обеспечением, есть некоторые графические параметры, которые дают небольшое визуальное различие, но имеют значительное влияние на частоту кадров. А если вы ещё и играете на старом ПК, то это именно те настройки, которые вам нужно отключать, чтобы повысить частоту кадров и в тоже время не сделать графику ужасной.
Графические опции и их соответствующее воздействие также могут значительно варьироваться от игры к игре, поэтому для наилучшей производительности нужно пересмотреть специфические руководства по оптимизации. Другими словами, эти параметры «выжимают максимум» в соотношении «железо – производительность».
На удивление эффект тени усиливает производительность графики, однако немножко затемнённые края не достаточно сильно влияют на ваше общее качество изображения. Не выключайте их, но если вы боретесь за частоту кадров – их определенно лучше поставить на низкий или средний уровень.
Размытие в движении
Размытие в движении иногда используется для хорошего эффекта, например, в гоночных играх, но по большей части этот параметр отбирает вашу производительность в обмен на то, что большинство геймеров обычно не любят. Размытость в движении особенно нужно избегать в играх с быстром темпом, например, в шутерах от первого лица.
Глубина резкости
Глубина резкости в играх, как правило, относится к эффекту размытия вещей на заднем плане. Точно так же как и размытие в движении, этот параметр отвлекает наши глаза и создает качество, как у фильмах – это не всегда отлично смотрится. К тому же эта настройка может повлиять на производительность, особенно, если она неправильно использована. Её нужно настраивать, отталкиваясь от личных предпочтений и от того, в какую игру вы играете.
Динамическое отражение
Эта настройка во многом зависит от игры, в которую вы играете, а также от того, что для вас важно с точки зрения качества изображения. Динамические отражения являются параметрами, влияющими на отображения игроков и других движущихся объектов в лужах и на блестящих поверхностях. Это чрезвычайно усиливает производительность графики. Тем не менее, динамические отражения не всегда замечаются, а отключив их, вы увеличите ваши кадры в секунду от 30 до 50%.
Избыточная выборка сглаживания (суперсемплинг, SSAA)
С включённым суперсемплингом, игра делает кадры с более высоким разрешением, нежели разрешение самого экрана, а затем сжимает их обратно до размера дисплея. Это может улучшить вид игр, но если ваш ПК не является особым монстром (как наш любимый Large Pixel Collider), SSAA разрушит вашу производительность. В большинстве случаев, она не стоит того, чтобы её применяли, особенно, когда существует столько альтернатив суперсемплингу
Поверхностное рассеивание в играх что это
Разработка видеоигр и всё, что с этим связано. Концепции, иллюстрации, 3D-моделирование, программирование и многое другое геймдев-направленности.
— Уважайте чужой труд и используйте конструктивную критику
— Не занимайтесь саморекламой, пишите качественные и интересные посты
— Не употребляйте мат без необходимости
— Посты о Вашей игре с историей её разработки и описанием полученного опыта
— Обучающие материалы, туториалы
— Интервью с опытными разработчиками
— Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
— Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
— Только гифки/арты/скриншоты из игры. Такие материалы могут сопровождать рассказ об игре или обучающий туториал, но не должны являться основой поста
— Посты, содержащие только идею игры
— Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
— Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
— Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
— Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
— Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
— Cсылка размещается в формате: «Страница игры в Steam: URL»
Управление сообществом
Комментарий дня
Мы так с соседом сделали денди мультиплеер. Когда я просёк что сигнал на приставке соседа снизу ловится на мой телевизор (причем в цвете и со звуком). То сначала это просто был для меня этакий twitch я смотрел как сосед играет в игры и тихо завидовал. Родители приставку мне не покупали, а поиграть хотелось. В какой-то момент мне пришло в голову что видео и звук уже в телевизоре, нужно только передать управление с джойстика и можно играть вдвоём. (Почему-то очевидная идея просто собраться у него и поиграть мне в голову не пришла, родители соседа были достаточно строгие и частых гостей не привечали. Я предложил офигительную идею разрезать провод джойстика, удлиннить его и провести этот кабель в квартиру через форточку. Соседу идея показалась интересной, но он не соглашался резать собственный джойстик так как сильно сомневался, что что-нибудь из этой ерунды получится. В итогде был найден и куплен (на все мои сбережения) джойстик, который подходил к разъему соседа. В роли удленнителя выступил 6 жильный телефонный кабель. Нужно было понимать, что ни малейшей идеи о распиновки у меня в 7 лет не было, грубо говоря отрезать, спаять жилы заизолировать синей изолентой и надеяться что сработает. Но вы не представляете этот восторг когда я притащил бухту кабеля с джойстиком на одном конце и коннектором на другом. Подключил к разъему приставки и оно заработало, можно было играть вдвоём. Отдельная эпопея как мы протягивали кабель, к счастью кабель был тонкий и проходил в щель от форточки. Из остатков кабеля так же были сделаны удлиннители для телефона (телефоны были проводные). Так в 1993-1994 году у нас был не только мультиплеер, но и голосовой чат каждый день часа по 2-3 после школы но до прихода родителей. Так продолжалось около полугода, мы приходили домой после школы и резались в Черепашек Ниндзя вторых и третьих, Double Dragon в Контру и Танчики. Родители со временем просекли, что именно мы построили и с удивлением отнеслись с пониманием, просили играть поменьше и после уроков, но убирать конструкцию не заставили. Были и мелкие конфликты, связанные с тем, что у меня кнопки Start и Select не было а у друга были, так что контроль над игрой у меня был значительно меньший чем у него. Например другу могло надоесть играть в контру и он специально умирал а потом нажимал end вместо continue. В принципе завершение игры тоже было на соседе и тут я ничего поделать не мог. Закончилось всё внезапно, сосед с родителями переехал, а в той квартире поселился хмурый подросток лет 17 которому приставки были не интересны. Родители мне потом всё-таки купили Сегу уже и история с супе-удлиннителем джойстика забылась. Странно, больше 30 лет прошло, лица того парня уже не вспомнить, даже имени полного Артем его звали, кажется. Где он что с ним? Зато память сохранила запах канифоли, синей изоленты, обожённый палец при пайке (паял я увлечённо, но довольно плохо) и восторг игры без приставки, но с приставкой. Наш голосовой чат через телефон. Следующий раз я поиграл в мультиплеер в только 1997 году, это был компьютерный клуб и игра Command and Conquer.
Рекомендуемое сообщество
Сообщество для поклонников восточных кинорежиссеров и всех любителей азиатского кино. Здесь будут: проверенные временем классические фильмы и новости кино, биографии звезд и раритетные видеоролики, в общем, все самое интересное из мира азиатского кино. Подписчики других сообществ о кино не особо знают и приветствуют кино Азии, а здесь будут собираться единомышленники. Кому интересна эта тема, могут тоже публиковать посты.
Быстрый шейдер для Subsurface Scattering в Unity
Большинство (если не все) оптических явлений, демонстрируемых материалами, можно воссоздать симуляцией распространения и взаимодействия отдельных лучей света. Такой подход называется в научной литературе «трассировкой лучей» (ray tracing), и часто он слишком вычислительно затратен для применения в реальном времени. В большинстве современных движков используются сильные упрощения, которые, несмотря на невозможность создания фотореализма, могут обеспечить достаточно убедительные приближенные результаты. В этом туториале я расскажу о быстром, дешёвом и убедительном решении, которое можно использовать для симуляции просвечивающих материалов, имеющих подповерхностное рассеивание.
До.
… и после.
Введение
У стандартного материала Unity есть режим прозрачности (Transparency mode), позволяющий рендерить прозрачные материалы. В этом контексте прозрачность реализуется с помощью альфа-смешивания. Прозрачный объект рендерится поверх готовой геометрии, частично показывая то, что находится за ним. Это работает для многих материалов, но прозначность — это особый случай более общего свойства, называемого просвечиваемостью (translucency) (иногда также translucidity). Прозрачные материалы влияют только на количество пропускаемого через них света (на рисунке ниже слева), просвечиваемые же изменяют путь его прохождения (справа).
Результат такого поведения очевиден: просвечиваемые материалы рассеивают проходящие через них лучи света, размывая то, что находится за объектом. Такое поведение редко используется в играх, потому что реализовать его гораздо сложнее. Прозрачные материалы можно реализовать прямолинейно — альфа-смешиванием, без трассировки лучей. Просвечивающие же материалы требуют симуляции отклонения лучей света. Такие вычисления очень затратны и редко стоят труда при рендеринге в реальном времени.
Это же часто мешает достичь симуляции других оптических явлений, таких как подповерхностное рассеивание. Когда свет падает на поверхность просвечиваемого материала, часть его распространяется внутрь, сталкиваясь с молекулами, пока не найдёт путь наружу. Часто это приводит к тому, что свет, поглощённый в одной точке, испускается материалом в другой точке. Подповерхностное рассеивание приводит к созданию рассеянного свечения, которое часто можно увидеть на таких материалах, как кожа человека, мрамор и молоко.
Просвечиваемость в реальном времени
Затратными вычисления просвечиваемости делают два основных препятствия. Первое — требуется симуляция рассеивания лучей света внутри материала. Каждый луч может разделиться на несколько, отражаясь сотни или даже тысячи раз внутри материала. Второе препятствие — луч, поглощённый в одной точке, испускается в какой-то другой. Это кажется небольшой проблемой, но на самом деле это серьёзное препятствие.
Чтобы понять, почему так происходит, нам нужно сначала разобраться, как работает большинство шейдеров. В сфере рендеринга в реальном времени видеопроцессор ожидает от шейдера, что тот сможет вычислить конечный цвет материала, используя только локальные свойства. Шейдеры реализованы таким образом, что эффективно могут получать доступ только к свойствам, локальным для каждой вершины. Можно очень легко считать направление нормали и albedo вершины, получить же эти значения от соседних вершин — непростая задача. В большинстве систем реального времени приходится как-то обходить эти ограничения и находить способ имитировать распространение света в материале без использования нелокальной информации.
Подход, описанный в этом туториале, основан на решении, представленном на GDC 2011 Колином Баррэ-Бризебуа и Марком Бушаром в докладе Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look. Их решение интегрировано в движок Frostbite 2, который использовался в игре Battlefield 3 компании DICE. Хотя подход, представленный Колином и Марком, физически неточен, он обеспечивает правдоподобные результаты очень малой ценой.
Идея в основе этого решения очень проста. На непрозрачные материалы свет воздействует непосредственно от источника света. Вершины, наклонённые больше чем на 90 градусов от направления света , вообще не получают освещения (на рисунке внизу слева). В соответствии с моделью, представленной в докладе, на просвечиваемые материалы существует дополнительное воздействие света, которое связано с
. Геометрически
можно воспринимать так, как будто часть освещения на самом деле проходит сквозь материал и добирается до его обратной стороны (на рисунке внизу справа).
То есть каждый источник света считается как два отдельных влияния на отражение: освещение передней и задней части. Мы хотим, чтобы наши материалы были как можно более реалистичными, поэтому для переднего освещения используем стандартные PBR-модели освещения Unity. Нам требуется найти способ описать воздействие и отрендерить его таким образом, чтобы он как-то симулировал процесс рассеивания, который бы мог происходит внутри материала.
Обратная просвечиваемость
Как сказано выше, конечный цвет пикселей зависит от суммы двух компонентов. Первый из них — это «традиционное» освещение. Второй — влияние света от виртуального источника, освещающего обратную сторону модели. Это даст нам ощущение, что свет от исходного источника на самом деле прошёл сквозь материал.
Чтобы понять, как смоделировать это математически, давайте создадим схему двух следующих случаев (схемы ниже). В текущий момент мы отрисовываем красную точку. Поскольку она находится на «тёмной» стороне материала, её должен освещать . Давайте проанализируем два предельных случая с точки зрения стороннего наблюдателя. Мы видим, что
находится на одной линии с
и параллелен ему, и это значит, что наблюдатель
должен полностью увидеть обратную просвечиваемость. С другой стороны, наблюдатель
должен увидеть наименьшее количество обратного освещения, потому что он перпендикулярен к
.
Если вы знакомы с написанием шейдеров, то такие рассуждения должны быть вам привычны. Мы уже встречались с чем-то подобным в туториале «Physically Based Rendering and Lighting Models in Unity 5», где показали, что такое поведение можно реализовать с помощью математического оператора, называемого скалярным произведением.
В качестве первого приближения мы можем сказать, что количество обратного освещения, возникающего из-за просвечиваемости, пропорционально
. В традиционном диффузном шейдере это записывается как
. Мы видим, что не включили в вычисления нормаль к поверхности, потому что свет просто исходит из материала, а не отражается от него.
Подповерхностное искажение
Однако нормаль к поверхности должна иметь какое-то влияние, хотя бы небольшое, на угол, под которым свет исходит из материала. Авторы этой техники ввели параметр под названием подповерхностное искажение , вынуждающий вектор
указывать в направлении
. С точки зрения физики это подподверхностное искажение управляет степенью отклонения нормалью к поверхности исходящего обратного освещения. В соответствии с предложенной системой, интенсивность компонента обратной просвечиваемости превращается в:
При мы возвращаемся к
, полученному в предыдущем разделе. Однако при
мы вычисляем скалярное произведение между направлением взгляда и
. Если вам известен расчёт отражения по Блинну-Фонгу, то вы должны знать, что
— это вектор «между»
и
. Поэтому мы будем называть его половинным направлением
.
На схеме выше показаны все направления, которые мы пока использовали. отмечена фиолетовым, и вы видите, что она находится между
и
. С точки зрения геометрии, изменение
от
до
приводит к сдвигу воспринимаемого направления света
. Затенённая область показывает интервал направлений, из которых будет поступать обратное освещение. На рисунке ниже видно, что при
объект кажется освещённым от фиолетового источника света. При изменении
к 1 воспринимаемое направление источника света сдвигается к фиолетовому.
Предназначение — симуляция склонности некоторых просвечиваемых материалов рассеивать обратное освещение с разной интенсивностью. Чем выше значения
, тем больше рассеивается обратное освещение.
Да. Значения от
до
линейно интерполируются между
и
. Это можно увидеть, развернув традиционное определение линейной интерполяции от
и
с
:
С геометрической точки зрения, величина не имеет единичной длины, то есть должна быть нормализована. В своей конечной системе авторы не выполняют нормализацию.
В конце концов, весь этот эффект не должен стать ни фотореалистичным, ни основанным на физике. В своём докладе авторы очень ясно дали понять, что он предназначен для использования в качестве быстрой аппроксимации просвечиваемости и подповерхностного рассеивания. Нормализация не сильно меняет результаты, но добавляет значительные задержки.
Рассеивание обратного освещения
На этом этапе туториала у нас уже есть уравнение, которое можно использовать для симуляции просвечивающих материалов. Величину невозможно использовать для вычисления окончательного влияния освещения.
Здесь можно использовать два основных подхода. Первый — применить текстуру. Если вам нужен полный художественный контроль над тем, как свет рассеивается в материале, то нужно ограничить в интервале от
до
и использовать её для сэмплирования конечной интенсивности обратного освещения. Текстуры с различным линейным изменением будут симулировать распространение света в разных материалах. Ниже мы рассмотрим, как это можно использовать для значительного изменения результатов работы этого шейдера.
Однако в подходе, использованном автором этой техники, не применяется текстура. В нём кривая создаётся только кодом Cg:
Два новых параметра, (степень) и
(масштаб) используются для изменения свойств кривой.
Заключение
В этой части статьи мы рассказали о технических трудностях рендеринга просвечиваемых материалов. Предложено аппроксимирующее решение и подход, представленный в докладе Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look. В следующей части туториала мы сосредоточимся на самой реализации этого эффекта в шейдере Unity.
Если вам интересны более изощрённые подходы к симулированию подпространственного рассеивания в приложениях реального времени, то можете изучить один из лучших туториалов GPU Gems.
Часть вторая
Введение
В предыдущей части туториала объяснён механизм, позволяющий аппроксимировать внешний вид просвечивающих материалов. Затенение традиционных поверхностей выполняется на основании освещения, получаемого со стороны . Шейдер, который мы напишем, добавит ещё один компонент
, который де-факто будет использоваться так, как будто материал освещается источником света с обратной стороны. При этом он будет выглядет так, как будто свет из
проходит сквозь материал.
Наконец, мы вывели зависящее от направления взгляда уравнение для моделирования отражения от обратного освещения:
И, наконец, и
(степень и масштаб) определяют распространение обратного освещения и работают образом, схожим с одноимёнными параметрами в расчёте отражения по Блинну-Фонгу.
Теперь нам только осталось реализовать шейдер.
Расширяем возможности стандартного шейдера
Как рассказано выше, мы хотим, чтобы этот эффект был как можно более реалистичным. Наилучшим решением будет расширение функций стандартного шейдера (Standard shader) Unity, который изначально обеспечивает достаточно хорошие результаты для непросвечиваемых материалов.
Если вам незнакома эта процедура, тема расширения функциональности стандартного шейдера подробно рассмотрена в моём блоге. Два неплохих туториала для начала: 3D Printer Shader Effect (перевод на Хабре) и CD-ROM Shader: Diffraction Grating.
Если коротко, то основная идея заключается в создании нового поверхностного шейдера и замене его функции освещения на собственную. Здесь мы будем вызывать исходную стандартную функцию освещения, чтобы материал рендерился с помощью PBR-шейдера Unity.
Создав его, мы сможем вычислять влияние обратного освещения и смешивать его с исходным цветом, предоставляемым стандартной функцией освещения. Для хорошей аппроксимации:
Можно начать со следующего:
Если в используемой вами камере используется поддержка HDR (high-dynamic range, расширенного динамического диапазона), то значения выше применяются для таких эффектов постобработки, как bloom. В этом шейдере мы не выполняем насыщение (saturate) конечного цвета, потому что фильтр bloom будет применён при окончательном рендеринге.
Обратное освещение
В соответствии с уравнениями, описанными в первой части туториала, мы можем написать следующий код:
Вышеприведённый код является прямой реализацией уравнений из первой части статьи. Получаемый эффект просвечиваемости выглядит вполне правдоподобно, но он никак не связан с толщиной материала. Поэтому управлять им очень сложно.
Локальная толщина
Очевидно, что количество обратного освещения сильно зависит от плотности и толщины материала. В идеале нам нужно знать расстояние, пройденное светом внутри материала, и соответствующим образом его ослабить. Как видно из рисунка ниже, три разных луча с одинаковым углом падения проходят очень разные расстояния внутри материала.
С точки зрения шейдера, мы не имеем доступа ни к локальной геометрии, ни к истории лучей света. К сожалению, нет никакой возможности решить эту проблему локально. Лучше всего будет использовать внешнюю карту локальных толщин. Это текстура, связанная с поверхностью, определяющая «толщину» соответствующей части материала. Понятие «толщины» используется произвольно, потому что настоящая толщина зависит от угла, под которым падает свет.
На схеме выше показано, что нет уникального понятия «толщины», связанной с красной точкой круга. Количество материала, сквозь которое проходит свет, на самом деле зависит от угла падения света . То есть нам нужно помнить, что весь этот подход к реализации просвечиваемости стремится не к физической точности, а к тому, чтобы обмануть глаз игрока. Ниже (источник) показана хорошая карта локальных толщин, визуализированная на модели статуи. Оттенки белого соответствуют частям, в которых эффект просвечиваемости будет сильнее, аппроксимируя понятие толщины.
Автор этой техники предложил интересный способ автоматического создания карты локальных толщин из любой модели. Для этого нужно выполнить следующие шаги:
Вместо текстуры толщину можно хранить непосредственно в вершинах.
Окончательная версия
Теперь мы знаем, что нужно учитывать локальную толщину материала. Проще всего для этого создать текстурную карту, которую можно сэмплировать. Хоть это и физически неточно, мы получим убедительные результаты. К тому же локальная толщина кодируется таким образом, что позволяет художникам полностью контролировать эффект.
В этой реализации локальная толщина хранится в красном канале дополнительной текстуры, сэмплируемой в функции surf:
Колин и Марк предложили немного другое уравнение для вычисления конечной интенсивности обратного освещения. В нём учитываются и толщина, и дополнительный параметр затухания. Кроме того, они допустили возможность использования постоянно присутствующего дополнительного компонента среды:
Вот каким получается конечный результат:
Заключение
Описанный в статье подход основан на решении, представленном на GDC 2011 Колином Баррэ-Бризебуа и Марком Бушаром в докладе Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look.
Все необходимые для запуска проекта файлы (шейдер, текстуры, модели, сцены) можно скачать с моей страницы на Patreon [прим. пер.: за 10 долларов].