98

Что такое шейдеры в играх и зачем они компилируются

Каждый геймер, который играет в новинки и современные игры на ПК (уточнение платформы не случайное, раскрою потом почему), сталкивался с такой ситуацией: ждёшь, пока игра установится, а как игра установилась и руки уже чешутся начать игру, но тут вы видите что-то типа такого и ждёте ещё много времени:

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

Ну что ж, давайте разберёмся. И да, я не хочу раздувать этот пост до каких-то уж чрезмерных объёмов за счёт технических нюансов. Те кому интересны технические нюансы, пусть лучше просмотрят соответствующие конференции, интервью разработчиков и так далее. Эта статья - просто для рядового геймера, чтобы он понимал, зачем эта компиляция нужна.

Что такое шейдеры

Представим, что у нас есть полотно для рисования. Как нам задавать на рисунке объём, игру света и тени, различные эффекты? Художник это начинает просто рисовать. Потому что у художника есть определенные правила, по которым он рисует, ведь художник, вероятнее всего, обучался правилам композиции, построения кадра, затенения и так далее.

Вот шейдеры - это такие же художники, но которые грубо говоря берут полотно (игру) и начинают задавать вашей видеокарте (GPU) правила того, как видеокарта должна отрисовывать все визуальные нюансы игры. И эти правила задаёт программист, а некоторые правила отрисовки (рендера) заложены в игровой движок по умолчанию.

Возможно, что звучит чуть-чуть сумбурно, но в конце я дам более простой вывод, совсем уж для упрощённого понимания концепции.

Примеры использования шейдеров:

Например, вот вы можете посмотреть на эту замечательную водичку:

Вот шейдер, как маленькая программа-художник, в зависимости от своих правил берёт и эту водичку отрисовывает. Шейдер показывает вашему графическому процессору видеокарты (GPU), как с водичкой работать: вот здесь нужен блик, здесь сделать рефракцию (под водой объекты как бы "преломляются" визуально), а здесь - добавь каких-нибудь волн.

Но шейдеры задают правила отрисовки не только для воды, огня и прочее. Они в том числе работают даже с самыми простыми материалами. Вот, например, есть такая вот кирпичная стена, для материала которого был написан шейдер, как материал должен работать с освещением: где материал должен быть затенён, как он освещается, где затеняется и так далее:

Пожалуй, одним из лидеров по мелким деталям и мелочам является компания Rockstar, которая выпустила Read Dead Redemption 2 и там геймеры были в шоке от мелкой детали, но физически корректной - там у персонажа есть подповерхностное рассеивание даже у ушей. Если коротко, то подповерхностное рассеивание - это процесс, когда свет распространяется как бы через полупрозрачные тела.

Поэтому программист взял и написал программу (шейдер), как и где движку отрисовывать такой вот эффект.

Или если взять трейлер GTA 6, который тоже всех впечатлил маленькой деталью: там у пива есть маленькие пузырики, для которых программист тоже написал программу, как они должны отображаться в конкретный момент и задал им правило появления:

Ну и если уж за шейдеры жидкостей говорим, то и коктейль Молотова в CS2 тоже работает по правилам шейдера. В частности, это вся бутылка, а также поведение жидкости в бутылке - тоже результат работы шейдеров, ведь заданы правила:

В общем, если уж говорить просто, то шейдеры - это код, который говорит, как вашей игре выглядеть. Ведь игра всегда работает по каким-то правилам работы с освещением, материалами, текстурами и так далее. Поэтому шейдеры - это неотъемлемая часть любой игры.

Как в целом работает шейдер

Если говорить максимально упрощённо, но не теряя сути, то происходит это так:

1. Программист пишет шейдер (маленькую программу, которая задаёт правила взаимодействия шейдера с миром игры);

2. Компилятор подхватывает эти самые правила (на этом этапе и происходит компиляция шейдеров, о которой мы говорим);

