Melted Kingdoms
8 постов
8 постов
2 поста
18 постов
Убершейдер - это подход к созданию шейдеров в проекте, когда для множества различных шейдеров вместо отдельных исходников используется большой общий текст шейдера с условными ветвлениями различных "фич". Например, вот так:
// 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. Так... Это немного экспериментальный пост - всё-таки на Пикабу большая часть людей достаточно далека от подобных технических подробностей, но возможно кому-то будет интересно узнать как устроены вот такие разные штуки в компьютерных играх. Так что посмотрим, насколько такой формат востребован. Если что - задавайте вопросы в комментариях :)
UPD. Не пойму это или я что-то делаю не так или Пикабу действительно воспроизводит видео в 30fps?
ВК Видео вроде бы воспроизводит нормально: