Tinaynox

Tinaynox

Legendary Mad Superior Indie Chief Tech Lead Senior C++ Game Developer https://tinaynox.com
Пикабушник
Дата рождения: 1 июня
в топе авторов на 583 месте
17К рейтинг 4567 подписчиков 35 подписок 43 поста 12 в горячем
Награды:
С Днем рождения, Пикабу!10 лет на Пикабу За участие в Новогоднем видео-поздравлении Пикабу более 1000 подписчиков
13

Показываю как работает Убершейдер в моём самописном движке (и немного рассказываю что это простыми словами)⁠⁠

Убершейдер - это подход к созданию шейдеров в проекте, когда для множества различных шейдеров вместо отдельных исходников используется большой общий текст шейдера с условными ветвлениями различных "фич". Например, вот так:

// Normal
#if defined(NORMAL_MAP) && (NORMAL_MAP)
vec3 normalTS = SampleNormalTS(u_normalMap, v_uv0, u_normalScale);
mat3 tangentToWorld = mat3(normalize(v_tangentWS), normalize(v_bitangentWS), normalize(v_normalWS));
vec3 normalWS = normalize(TransformTangentToWorld(normalTS, tangentToWorld));
#else
vec3 normalWS = normalize(v_normalWS);
#endif

В данном случае если у нас включена "фича" NORMAL_MAP, то шейдер будет использовать первую часть кода и считать нормаль из карты нормалей, а если выключена, то шейдер по стандартному - берёт нормаль из вершин треугольника.
Т.е. шейдер с NORMAL_MAP и без - это уже два разных финальных шейдера. И чем больше мы используем комбинаций различных фич - тем большее количество финальных шейдеров мы рискуем получить, а это дополнительные затраты на компиляцию, хранение, управление и переключение шейдеров.
Чтоб этого избежать в большинстве случаев мы можем просто оставить "фичу" включенной для разных материалов в проекте, но для тех материалов где она не нужна, просто передавать туда нулевые/единичные данные для неё, которые ничего не изменят в отрисовке. Например в случае с NORMAL_MAP мы можем просто передать нейтральную карту нормалей (просто текстура 1х1, один пиксель с цветом 128,128,255) - это даст практически тот же результат, что и расчет нормали из вершин треугольника.
Конечно, у такого подхода есть своя цена: шейдер продолжает выполнять операции, связанные с включённой фичей, даже если конкретному материалу они не нужны. Поэтому здесь приходится искать баланс между количеством шейдеров и стоимостью их выполнения.

На демонстрации в видео для материала крыши можем увидеть следующие "фичи":
SPECULAR_MAP - поддержка Specular-карты (цвета бликов)
NORMAL_MAP - поддержка карты нормалей
ALPHA_TEST_MAP - поддержка карты маски отсечений (прорезаем дыры в нужных местах модели, не меняя её)
SHADOW_MAP - поддержка теней (на этот материал может падать тень)
HERO_POSITION_DISSOLVE - вырезаем кружочек вокруг позиции героя (чтоб мы видели героя за объектами с этим материалом)
CHECKERBOARD_DISSOLVE - способность "расстворять" модель целиком "шахматной" маской (например крыши домов, когда герой заходит в дом)
USE_VERTEX_COLOR - в диффузный цвет домножаем цвет из вершин (иногда бывает нужно)
FOG_OF_WAR - поддержка тумана войны

Кстати, во многом именно из-за такой комбинаторики различных шейдерных фич при запуске некоторых современных игр можно увидеть надпись "Компиляция шейдеров 1/3482" и спокойно отправиться пить чай на ближайшие полчаса... :)

P.S. Так... Это немного экспериментальный пост - всё-таки на Пикабу большая часть людей достаточно далека от подобных технических подробностей, но возможно кому-то будет интересно узнать как устроены вот такие разные штуки в компьютерных играх. Так что посмотрим, насколько такой формат востребован. Если что - задавайте вопросы в комментариях :)

Показать полностью
11

Создаю свою олдскульную фэнтези постапокалипсис инди RPG на самописном движке - Туман Войны. Туман Войны никогда не меняется⁠⁠

Серия Melted Kingdoms

UPD. Не пойму это или я что-то делаю не так или Пикабу действительно воспроизводит видео в 30fps?
ВК Видео вроде бы воспроизводит нормально:

Показать полностью 1
93

Создаю свою олдскульную фэнтези постапокалипсис инди RPG на самописном движке - куры кудахчут, а дикари рассказывают о небесных духах⁠⁠

Серия Melted Kingdoms
43

Создаю свою олдскульную фэнтези постапокалипсис инди RPG на самописном движке - мирный и боевой режимы персонажа⁠⁠

Серия Melted Kingdoms
15

Создаю свою олдскульную фэнтези постапокалипсис инди RPG на самописном движке - тестируем локализацию⁠⁠

Серия Melted Kingdoms
Показать полностью 4
9

Создаю свою олдскульную фэнтези постапокалипсис инди RPG на самописном движке - грабим стартовое поселение как настоящий приключенец⁠⁠

Серия Melted Kingdoms

ВК Видео: https://vkvideo.ru/video-199906538_456239169

Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества