8 мин. на чтение

Что такое шейдеры и зачем они нужны?

img

Представьте ситуацию: вы запускаете игру, которую скачивали несколько часов, в надежде сразу же погрузиться в приключение, но тут вас встречает надоедливая табличка с надписью: «Идет компиляция шейдеров». Знакомо? Практически все игры последних лет с продвинутой графикой невозможно запустить без компиляции шейдеров. Но какую роль играют шейдеры и зачем они компилируются? Разберем по полочкам эту сложную тему.

Содержание

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

В компьютерной графике используется полигональная (фасетная) модель построения объектов. То есть любой объект, который вы видите в играх (персонаж, здания, мчащийся по дороге автомобиль и сама эта дорога), состоит из простейших геометрических фигур — треугольников, а иногда четырехугольников и пятиугольников. У каждого полигона (фигуры) есть вершина с координатой. Используя эти данные, вычислительная машина соединяет вершины фигур, создавая полигональную сетку, из которой строится «скелет» 3D-модели.

img
Источник: devopedia.org

Если модели в играх состоят, например, из треугольников, то почему они не выглядят угловатыми? Ответ прост: постройте модель из тысяч полигонов — и тогда края объекта сгладятся настолько, что человеческому глазу сложно будет заметить неровность. То есть получится модель с высокой детализацией.

img
Источник: youtube.com @cgplus

Окей, а как это связано с шейдерами? Шейдеры — это небольшие компьютерные программы, написанные на языке программирования высокого уровня и исполняемые на специальных ядрах графических процессоров (видеокарт). Шейдеры используются в графических API — DirectX, Vulkan OpenGL — и помогают разработчикам быстрее создавать объекты и сложные визуальные эффекты для них. Одна из функций шейдера — это задание координат вершин полигонов для построения полигональных моделей.

Зачем нужны шейдеры?

На ранних этапах развития технологий разработки игр шейдеры использовались для визуального оформления теней объектов. Отсюда и пошло название (от англ. Shade — тень, затенение). В дальнейшем инженеры поняли, что в такие мини-программы удобно «упаковывать» и другие куски кода. За счет того, что шейдеры запускаются на заточенных под это дело ядрах графических процессоров, скорость исполнения кода существенно выросла, вместе с чем подтянулась общая производительность систем в играх.

Разработчики получили возможность усложнять графику, делать ее более комплексной, а также добавлять больше визуальных эффектов, доходя вплоть до кинематографического качества картинки, чем может похвастаться, например, The Last of Us II или God of War Ragnarok. Обратная сторона реалистичной графики — это высокие требования к производительности графического процессора. Чтобы поиграть в Full HD с комфортом, понадобится минимум RTX 4060, а входной уровень для Quad HD — это RTX 4070.

Типы шейдеров

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

  • Вершинные (Vertex Shaders)Ключевые шейдеры, которые обрабатывают вершины координат полигонов. Создают «карту» 3D-объектов на экране.
img
Источник: blog.grijjy.com
  • Фрагментные (Pixel Shaders)«Цветовые» (пиксельные) шейдеры отвечают за то, как будет выглядеть сцена. То есть они «раскрашивают» пиксели, из которых состоят объекты, накладывая текстуры, а также создают эффекты освещения, тени и отвечают за отражение и преломление света.
img
Источник: medium.com
  • Геометрические (Geometry Shaders)Шейдеры, которые могут принимать на вход геометрические примитивы и создавать в режиме реального времени дополнительные данные, повышая детализацию модели.
img
Источник: u/emberfishgames
  • Вычислительные (Compute Shaders)Вспомогательные шейдеры, которые не взаимодействуют с графическими объектами напрямую, а в основном выполняют математические операции на больших объемах данных. У вычислительных шейдеров разнородные функции: от процедурной генерации объектов и физической симуляции (частицы, ткани, жидкости) до работы с системами искусственного интеллекта.

Естественно, это не единственные типы шейдеров. В зависимости от требований разработчиков создаются и какие-то кастомные шейдеры. Например, в играх, использующих технологии видеокарт NVIDIA, могут использоваться Ray Tracing Shaders (шейдеры трассировки лучей), которые работают со светом и отражениями. А профессиональные приложения для работы с ИИ могут использовать Tensor Shaders — шейдеры, которые эффективнее всего исполняются на тензорных ядрах видеокарт NVIDIA.

