Особенности работы программиста графики в геймдеве
Что изучать и как им стать
Меня зовут Иулиан Шаптуров, в команде игрового издателя и разработчика Astrum Entertainment я работаю программистом графики. Эту профессию я выбрал в первую очередь из-за того, что мне было интересно, как создается графика в играх.
Мне всегда нравилось не просто играть в игры, а разбираться в алгоритмах и работать с задачами повышенной сложности. В итоге я остановился на профессии, совмещающей визуал и большие кодовые базы. Кроме того, специалист моего профиля занимается не только кодом, но и «computer science» — по-русски информатикой. Это актуальная тема для множества современных исследований, среди которых стоит в первую очередь отметить ReSTIR, Neural Rendering, Inverse Rendering. Она не просто важна для развития IT-сферы, но еще и применяется в производстве фильмов и контента, в 3D-зрении, а также в геймдеве.
Чем вы занимаетесь?
Так что же все-таки входит в мои задачи? В первую очередь это поддержка графики в нашей версии игрового движка CryEngine. Я и моя команда не просто выслеживаем баги, а действуем шире — мы обновляем функционал движка в тех случаях, когда для этого есть подходящие возможности и ресурсы.
Наша команда разбирается в шейдерах, в архитектуре графического движка, в графических техниках. Мы пишем на С++ и HLSL. В числе прочего мы улучшаем систему материалов, развиваем систему occlusion culling, развиваем наши подсистемы, такие как «система частиц», системы кеширования, работаем с многопоточностью. Из других достижений — перевод части процессов на «compute shaders» и разработка подходящего алгоритма пофрагментной сортировки полупрозрачки. Не беда, если вы ничего не поняли из предыдущих предложений — если обойтись без терминов, то мы основательно модифицировали и улучшили CryEngine, используя современный инструментарий.
Сейчас я и команда работаем над оптимизацией игры и улучшением визуала, регулярно общаемся с художниками и дизайнерами, рассказываем им о возможностях нашего движка и о том, как эти самые возможности дополнительно расширить. В силу технических ограничений мы часто стоим перед выбором: либо снижать FPS и тем самым улучшать контент, либо стабилизировать FPS, но при этом делать контент чуть более умеренным. Борьба с этими ограничениями — это львиная доля работы. Мы постоянно сталкиваемся с тем, что проект большой, контента много и старые методы по оптимизации в какой-то момент перестают работать. Могу сказать, что мы всегда ищем компромисс — чтобы игра запускалась на бюджетных компьютерах и при этом выглядела привлекательно.
Кому подойдет эта профессия?
В нашей профессии ценится насмотренность. Вы получаете необходимый багаж знаний, играя в различные игры и разбирая техники реализации графической составляющей. Усидчивость, любовь к головоломкам и готовность их решать неделями, особенно если вам нравится программирование и математика, — все это крайне нужные качества.Обычно карьеру в программировании графики начинают со стажировок в геймдеве или просто приходят из других областей программирования. Кто-то поступает в профильные магистратуры, получает там необходимую базу и попадает на стажировку. Путь в «render engineering» может быть разным, и сейчас я поделюсь своим опытом.Лично я учился в провинциальном вузе на математика, одновременно работал обычным программистом, потом попал на стажировку в геймдев. Все это время параллельно с обучением я разрабатывал свои проекты, движки и получал таким образом весь необходимый опыт. Кроме того, наращивал навыки, создавал дипломную по вычислительной геометрии, а точнее, по трехмерной реконструкции поверхности.
Не секрет, что многие начинающие программисты графики разрабатывают собственный движок. Это тема для споров и дискуссий, так что начну с примеров. Чтобы успешно писать код, не обязательно подробно знать, как работают инструменты, операционная система и компьютер. Хотя эти знания, вне всякого сомнения, могут быть очень полезны в специфических задачах.
Тем, кто водит машину, не обязательно знать, как работает двигатель автомобиля. Современные движки — это абстракция, необходимая для того, чтобы разработчики игры меньше погружались в низкоуровневые детали. Но есть и те, кому интересны низкоуровневые детали, есть те, кто улучшает Unreal Engine 5, например, и есть те, кому проще понять, почему так надо или не надо делать.
При этом возникают спорные моменты. Обычно аргументы такие: «Зачем писать свой движок, если есть готовые?» или: «Как можно пользоваться движком, не зная, как он работает изнутри?». Лично я считаю, что очень важно уметь читать чужой код, не бояться старого кода в виде «наследия», как и больших объемов кода.
Что лучше всего изучать программисту графики?
Если кратко, то посмотрите роадмап и вступите в Telegram-сообщество по графике. Для начала этого более чем достаточно. Есть еще один путь — изучить требования в описании вакансий и начать изучение с этих предметных технологий.
Если вам интересно низкоуровневое программирование графики и вы не боитесь базового погружения в графическое API (GAPI), то этот вариант для вас. Проще всего начать изучение графики с OpenGL и DirectX 11 — эти GAPI еще поддерживаются и встречаются на некоторых проектах, хотя уже не развиваются. А потом есть резон переходить на DirectX 12 и Vulkan. Имейте ввиду, что существуют игровые движки (Unity, Unreal Engine, CryEngine, Unigine и т. п.) и разные обертки типа Falcor, которые облегчают вашу работу. На Unity вы можете найти множество PET-проектов и использовать их для обучения. Если вам нужны базовые представления о том, как работает shading в шейдерах, работа с тенями, forward и deferred rendering, PBR-шейдинг, основа screen space эффектов (SSAO) и тому подобные задачи, то поможет эта информация. Но детальные инструкции по DirectX 12 и Vulkan могут оказаться слишком сложными для новичков.
Если же вы готовы к вызовам, то детали ждут по ссылкам: DirectX 12 и Vulkan. По этим же ссылкам вы найдете реализации уже современных техник, таких как GPU-driven rendering, GPU-occlusion culling.
Дополнительно рекомендую углубиться в тематику рейтрейсинга, если вам интересно, как работает path-трейсер в игре Cyberpunk 2077. Изучите подробно тему Global Illumination. А дальше — пользуйтесь моими ссылками выше, вооружитесь правильным майндсетом, и у вас все получится!