Рендер чемпионов в League of Legends.
Один из сотрудников Riot Games Пол Гиртс (Paul Geerts) рассказал о системе материалов, которая позволила разработчикам League of Legends упростить процесс создания персонажей для игры и сделать эффекты текстур более интересными.
Разработчикам требуется разная информация, чтобы нарисовать чемпиона. В прошлом вся она хранилась в INI-файлах, но сейчас всё иначе. Тем не менее, INI-файлы остаются хорошим способом, чтобы показать, как создаются персонажи.
Файл annie.skn содержит бинарные данные о меше чемпиона, треугольники, вершины и UV-информацию. В то же время в annie.skl содержится «скелет», иерархия костей, с помощью которых аниматоры могут заставить Энни атаковать или танцевать.
Прежде, когда нужно было нарисовать Энни (или любого другого чемпиона), в коде League of Legends присутствовала строчка, которая говорила графическому драйверу использовать текстуру в слоте 0 в следующий раз.
Со временем появились другие возможности, позволяющие изменить процесс появления чемпионов в игре.
Карта отражений перешла в слот 2, а блеск отправился в слот 11. Они связаны с пронумерованными текстурами в шейдере. Когда разработчики хотят вывести на экран Энни, они используют большой блок «привязанного» к чемпиону кода, который занесён в GPU. Таким образом, когда разработчики хотят поэкспериментировать с новыми эффектами, им приходится «зарываться» глубоко в код, пытаясь выяснить, использует ли кто-то слот 7 для чего-нибудь.
Все эффекты простого сияния (вроде плаща Эш) — были созданы с помощью системы частиц.
Раньше она была проще, как и процесс создания чемпиона. Но это не значит, что не было никаких проблем. Полагаясь на систему частиц, разработчикам приходилось совершать больше ненужных действий.
В конце концов они поняли, что их способ управления рендером не подходит для растущей игры, поэтому такой метод работы с кодом был назван устаревшим. Разработчики понимали, что рано или поздно от него придётся избавиться.
Система материалов
В основе системы материалов лежит последовательный способ определения каждого элемента, который должен быть заложен в GPU, прежде чем игра будет рендерить кадр.
Ядро системы материалов было написано во время обновления Summoner’s Rift, несколько лет назад. Сейчас разработчики пытаются сделать эту технологию шире, а также избавиться от устаревшего кода для чемпионов. Вот отрывок из системы материалов, созданной для простых материалов.
Разработчики сделали один набор состояний рендера для каждого чемпиона. Рисовать с ним стало просто.
Теперь разработчики обращаются к текстурам и параметрам по их названиям, а не номерам. При этом текстуры всё равно должны оканчиваться номерным слотом, чтобы GPU могла использовать их, но теперь это происходит автоматически и разработчикам не приходится запоминать номера.
У такого подхода есть несколько преимуществ перед устаревшим кодом:
- снижение сложности петли рендера (render loop) и лучшее использование системного кэша;
-
разработчики могут сосредоточится на оптимизации одного кода, а не распространятся на разные системы;
-
изучение системы материалов однажды позволить Riot games быстро и легко переходить между разными базами кода;
-
искать в коде строчку «DIFFUSE_MAP», например, в 932 раза проще, чем искать цифру 0.
Кроме того, создатели игры могут «клонировать» материалы и менять текстуры, оставляя другие элементы нетронутыми. Большую часть работы составил перенос устаревшего кода для создания материалов из данных, которые уже были у разработчиков. С патча 7.7 Riot Pixels делает это для всех чемпионов.
Анатомия материалов
Материалы собраны из некоторого количества техник (techniques) и каждая из них содержит, по крайней мере, один проход (pass). Техника отвечает на определённый метод рендеренга, а проходы — на однократный вызов создания геометрии.
Здесь разработчики использовали «нормальную» технику, но в качестве других примеров могут выступать техники «depth only» для карт теней, «z pre-pass» или конкретные игровые спецэффекты.
Сейчас пиксельные шейдеры могут за один проход сделать многое, но порой имеет смысл разделить процесс на несколько однократных вызовов для одного объекта. Каждый проход включает в себя все необходимые состояния — шейдеры, режимы наложения, глубины, отбрасывание нелицевых граней, альфу и другие.
В настоящее время материалы на персонажах League of Legends включают в себя две техники: «нормальную» и «переход». Разработчикам приходилось переписывать эффект перехода, который используется, например, когда Кассиопея превращает оппонента в камень. Прежде разработчикам приходилось смешивать диффузную текстуру персонажа с текстурой камня и отправлять результат в слот 0.
Такой подход сопряжён с некоторыми проблемами. Во-первых, не всем материалам нужна диффузная текстура. Например, если разработчики хотят создать стеклянную пушку, им не понадобится диффузная текстура, ведь стекло как материал можно симулировать с помощью цвета и подсветки. Во-вторых, даже если у материала есть диффузная текстура, её замена может изменить лишь некоторые части персонажа, оставив остальные в первозданном виде.
Сейчас у Riot Games есть технология «перехода». Когда эффект перехода проигрывается, используются разные шейдеры, которые контролируют смешение материала с целевой текстурой. В этом случае шейдер управляет тем, как происходит переход. Например, его код определяет, какие координаты текстуры нужно использовать.
Есть и другие преимущества. Ранее, при создании смешанной текстуры использовалась исходная текстура в полном разрешении, даже если персонаж на экране был маленьким. С помощью шейдеров снижается нагрузка на систему, так как он работает только с видимыми пикселями. Для снижения нагрузки разработчикам также пришлось оптимизировать расчёты перехода.
Система материалов позволила упростить работу Riot Games, а также заставила игру лучше работать на компьютерах пользователей. Но есть и другая причина, почему разработчики хотят, чтобы все состояния GPU были собраны в материалах — всё может храниться в данных, а не коде.
Разработчики хотели сделать перья чемпионов Шаи и Рейкана переливающимися. Так как всё создаётся с помощью материалов, отдельные материалы для персонажа могут быть созданы сразу в данных. Но для этого потребовалось создать специальный инструмент.
Так как перья сделаны на основе сервера данных, Riot Games получили возможность создать действительно красивые перья, которые не используют ресурсы. Кроме того, любые изменения в материалах сразу же появляются в игре. Это позволяет художникам сразу же получать отзыв о своей работе.
Источник: DTF