Видеокарта Gigabyte GeForce RTX 4060
55 770 р.*
Смотреть товар
Видеокарта Gigabyte GeForce RTX 4070
124 200 р.*
Смотреть товар
Видеокарта Palit NVIDIA GeForce RTX 4080
141 999 р.*
Смотреть товар
Видеокарта Maxsun Nvidia GeForce RTX 4070
101 790 р.*
Смотреть товар

Компиляция шейдеров в играх

Шейдеры написаны на языке программирования высокого уровня, но графический процессор в чистом виде его не понимает. Чтобы «сказать» оборудованию выполнить код, в программировании используется компилятор — он переводит программу в низкоуровневый машинный код, понятный компьютеру.

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

img
Источник: r/marvelrivals

Бывалые игроки вспомнят, что еще лет 10 назад при запуске игр не появлялись никакие таблички с просьбой подождать, пока завершится процесс компиляции. Так почему сейчас это происходит почти в каждой игре AAA-уровня? Ответ прост: их стало существенно больше. Раньше разработчики умело «прятали» компиляцию под вступительные катсцены или экраны загрузок — этого времени хватало, чтобы подгрузились необходимые текстуры и скомпилировались шейдеры. А остальное происходило по мере игрового процесса без существенного влияния на производительность.

Сейчас огромный пак шейдеров может компилироваться десятки минут. Естественно, это не перекрыть катсценой или загрузочным экраном. Поэтому разработчики говорят в лоб: «Ждите, пока скомпилируются шейдеры».

Ошибки компиляции

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

Реже случаются ошибки компиляции из-за несовместимого оборудования — когда у графического процессора отсутствуют нужные ядра для исполнения специализированного шейдера. Иногда проблема носит программный характер — попросту устарели драйверы или графический API.

Не совсем ошибка, но распространенная проблема — низкая производительность. Когда у игры слишком много сложных шейдеров, а графическому процессору не достает производительности, возникают зависания, лаги, «слайд-шоу» на экране. Эта проблема связана с устареванием железа и лечится только апгрейдом. Например, древнюю GTX 1050 Ti, которая в свое время считалась мейнстримной игровой картой, неплохо бы уже заменить на RTX 4060 или хотя бы RTX 3050.

Держи подарок от именинника: праздничные скидки от 32% в «Эльдорадо»

Узнать больше

Как ускорить компиляцию?

На самом деле способов ускорить компиляцию не так много. Самый действенный из них — это установка игры на SSD-накопитель. Даже самый обычный накопитель стандарта PCIe 3.0 ускорит компиляцию в разы в сравнении с традиционным жестким диском (HDD).

Если при запуске игры компиляция каждый раз проходит повторно (например, такое встречается в Apex Legends или Marvel Rivals), включите кэширование в настройках графического процессора.

NVIDIA

  1. Запустите панель управления NVIDIA, кликнув правой кнопкой мыши по свободному месту на рабочем столе и нажав на соответствующий ярлык.
img
  1. Перейдите во вкладку «Управление параметрами 3D».
img
  1. Найдите параметр «Размер кэша шейдеров» и, если он отключен, выставьте «По умолчанию для драйвера» или вручную укажите размер в зависимости от свободного места на накопителе.
img
Источник: r/marvelrivals
  1. Примените настройки, нажав на соответствующую кнопку в нижней части окна.

AMD

Внимание: редактирование реестра сопряжено с рисками. Рекомендуется сделать бэкап важных данных и создать точку восстановления!

  1. Нажмите сочетание клавиш Win + R и в появившемся окне введите команду regedit.
img
  1. В дереве папок перейдите по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\UMD.
  2. Найдите файл с названием ShaderCache.
  3. Если файла нет, создайте его, кликнув правой кнопкой мыши на свободное место и выбрав в выпадающем меню «Создать двоичный параметр». Обязательно назовите файл ShaderCache.
img
  1. Два раза кликните по файлу.
  2. В открывшемся окне введите один из трех параметров:
    • 30 00 — кэширование шейдеров выключено;
    • 31 00 — оптимизировано драйвером AMD;
    • 32 00 — кэширование шейдеров всегда включено.
img
  1. Перезагрузите компьютер после всех изменений.
Реклама. Рекламодатель: ООО «МВМ»
2SDnjcEhkzY
*Информация о товарах, размещенная на «Эльдоблоге», не является публичной офертой. Цена товаров приведена справочно. С актуальными ценами на товары в соответствующем регионе вы можете ознакомиться на сайте eldorado.ru
Присылайте нам свои обзоры техники — и получайте до 1000 бонусов!

Комментарии

К данной публикации еще нет комментариев