3. Игра сохраняет информацию о том, как ей вести себя, скажем, с шейдером дыма, или как машина будет бликовать на солнце.

4. Вся эта информация заносится в кэш, чтобы постоянно эти шейдеры не компилировать. И верно, зачем это делать повторно, если все эти инструкции уже получены?

Кстати, забавный факт. Игра STALKER 2, которая запрещена в России, признана экстремистской и террористической (и что там ещё писать нужно в этих ситуациях, хз), грешила кое-одной проблемой на релизе. Игра КАЖДЫЙ ВХОД в игру компилировала шейдеры заново. Почему? Программисты сделали так, что игра о скомпилированных шейдерах не сохраняла информацию в кэш, поэтому игра получала инструкции работы с шейдерами каждый ваш вход в игру.

Какие есть типы шейдеров

Давайте тут слишком сильно зарываться не будем, потому что тут можно застрять прям на очень долго. Я перечислю кратко, какие основные шейдеры бывают:

1) Вершинные. Каждый объект в игре имеет вершины, которые формируют геометрию объекта. Соответственно, если нужен шейдер деформации материала (например, чтобы снег под ногами персонажа оставлял следы), то пишется такой шейдер. Ну кстати и необязательно для деформации, а даже просто для отображения.

2) Фрагментальные/пиксельные. Шейдер занимается раскраской пикселей. Ну вот есть, например, стена. Она разрисована определенными пикселями. Вы можете написать шейдер крови, для которой правило будет - окрашивать конкретные пиксели в цвет крови, если вы выстрелили или ударили по врагу.

3) Геометрические. Их суть в том, что они способны дорисовывать дополнительную геометрию для объектов, тем самым делая объекты визуально объёмнее. Например, такие шейдеры способны плоский материал стены сделать объёмным на самом деле. Но не путайте с Normal Map (не хочу уходить в дебри моделирования), который создаёт лишь иллюзию глубины, в то время как геометрические шейдеры добавляют реальной геометрии объектам.

4) Вычислительные. Шейдеры, чья задача - произвести вычисления, скажем, поведения ткани, воды в бутылке и так далее. Например, в Max Payne 3 вычислительный шейдер определяет, в каком положении наш персонаж, а значит создавай складки и тени на одежде в определенных местах:

Почему компиляция шейдеров необходима

Вообще вы можете заморочиться, залезть в код программы, подкрутить там что-то, чтобы компиляция шейдеров не происходила вообще даже при первичном запуске, но взамен вы получите: визуально сломанную игру со статерами + вылеты. Это если игра вообще запустится, конечно.

Поэтому компиляция необходима. Почему? Ну, ответ прост. Ваша видеокарта не будет иметь инструкций, как работать с игрой. Поэтому если игра вдруг и запустится, то игра будет работать плохо.

Кстати говоря, если вдруг вы обновите своё ПО, а в частности - видеокарту, то если вы зайдёте повторно в игру, то она начнёт компилировать шейдеры повторно. Почему? Ну, внимательные читатели уже поняли. Код шейдеров передаёт новые инструкции вашей видеокарте, как с визуалом игры работать, а то новая видюшка этого не знает.

Почему раньше не было компиляции шейдеров, а сейчас в каких-то играх она есть, а в каких-то её нет

А вот тут, друзья мои, мы уйдём в очень сложные технические дебри, но я постараюсь объяснить это простым языком, но самую основу.

Итак, почему сейчас некоторые игры компилируют шейдеры, а некоторые нет:

Напомню, что компиляция шейдеров - это передача вашему оборудованию конкретных сведений о работе с шейдерами. Давайте мы возьмём игру The Last Of Us. Почему на Sony Playstation 4/5 нет явного экрана компиляции шейдеров, а на ПК - есть. Всё просто. Программист заранее знает всю архитектуру Sony Playstation 4/5. Поэтому сведения об оборудовании консоли уже включены в саму игру, поэтому шейдеры очень быстро подтягиваются в игру и вы не видите экрана компиляции шейдеров, ибо всё это быстро происходит в фоновом режиме.

