Технологии в игровых движках
Руководитель проекта: Кашубина Ольга Фёдоровна
МБОУ Гимназия
Движок может быть определен как неигровая специфическая технология. Среди игровых же частей можно выделить две - это все содержание игры (модели, анимация, звуки, AI и физика), называемое «активом» игры (assets), и специальный игровой код, отрабатывающий AI и управляющий процессом игры.
Визуальзатор
Итак, что такое визуализатор и почему он столь важен? Дело в том, что без него вы ничего на экране не увидите. Он визуализирует сцену для игрока, чтобы он смог принимать определенные решения на основе отображаемой на экране информации. На визуализатор обычно уходит более 50% ресурсов процессора, и именно за визуализатор игровых разработчиков чаще всего и критикуют.
Визуализатор в наши дни должен использовать 3D ускоритель, API и трехмерные вычисления.
Создание 3D мира
3D объекты хранятся в виде точек трехмерного мира (их еще называют вершинами), причем они связаны друг с другом определенным образом, так что компьютер знает, между какими точками проводить линии или какие точки образуют поверхность.
В играх таких точек может быть тысячи и более. Всё зависит от размеров уровней.
Давайте представим себе мир, описанный сотнями тысяч вершин/полигонов. Скажем, вы используете вид от первого лица, которое смотрит сбоку на наш трехмерный мир. В поле зрения человека находится множество полигонов нашего мира, хотя огромное их количество просто не видно, поскольку другие объекты их закрывают.
Даже лучшие игровые видеокарты не могут обработать 300 000 треугольников на при сохранении 60+ fps. Карты просто не обладают такой мощью, поэтому нам нужно приложить некоторые усилия для отбрасывания полигонов, которые человек не видит, перед передачей сцены карте, проще говоря – провести оптимизацию.
Этот процесс называется отбрасыванием невидимых вершин и полигонов (culling).
Существует множество подходов к отбрасыванию ненужной геометрии. Один из часто встречающихся – это удаление объекта, если камера игрока на него не смотрит. То есть когда вы отворачиваетесь от объекта, он пропадает с уровня, но когда вы снова смотрите на него, то объект снова загружается на сцену. Такой подход экономит не только память видеокарты, но и оперативную память (ОЗУ) и снижает нагрузку на процессор (ЦПУ). Пример такой оптимизации можно увидеть в Assasins Creed Unity от Ubisoft.
Ещё также можно заменить текстуры высокого разрешения на более низкое с изменением модели объекта, чаще всего - это пиксильное разрешение, прозванное в народе «картошка» за характерный вид. Но такая оптимизация подходит для инди игр и средних проектов. Для ААА проэктов лучше использовать первый вариант.
Но почему же современные карты не могут отображать несколько миллионов полигонов в секунду? Ведь мы постоянно слышим сообщения об их увеличившейся мощности, неужели они не могут справиться с задачами такого рода? Во-первых, вам следует различать маркетинговое число полигонов и реальное число полигонов. Дело в том, что маркетинговое число полигонов отражает теоретическое значение, которое карта может отобразить.
К тому же маркетинговое число обычно высчитывается при условии, что все полигоны находятся на экране, они используют одну и ту же текстуру, они одинакового размера, при этом приложение ничем не занимается, кроме как отсылкой полигонов на карту. Реальное же число зависит от количества оперативной памяти и мощности процессора.
При этом на карту требуется отправить не только текстуры, но и данные для каждого полигона. Некоторые новые карты позволяют хранить данные о геометрии модели и мира внутри памяти самой карты, но такой подход слишком дорог с точки зрения занимаемого пространства, которое обычно отводится под текстуры. И чем больше разрешение этих текстур, тем больше они занимают видеопамять.
Освещаем мир
Когда освещение работает, вы его почти не замечаете. Но стоит только его убрать - вы сразу же это увидите. Существует несколько подходов к освещению, начиная от простого определения ориентации полигона к источнику света и добавления процента освещения на основе расстояния от полигона до источника, и заканчивая генерацией точных карт освещения для наложения на основные текстуры. А некоторые API имеют сразу несколько встроенных методов освещения. К примеру, OpenGL предлагает освещение по полигонам, по вершинами или по пикселям.
При вершинном освещении определяется, сколько полигонов касаются одной вершины, и затем вычисляется результирующая нормаль к данной вершине (по нормалям всех примыкающих полигонов). Каждая вершина для данного полигона будет иметь несколько отличающуюся нормаль, так что вы можете проградуировать или интерполировать освещение по полигону, что приведет к более точному освещению.
Преимущество такого подхода заключается в том, что «железо» может помочь выполнять освещение с помощью модуля аппаратной трансформации и освещения (T&L). Минусом является то, что при вершинном освещении не получается создавать тени.
Что касается вершинного затенения (его также называют затенением по Гуро) движок рендеринга будет закрашивать уже каждую вершину нужным цветом. При отрисовке пикселя полигона его цвет будет вычисляться с помощью интерполяции цветов вершин, на основе удаленности пикселя от вершин.
Более изощренный способ затенения - по Фонгу. В отличие от простой интерполяции цвета вершин для определения цвета пикселя, здесь для каждого пикселя выполняются те же вычисления, что делались раньше для каждой вершины. При затенении по Гуро вы должны были знать, как свет падает на каждую вершину. При затенении по Фонгу вы должны знать это уже для каждого пикселя.
Вывод. Конечно это не все технологии, использующееся в игровых движка. Ещё можно было упомянуть про захват движений, как работает код. Но эти темы очень трудны для понимания, но ещё сложнее объяснить их работу на понятном всем языке. К тому же не все, кто работают с такими технологиями способны полностью объяснить их работу.