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

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

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

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

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

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

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

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

Вот шейдеры - это такие же художники, но которые грубо говоря берут полотно (игру) и начинают задавать вашей видеокарте (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. Если интересно, то можете заглянуть и подписаться, поскольку показываю в своих видео, как создаются популярные игровые механики.

294
27
14
2
1
1
203 комментария