А если мы говорим про The Last of Us на ПК, то тут у нас уже разные видеокарты, как минимум. Поэтому и имеем, что имеем. Игре нужно передать инструкции вашей видеокарте, в то время как для Playstaion - не нужно. Там заранее все характеристики и оборудование известны.

Но тут встаёт вопрос: хорошо, а почему некоторые игры на ПК не требуют компиляции шейдеров? А вот тут всё зависит от многих факторов.

Во-первых, если игра не слишком уж сильно тяжёлая, то компиляция шейдеров проходит в фоновом режиме в начале игры, что вы этого даже не замечаете. Опять же, не всегда, но часто.

Во-вторых, в этом может помочь ваш драйвер видеокарты. Он уже заранее знает характеристики вашего ПК, а в частности - видеокарты. Плюс возможно какие-то похожие шейдеры он кэшировал уже когда-то давно, в аналогичной игре. И он эту информацию передаёт игре уже заранее, во время установки. Поэтому компиляция может и не потребоваться, инструкции уже все переданы. Поэтому условно говоря видеокарта способна взять на себя вопросы компиляции шейдеров. Да ещё и DirectX и прочие графические API, кстати говоря, способна эти вопросы на себя забирать.

И да, тут множество нюансов, повторюсь. Возможно что обязательную компиляцию шейдеров прописал в том числе программист, чтобы обезопасить игру от "автоматики", чтобы игра всё-таки сделала эту компиляцию сама. Да, геймер побурчит, но зато не рефандит игру потом, жалуясь на техническое состояние в случае каких-то проблем.

Но и тут вопрос: а почему в старых играх (условно до 2007 года) компиляции шейдеров не было, а вот сейчас - почти каждая большая игра требует компиляции. И знаете, тут ответ прост - вычислительные мощности. Да и скажу больше, что компиляция шейдеров была даже в старых играх.

Раньше каких-то уж супер уникальных шейдеров в играх было мало, и видеокарты справлялись без отдельного окна с компиляцией. Ответ банален, но да. Вы можете сравнить графику, освещение игр прошлого и современную. Да, кто-то сейчас может будет ёрничать, что "раньше было лучше", но я напомню - я беру +- отрезок до 2007 года. Тогда шейдеры были проще и компилировались на ходу, а сейчас шейдеры стали очень сложными, что налету их не всегда можно компилировать.

Поэтому сейчас мы можем иметь долгую компиляцию шейдеров на старте, но зато получить очень красивую картинку, эффекты и так далее. Можете глянуть на игру 2002 года, например, где прям видно, что графика, давайте будем честны, сейчас смотрится примитивно. И соответственно шейдеры (инструкции), были тоже примитивными:

Зато сейчас у нас большие вычислительные мощности, которые способны рисовать отражения в реальном времени, блики, контурное освещение и так далее.. Соответственно, для таких эффектов требуются уже шейдеры (инструкции) намного объёмнее и больше:

Выводы

И если вдруг вы совсем запутались (или просто не хотите читать весь пост целиком, а только главную мысль), то вот: шейдеры - это маленькие написанные программистом программы, которые дают вашей видеокарте инструкции, как отрисовывать освещение в игре, эффекты и так далее. Соответственно, во время компиляции шейдеров происходит "сборка", которая все эти инструкции "собирает" в понятный для машины код и переносит эти инструкции вашей видеокарте, а ваша видеокарта потом спокойно всё отрисовывает.

==========

Об авторе:

Являюсь разработчиком игр и веду свой YouTube канал по созданию игр на Unreal Engine и второй канал по Unity. Если интересно, то можете заглянуть и подписаться, поскольку показываю в своих видео, как создаются популярные игровые механики.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества