что такое подповерхностное рассеивание в играх
Моделирование подповерхностного рассеивания
В этой статье речь пойдёт о быстром fake-методе реализации подповерхностного рассеивания (subsurface scattering) полупрозрачных материалов.
Подповерхностное рассеивание (subsurface scattering, SSS) — это механизм переноса энергии (света), при котором свет, проникая через поверхность полупрозрачного материала, рассеивается внутри самого материала и выходит из материала в другой точке. Рассеивание происходит путем многократного отражения в случайном направлении от частиц материала.
Подповерхностное рассеивание необходимо использовать для правильной отрисовки таких материалов как мрамор, нефрит, воск (парафин), кожа, и пр.
Существует несколько методов реализации подповерхностного рассеивания, но мы остановимся на так называемом fake-методе, который позволит быстро и без существенных затрат смоделировать подповерхностное рассеивание. Итак, начнем!
Для моделирования подповерхностного рассеивания нам придется совсем на немного изменить обычную отрисовку объектов.
Итак, допустим, что у нас уже есть некоторый алгоритм отрисовки объектов. Пусть он использует стандартную модель освещения (модель Ламберта) и некоторую модель вычисления отраженного света (Фонг, Блинн, Кук-Торренс – роли практически не играет). Также может быть алгоритм затенения объектов (карты теней, ambient occlusion). Пускай параметры источника света задаются у нас через колонки некоторой матрицы. В первой колонке – фоновое освещение (ambient), во второй – рассеянное (diffuse), в третьей отраженное (specular). Допустим также, что мы уже вычислили затенение объекта и модель освещения. В общем и целом результирующий цвет будет вычисляться так:
Значит, стандартная отрисовка у нас есть. Выглядеть это будет примерно так:
Мы видим зайца, сделанного из какого-то камня (или покрытого лаком). Давайте начнем делать его нефритовым :).
Для начала нам нужно смягчить тени, поскольку подповерхностное рассеивание подразумевает тот факт, что свет проходит сквозь материал и выходит из него в произвольной точки под произвольным углом. Таким образом освещенность объекта увеличивается. Для моделирования этого эффекта проведем следующие операции:
1) введем новый параметр для осветленной тени на поверхности (старое значение нам все еще нужно для затенения отраженного света):
2) если есть ambient occlusion – то осветлим и его:
3) теперь главное. У нас в vLighting.x храниться угол между источником света и нормалью в данной точке. Сделаем освещение менее зависимым от угла падения света:
Таким образом, вычисление результирующего цвета фрагмента перепишем в таком виде:
Результатом проделанной операции будет вот такое изображение:
Уже ближе? Наверно…, но продолжим.
Теперь будем моделировать зависимость освещенности от расстояния до источника. Чем ближе к источнику света – тем сильнее освещена поверхность и сам материал («подповерхность» :)).
Для начала вычислим расстояние от источника света до текущей точки:
Так как у меня расстояние до источника света большое – то мне приходиться вычитать из реального расстояния большую величину. В общем, это можно сделать так: передавать в шейдер радиус сферы, охватывающей всю модель и вычитать из расстояния до источника света значение (расстояние – радиус) – т.е как бы помещать источник света на границу сферы, охватывающей модель. Расстояние мы вычислили, теперь можно вычислять непосредственно рассеивание:
Коэффициенты, наверно, придется подбирать каждому свои, чтобы добиться примерно вот такой картинки:
Добавим учет рассеивания в финальную часть шейдера вот таким образом:
И получим вот такую картинку:
В общем и целом, наш нефритовый заяц готов. Но есть еще один момент.
Если смотреть через полупрозрачные материалы непосредственно на источник света – то материал становиться светлее. Давайте промоделируем и этот эффект. При взгляде сквозь нашего зайца на источник света без этого эффекта мы будем наблюдать такую картину:
Наш заяц совсем не пропускает свет. Давайте пропустим 🙂
Для этого нам всего лишь нужно найти скалярное произведение между двумя векторами, проходящими через текущую точку, положением камеры и положением источника света.
Мы получим примрно вот такую картинку:
Давайте теперь просто добавим вычисленное значение к уже имеющемуся у нас параметру:
Финальное вычисление мы не изменяем, но теперь наш заяц пропускает свет:
Таким образом финальный шейдер (вернее его дополнение) будет таким:
Теперь у нас получился довольно симпатичный нефритовый заяц.
Напомню вам, что приведенный выше алгоритм – это fake. Если вам необходимо делать честное подповерхностное рассеивание – читайте дополнительную литературу 🙂
Спасибо тем, кто дочитал статью до конца. Удачи вам!
Разбор графики S.T.A.L.K.E.R. 2: посредственные эффекты, отсутствие анимаций и перебор с отражениями
реклама
Профессиональный художник по спецэффектам в кино (FX Artist) покадрово разобрал видео трейлера и подметил неудачные моменты.
Начинается всё с разговоров у костра, где мы сразу замечаем проблемы с огнем. Неужели разработчикам так трудно было заглянуть в Google и посмотреть как выглядит огонь? Во-первых, он желтый, а в реальной жизни у огня оранжевая палитра. Во-вторых, горят всего три деревяшки, но пламя фигачит натурально как в крематории, при этом сама скорость горения слишком низкая, ненатуральная.
реклама
Идем далее и переносимся на заброшенный склад, где мы видим стену, покрытую лаком:
реклама
реклама
Оружие буквально примагнитилось к руке
Выглядит очень кондово для топ-шутера 2022. Тем временем, еще 3 года назад в RDR 2 сделали потрясные анимации, а уж в экшене от первого лица они должны быть однозначно.
Далее лысый начинает доставать нас своей бессмысленной речью. Делает он это так долго, что в процессе даже вырастают волосы:
Потом показывают руку главного героя, подсвеченную с помощью технологии SSS. Если по-русски, то это подповерхностное рассеивание (SubSurface Scattering). Оно бывает заметно только при ярком источнике света, например на солнце, как на левом фото:
Очень сомневаюсь, что у костра такая большая яркость
Затем мы смотрим на человека в шапке, который, пританцовывая, буквально парит над провалившейся текстурой доски. Уж в трейлере-то могли такие косяки замазать. Стыдновато.
Нам показывают лабораторию, где живет монстр. Последний появляется в кадре с плоской мутной PNG-текстуры, которую очень хорошо видно на паузе:
Происходит флешбек с крыши, где с нами болтает брат Паттисона с роскошной шевелюрой. Волосы получились отлично, а лицо выглядит натурально, но лишние отражения видны и в этой сцене:
Где бы Паттисон ни находился, звук голоса слышно одинаково, даже если он говорит в противоположную сторону! Впрочем, то, что озвучка сделана очень плохо, мы подмечали еще в прошлом материале.
Паттисон ничего не знает про позиционирование звука в играх
В финале копия Сергея Григоровича у костра призывает нас сделать предзаказ. Ролик заканчивается.
Пишите в комментариях, что вы думаете по поводу разбора? Изменится ли качество финальной игры в лучшую сторону? У меня большие сомнения на этот счёт.
Какие настройки графики всегда лучше отключать
Эти настройки производительности имеют совсем небольшое визуальное воздействие.
Все мы любим выставлять настройки графики на максимум. Но не все они имеют положительный эффект. Даже с элитным аппаратным обеспечением, есть некоторые графические параметры, которые дают небольшое визуальное различие, но имеют значительное влияние на частоту кадров. А если вы ещё и играете на старом ПК, то это именно те настройки, которые вам нужно отключать, чтобы повысить частоту кадров и в тоже время не сделать графику ужасной.
Графические опции и их соответствующее воздействие также могут значительно варьироваться от игры к игре, поэтому для наилучшей производительности нужно пересмотреть специфические руководства по оптимизации. Другими словами, эти параметры «выжимают максимум» в соотношении «железо – производительность».
На удивление эффект тени усиливает производительность графики, однако немножко затемнённые края не достаточно сильно влияют на ваше общее качество изображения. Не выключайте их, но если вы боретесь за частоту кадров – их определенно лучше поставить на низкий или средний уровень.
Размытие в движении
Размытие в движении иногда используется для хорошего эффекта, например, в гоночных играх, но по большей части этот параметр отбирает вашу производительность в обмен на то, что большинство геймеров обычно не любят. Размытость в движении особенно нужно избегать в играх с быстром темпом, например, в шутерах от первого лица.
Глубина резкости
Глубина резкости в играх, как правило, относится к эффекту размытия вещей на заднем плане. Точно так же как и размытие в движении, этот параметр отвлекает наши глаза и создает качество, как у фильмах – это не всегда отлично смотрится. К тому же эта настройка может повлиять на производительность, особенно, если она неправильно использована. Её нужно настраивать, отталкиваясь от личных предпочтений и от того, в какую игру вы играете.
Динамическое отражение
Эта настройка во многом зависит от игры, в которую вы играете, а также от того, что для вас важно с точки зрения качества изображения. Динамические отражения являются параметрами, влияющими на отображения игроков и других движущихся объектов в лужах и на блестящих поверхностях. Это чрезвычайно усиливает производительность графики. Тем не менее, динамические отражения не всегда замечаются, а отключив их, вы увеличите ваши кадры в секунду от 30 до 50%.
Избыточная выборка сглаживания (суперсемплинг, SSAA)
С включённым суперсемплингом, игра делает кадры с более высоким разрешением, нежели разрешение самого экрана, а затем сжимает их обратно до размера дисплея. Это может улучшить вид игр, но если ваш ПК не является особым монстром (как наш любимый Large Pixel Collider), SSAA разрушит вашу производительность. В большинстве случаев, она не стоит того, чтобы её применяли, особенно, когда существует столько альтернатив суперсемплингу
Магия шейдеров 13: Подповерхностное рассеивание
Я на некоторое время пропадал и моя небольшая рубрика про магию шейдеров на пикабу увядала, let’s make it great again!
Очень классный и простой трюк, я увидел в твиттере у Гарри Алисавакиса (Harry Alisavakis).
Можно создать классную драматическую сцену с таким освещением!
Я бы добавил холодного света снаружи, каких-то елей, может святлячков, а может и горящие красные пары глаз среди деревьев.
Весь исходный код Шейдера для Unity вы найдете на сайте Гарри: https://halisavakis.com/my-take-on-shaders-simple-subsurface.
Смотрите остальные посты про магию шейдеров по тегам ниже
Лига Разработчиков Видеоигр
4.4K постов 19.1K подписчиков
Правила сообщества
— Уважайте чужой труд и используйте конструктивную критику
— Не занимайтесь саморекламой, пишите качественные и интересные посты
— Не употребляйте мат без необходимости
— Посты о Вашей игре с историей её разработки и описанием полученного опыта
— Обучающие материалы, туториалы
— Интервью с опытными разработчиками
— Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
— Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
— Только гифки/арты/скриншоты из игры. Такие материалы могут сопровождать рассказ об игре или обучающий туториал, но не должны являться основой поста
— Посты, содержащие только идею игры
— Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
— Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
— Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
— Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
— Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
— Cсылка размещается в формате: «Страница игры в Steam: URL»
Видел я уже где то такие кхмм, шейдеры
Волшебная гифка получилась.
Чувак, можно задать парочку вопросов по юнити? Который год уже работаю шарпистом, но десктоп меня порядком задолбал, хочу перейти на юнити. Что посоветуешь из материалов по обучению? Интересует сама архитектура игры, как правильно устроить мвс паттерн и не придумывать велосипед. Ну и т.д.
Выглядит круто
Реддитор создаёт визуальные эффекты в программе Blender с использованием отслеживания объектов видеокамерой.
Основные эффекты для начальной сцены в игре. Также игрок будет часто взаимодействовать с объектами в локациях, чтоб находить предметы необходимые для принятия некоторых решений. В противном случае игрок может оказаться в не приятной ситуации например без револьвера, или ключа, которые были бы очень кстати в некоторых случаях.
Но самым важным будет найти фрагменты своих воспоминаний в виде пазла, чтоб узнать, как вы попали в этот беспробудный сон, и кто вы такой…
Визуальный обман
Забавно, как благодаря небольшому наклону досок цвет дороги на набережной меняется. По классике, все зависит от точки зрения.
Думаю, помните прикол с кубом и клеточками, где один и тот же цвет кажется то белым, то серым?
Магия шейдеров 19: ASCII Art Шейдер а-ля Watch dogs от Мэтта Старка
Я возвращаюсь к Магии шейдеров и сегодня хочу, как обычно, не вдаваясь в детали, рассказать как бы я сделал шейдер для такого post-эффекта.
Но, давайте, сначала вспомним: что это за ASCII-арт такой. Как сообщает нам Википедия: ASCII-графика — это форма изобразительного искусства, использующая символы ASCII на моноширинном экране компьютерного терминала или принтера для представления изображений.
Так как бы я сделал?
Сделаем fullscreen post-эффект: 1) Вычисляем Luminance 2) Сжимаем картинку до размеров нашей ASCII-картинки в символах. Сколько символов мы хотим чтобы у нас было на экране? 3) Делаем 1D LUT-текстуру с, отсортированными по количеству белого, символами 4) В последнем пассе используем картинку из шага 2 и LUT-текстуру из шага 3 чтобы отрисовать символы в экранную текстуру.
Простор для применения
— Можно блендиться между исходной текстурой и полученной в результате такого пост-эффекта, чтобы сделать какой-то красивый fade-эффект.
— Можно затенять пиксели символов, я предполагаю будет гораздо более объемная картинка
— Можно сделать цветной и добавить какую-то палитру
Как всегда любые вопросы в ЛС или в предложку можно задавать вконтакте, и мы, наконец, завели канал в телеграме: https://t.me/coremission
Всем гектаров в имениях и легкости в движениях!
Смотрите остальные посты про магию шейдеров по тегам ниже.
Графика в играх: окклюзия, сглаживание, фильтрация — Как и с чем её едят
Приветствую всех Стопгеймеров! Давайте начистоту, вы ведь тоже заходите в только купленную игру, но сперва кликаете на графические настройки? Кто ради чего, кому-то ради самоутверждения надо глянуть на ультра-автонастройку благодаря своему мощному «железу», а кто-то просто лезет туда ради интереса.Однако, задумывались ли вы, чем отличаются FXAA и TXAA, или 8х и 16х анизотропная фильтрация? Как-раз в этом блоге, группа Abuse Reviews сейчас вам расскажет и покажет, что же это за фильтрации такие, как они работают и с чем их едят. Поехали!
P.S.
прошлом блоге количество материала в ролике было урезано, здесь эта ошибка была учтена, очень старался для вас.Приятного просмотра)
Давайте начнём с самого-самого простого
Разрешение экрана
Мало кто не знает, что разрешение — это количество отображаемых пикселей по горизонтали и вертикали. От этой настройки также зависит качество картинки и то, как сильно будут выражены «лесенки» в переходах между разными плоскостями\поверхностями. Но почему же возникает этот графический артефакт? Дело в том, что все графические элементы в играх состоят из пикселей, но таких проблем с прямыми линиями не происходит, но стоит только чуть её наклонить, как появляются «лесенки». Возникает это из-за отсутствия плавного перехода между цветами, которое обеспечивает сглаживание, вот о нём мы сейчас и поговорим.
Сглаживание
Самое главное его предназначение — борьба с теми самыми «ступеньками», которые все так не любят. Сглаживание обеспечивает нам плавный переход между цветами, за счёт чего изображение получается куда комфортнее, устраняя «ступеньки». Да, картинка однозначно становится красивой, но всегда приходится чем-то жертвовать, а именно производительностью. За счёт появления новой задачи, процессору и видеокарте приходится рендерить(обрабатывать) все эти дополнительные оттенки, которое даёт нам сглаживание. Но, к счастью, существует много видов сглаживания, которые предоставляют нам разработчики в настройках. Их то мы сейчас и рассмотрим:
Этот вид сглаживания не слишком сильно нагружает процессор, потому что он обрабатывает лишь те части кадра, которые выглядели бы неровными, а выбирает он эти части независимо от того, где и как они располагаются. Это самый быстрый и менее затратный в плане ресурсов метод сглаживания. Отличие от прошлого метода сглаживания заключается в нескольких аспектах. В первую очередь, FXAA применяется к изображению в том разрешении, в котором вы играете, также размывает картинку сильнее, что выглядит совсем не лучше, чем MSAA, зато расходует на порядок меньше ресурсов, из-за чего этот вид сглаживания почти не вредит вашему FPS
Пожалуй, это лучший вид сглаживания, который сильно похож на MSAA, но с некоторыми дополнениями. Дело в том, что TXAA учитывает и берёт в расчёт предыдущие кадры и сглаживает последующие путём усреднения цветов.
Да, это не вид сглаживания, но избавляется от лесенок этот способ довольно неплохо, но при одном условии, которое свойственно не каждому пк. Ведь не у всех есть 2\4К мониторы, которые позволяют увеличить разрешение больше 1920х1080. За счёт уменьшения пикселей «лесенки» остаются, но становятся куда меньше, однако это влияет на производительность больше всего из перечисленных способов. Так что этот метод подойдёт только обладателям мониторов с очень высоким разрешением и мощным железом. Забавно слушать легенды о том, что если поставить 2к или 4к разрешение в игре на FullHD мониторе, то картинка станет лучше. Решил я это проверить на примере GTA V и что-то не увидел разницы до и после, ни в фреймрейте, ни качестве.
Проблем никогда не бывает мало. В этом случае нет никаких исключений, ведь кроме «ступенек» встречается такой артефакт, как разрыв картинки. Это происходит, когда ваши монитор и видеокарта пытаются работать синхронно, но по какой-то причине эти парни не могут этого сделать, причиной является частота кадров и частота обновления монитора. К примеру, вы находитесь в какой-то загруженной локации, а ваша видеокарта старается держать стабильную частоту, в то время как монитор обновляет изображение на одной и той же частоте. Если они не синхронизируются между собой, то как раз и появляется такой разрыв. И для решения этой проблемы предназначен следующий параметр:
Вертикальная синхронизация
Этот параметр заставляет работать видеокарту на той же частоте, что и монитор, однако из-за этого возникают уже другие проблемы, к примеру, частота кадров может сильно падать из-за того что в игре появляется слишком много объектов, которые приходится обрабатывать. Но и для этой беды есть решение, которое называется — горизонтальная синхронизация. Принцип действия заключается в том, что модуль, встроенный в монитор заставляет экран обновляться сразу же при получении нового кадра, что способствует идеальному совпадению частот видеокарты и монитора. Благодаря всему этому, производительность компьютера не уменьшается, а монитор и видеокарта работают максимально слаженно.
На этом о проблемах картинки и артефактах — всё
Тесселяция
Тут стоит обратить внимание на контур головы 47-го
А вот она создана не для того чтобы исправлять косяки в картинке, а улучшать её и делать более насыщенной и реалистичной. Многие из нас знают, что 3д-объекты в играх состоят из полигонов (мелких частиц). Тесселяция подразумевает разбиение полигонов на более мелкие части, чтобы генерировать больше деталей у объекта. Это особенно удобно для выделения высоты и глубины объектов. Также она способствует созданию более закругленных объектов без острых форм и углов.
Окклюзия окружения (Ambient Occlusion)
Лично я занимаюсь созданием 3д-моделей в Cinema 4D и довольно хорошо знаком с этой фичей. Она позволяет создавать искусственные тени, таким образом, в идеале, геймдизайнеры и создатели 3д-анимаций предпочитают использовать движки, поддерживающие функцию глобального освещения, которое позволяет создавать освещение идентичное реальному, а всё благодаря вычислениям точных оттенков каждого из пикселей, в зависимости от общего количества света, попадаемого на него. Знаю, что звучит это сложновато, но как же это преобразовывает картинку… словами не описать. Такое освещение очень подходит для различных кинематографичных сцен в мультфильмах или кат-сцен в играх, но это оказывает очень сильную нагрузку на железо, но на то у нас и есть окклюзия окружения, которая создаёт искусственные тени там, где они должны располагаться.
Для начала стоит разобраться с освещением в играх. В них источником света является естественное освещение, которое является упрощённой версией глобального освещения, где расположение теней зависит от того, есть ли перед источником естественного освещения какое-либо препятствие, но это даёт нам более плоские тени в меньшем количестве, чем хотелось бы. Тут и наступает триумф окклюзии окружения, ведь она определяет расположение дополнительных теней с поммощью трассировки лучшей, а именно вычисляет, сколько солнечных лучшей блокируется рядом со стоящими объектами. То есть, если один объект загораживает другой, то поверхность второго объекта, разумеется, будет находиться в тени. Впадины, углубления и тому подобное начинает больше выделяться с помощью окклюзии.В огромном большинстве случаев этот параметр уже «вшит» в графические настройки, что не позволяет включать и выключать его. Но это всё окклюзия окружения в общем. Наверняка вы все сталкивались с такими параметрами освещения как SSAO,HBAO и HDAO?
Она взяла своё начало со времён первого Crysis, благодаря компании Crytek, по-сути оно заключается в вычислении глубины каждого пикселя и пытается вычислить количество преград от каждой из выбранных точек. Алгоритм SSAO призван упростить вычислительную сложность алгоритма Ambient occlusion и сделать его подходящим для работы на графических процессорах в режиме реального времени. Вместе с тем качество результирующего изображения у SSAO является худшим, чем в первоначальном Ambient occlusion, так как SSAO использует упрощённые методики рендеринга(обработки изображения).
Имеет тот же принцип работы, что и SSAO но несколько усовершенствованный. Просто вычисления глубины производятся с большим числом выборок, но приходится жертвовать производительностью.
Одно основывается на другом. Таким же образом как SSAO отличается от HBAO, HDAO от HBAO отличается точно тем же, ну и ещё эта окклюзия была представлена нам компанией AMD.
Ну а что по кинематографичности?
Глубина резкости
Неплохо так нагружает вашу систему, но и так же неплохо придаёт картинке кинематографичности, а всё благодаря фокусу на конкретных объектах, благодаря чему, остальные объекты размываются. Но это может привнести неудобства, как например при игре в PUBG, во время выглядывания из окна (ну вы знаете, когда упираешься лицом в стену как идиот и видишь всё что происходит за ней) иногда замыливается вид в окне, а фокус идёт на стену или оконную раму. Очень раздражает. Однако кинематографичность, опять же, дарит нам положительные впечатления об игре.
Ну и последнее о чём хотелось бы рассказать
Анизотропная фильтрация
А вот этот параметр уж точно видел каждый, но далеко не все понимают как это работает. Объясню быстро и просто. Во имя сохранения FPS разработчики используют нехитрый трюк с понижением качества текстур и моделей по мере отдаления от них. Зачастую мы можем наблюдать размытие текстуры пола вдали от себя, но если мы включим фильтрацию, то границы между различными уровнями детализации размываются. Плюс такой фильтрации в том, что вы можете со спокойной душой ставить значение 16х, ведь этот параметр почти не оказывает давления на процессор и видеокарту.
Ну а на этом всё. Если вам понравился этот блог и вы узнали что-то новое, обязательно жмите на плюс, а также интересно узнать, нравится ли вам качество видеоформата, если вы его глянули? Большое спасибо вам за внимание, всем удачных каток и стабильного FPS!