Введение

Движок видеоигр, разработанный id Software

Движок Quake — это игровой движок, разработанный id Software для своей видеоигры Quake 1996 года. Он обеспечивал полноценный 3D-рендеринг в реальном времени. С 2012 года он распространяется под лицензией GNU General Public License v2.0 или более поздней версии. Сразу после выхода движок Quake породил множество ответвлений. Значительная часть движка была использована в Quake II и Quake III Arena. Как и движок Doom, движок Quake использовал бинарное разделение пространства (BSP) для оптимизации рендеринга игрового мира. В движке Quake также применялось затенение Гуро для движущихся объектов и статичная карта освещения для неподвижных объектов. Исторически движок Quake рассматривался как отдельный от своего преемника, движка Quake II. Хотя кодовые базы Quake и Quake II были выпущены отдельно под лицензией GPL, оба движка теперь считаются вариантами id Tech 2.

Сокращение 3D сложности для увеличения скорости

Quake была первой настоящей 3D-игрой, использовавшей специальную систему проектирования карт, которая предварительно обрабатывала и отрисовывала некоторые элементы 3D-окружения, чтобы снизить вычислительную нагрузку при игре на процессорах с частотой 50–75 МГц того времени. 3D-окружение, в котором происходит действие игры, называется картой, хотя по своей природе оно трёхмерно, а не плоское двухмерное пространство. Программа редактора карт использует ряд простых выпуклых 3D-геометрических объектов, известных как «кисти», которые масштабируются и вращаются для построения окружения. Кисти размещаются и ориентируются таким образом, чтобы создать замкнутое, пустое, объёмное пространство, и после завершения проектирования карта проходит через препроцессор рендеринга. Препроцессор используется для определения двух типов пустого пространства на карте: пустого пространства, окружённого кистями, где будет происходить игра, и другого пустого пространства за пределами кистей, которое игрок никогда не увидит. Затем препроцессор удаляет задние грани отдельных кистей, находящиеся за пределами игрового пространства, оставляя лишь несколько полигонов, определяющих внешний периметр замкнутого игрового пространства. Как правило, после предварительной обработки карту нельзя редактировать обычным способом, поскольку исходные кисти были разрезаны на мелкие фрагменты. Вместо этого исходные данные редактора карт с кистями сохраняются и используются для создания новых версий карты. Однако обработанную карту можно отредактировать, открыв её в специальном редакторе вершин и изменив исходные данные вершин, или добавив или удалив отдельные треугольные грани. Хотя это и сложно, этот приём иногда использовался читерами для создания окон в стенах, чтобы видеть обычно скрытых врагов, приближающихся из-за дверей и стен, что привело к появлению античит-механизма, используемого в современных 3D-играх, который вычисляет контрольную сумму для каждого файла, используемого в игре, для обнаружения игроков, использующих потенциально взломанные файлы карт. Обработанный файл карты может содержать значительно меньше полигонов, чем исходный необработанный файл карты, часто на 50–80%. На ПК с частотой 50–75 МГц в то время эта стадия оптимизации часто занимала много часов на карту, нередко работая всю ночь, если дизайн карты был чрезвычайно сложным. Этот этап предварительной обработки не может быть выполнен, если на карте есть небольшие отверстия или «утечки», соединяющие внутреннее игровое пространство с внешним пустым пространством, и было обычным явлением, что сложные проекты по созданию карт забрасывались, поскольку дизайнер карты не мог обнаружить утечки. Чтобы предотвратить утечки, кисти должны перекрывать и слегка проникать друг в друга; попытка идеально выровнять по краям необычно сформированных кистей на сетке может привести к образованию очень маленьких зазоров, которые трудно обнаружить. Современные редакторы уровней оснащены функцией обнаружения утечек, что решает эту проблему. Открытое небо на картах Quake на самом деле не открыто, а покрыто и заключено в большие кисти, и текстурировано специальной текстурой skybox, которая запрограммирована на использование сферического отображения, и таким образом всегда выглядит одинаково с любой точки обзора, создавая иллюзию далёкого неба.

Предварительный расчет освещения и теней

Quake также использовал световые карты и 3D источники света, в отличие от секторного статического освещения, применяемого в играх прошлых лет. Инновация id Software была использована во многих 3D-играх, выпущенных впоследствии, особенно в шутерах от первого лица, хотя id Software перешла к объединенной модели освещения и теней для Doom 3 (однако они вернулись к использованию световых карт или полусветовых карт, начиная с RAGE). После удаления из карты избыточных полигонов, вторая система предварительной обработки использовалась для предварительного вычисления и "запекания" световых карт непосредственно в игровую карту, чтобы еще больше снизить нагрузку на процессор во время игры. Однако полная обработка освещения могла занимать очень много времени, поэтому на начальном этапе проектирования карты можно было использовать менее качественную обработку света, но это приводило к появлению заметных ступенчатых теней вокруг источников света.

Разделение карты для увеличения скорости

Для дальнейшего снижения нагрузки на 3D-рендеринг был разработан механизм, позволяющий отсекать большие участки карты, которые в данный момент не видны игроку, чтобы движку не приходилось отрисовывать эти невидимые пространства. 3D-движок рендеринга без подобных оптимизаций должен отрисовывать каждую часть мира, а затем пытаться определить, какие полигоны находятся ближе всего, и скрывать все полигоны, расположенные за этими ближними полигонами (техника, известная как Z-буферизация). Тот факт, что полигон не виден, не означает, что он исключен из вычислений сцены. Движок Quake был оптимизирован специально для решения этой проблемы. Движку можно было заранее указать не вычислять рендеринг для всех объектов в пространстве, находящемся вне поля зрения игрока, что значительно снижало нагрузку на процессор. Этот эффект заметен в игре в виде небольших туннелей с резкими поворотами под углом 90 градусов, ведущих из одного большого пространства в другое. Такой туннель служит для перекрытия обзора в смежное нерендерируемое пространство, и в нём размещается специальный тип прозрачной кисти (называемой виспорталом), чтобы определить границу, за которой движок должен прекратить рендеринг смежного пространства. В оригинальном Quake редко можно увидеть всю длину карты целиком, а открытые пространства часто очень высокие и узкие, в основном использующие расстояние вверх к открытому небу или вниз к лаве, чтобы создать иллюзию обширности с помощью небольшого количества полигонов.

Как проводится секционирование

Дерево двоичного пространственного разбиения (BSP) строится на основе карты, упрощая сложность поиска заданного многоугольника до O(количество многоугольников). Каждый лист создает некоторую область в 3D-пространстве (представьте себе разрезание пирога на произвольные куски). К листьям этого бинарного дерева привязаны многоугольники исходной карты, которые затем используются для вычисления видимости каждой области. Для каждой области алгоритм VSD определяет части карты, для которых существует прямая видимость. Это называется потенциально видимым множеством (ПВС). Этот процесс требует значительного объема памяти, поскольку для хранения информации о видимости/невидимости необходимо (где – количество многоугольников) бит. Джон Кармак заметил, что одна область видит лишь небольшую часть других областей, поэтому он сжал эту информацию, используя кодирование длин серий (RLE). Это позволило так быстро отрисовывать сложную геометрию Quake на аппаратном обеспечении того времени.

Ускорение рендеринга и порядок рендеринга

Чтобы уменьшить перезапись (отрисовку нового пикселя, который скрывает ранее отрисованную точку, что означает, что предыдущая работа была бесполезной и потраченной впустую), окружение отрисовывалось сначала, спереди назад. Чтобы скрыть части стен, перекрытые другими стенами, Global Edge List сортировал рёбра уже отрисованных полигонов; новые полигоны сначала обрезались по предыдущим рёбрам, чтобы в буфер кадра попадали только видимые части. Также, при отрисовке окружения, буфер глубины (z-буфер) заполнялся, но не считывался, так как BSP-дерево и Global Edge List гарантировали, что каждый пиксель отрисовывается только один раз. Z-буфер позже использовался для корректной отрисовки персонажей и других движущихся объектов, частично скрытых окружением. Цикл отрисовки пикселей был реализован на ассемблере. Коррекция перспективных координат текстур и интерполяция выполнялись с использованием блока вычислений с плавающей точкой из-за ограниченного количества целочисленных регистров; это также позволяло вычислять дорогостоящую операцию деления (часть коррекции перспективы) на блоке вычислений с плавающей точкой параллельно с целочисленной интерполяцией (то есть, без дополнительных затрат). Базовая текстура и карта освещения стены отрисовывались одновременно: "кэш поверхностей" создавал новые поверхности – новые предварительно освещённые текстуры, объединяющие базовую текстуру и карту освещения, запечённые вместе. Поверхности, не использовавшиеся в течение нескольких кадров, освобождались, а новые необходимые поверхности создавались динамически. Генерация поверхностей занимала меньше времени, чем потребовал бы дополнительный проход освещения. Для экономии памяти, для дальних стен сначала генерировались меньшие поверхности, использующие мип-карты оригинальной текстуры. Персонажи освещались окружающим светом и фиксированным направленным светом, оба зависели от уровня освещённости точки на полу, где стоял персонаж. Близкие персонажи затенялись по Гуро и имели аффинную текстуру, в то время как далёкие персонажи отрисовывались с использованием триангуляционного подразделения.

Ускорение 3D

Quake была одной из первых игр, поддерживающих 3D-аппаратное ускорение. Изначально выпущенная только с программным рендерингом, Джон Кармак создал версию исполняемого файла Quake, использующую графический чип Vérité 1000 от Rendition (VQuake). Поддержка OpenGL была добавлена в виде исполняемого файла GLQuake для Windows 95 и более поздних версий. Другими видеокартами, способными работать с GLQuake, были профессиональные (и очень дорогие) карты Intergraph 3D OpenGL и, позднее, карты PowerVR. Для оптимизации программного рендеринга, световые карты использовались совместно для полигонов, расположенных близко друг к другу в пространстве и находящихся в одном листе BSP-дерева. Это означало, что полигоны, использующие одну и ту же основную текстуру, зачастую не могли быть отрисованы одновременно с использованием 3D-ускорения, поскольку второй текстурный блок требовал перенастройки для работы с другой световой картой. Это архитектурное решение снижало производительность рендеринга с аппаратным ускорением.

Сетевая игра

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

Моторы производные

21 декабря 1999 года Джон Кармак из id Software опубликовал исходный код движка Quake в интернете под лицензией GPL 2.0 или более поздней версии, что позволило программистам изменять движок и добавлять новые функции. Вскоре программисты стали выпускать новые версии движка в сеть. Некоторые из наиболее известных движков:

DarkPlaces Engine – Существенно модифицированный движок, используемый в нескольких самостоятельных играх и модах для Quake. Хотя последний стабильный релиз состоялся 13 мая 2014 года, с тех пор он получил множество обновлений через свой репозиторий SVN. До 2021 года его домашняя страница размещалась на Icculus.org, после чего движок перешел на репозиторий Git, размещенный на GitHub. Разработчики Xonotic предоставляют зеркала исходного кода DarkPlaces на различных платформах для совместной разработки кода, поскольку игра создана на основе и распространяется с версией движка, находящейся в разработке.

GoldSrc – Первый движок, созданный Valve. Он использовался в серии Half-Life и стал основой для движка Source.

vkQuake – (производный от Quakespasm) Использует API Vulkan для рендеринга, разработанный сотрудником id Software Акселем Гнайтингом и выпущенный под лицензией GPLv2.

Игры с использованием движка Quake

Год Название Разработчик(и) Издатель(и) 1996 Quake id Software GT Interactive 1997 Quake Mission Pack No. 1: Бич Армагона Hipnotic Interactive 3D Realms Quake Mission Pack No. 2: Dissolution of Eternity Rogue Entertainment 3D Realms Hexen II Raven Software id Software, Activision Malice Ratloop Quantum Axcess Shrak Quantum Axcess Quantum Axcess X-Men: Опустошение Апокалипсиса Zero Gravity Entertainment WizardWorks 1998 Hexen II Mission Pack: Портал Праевса Raven Software id SoftwareActivision 2000 Laser Arena Trainwreck Studios ValuSoft 2001 CIA Operative: Solo Missions Trainwreck Studios ValuSoft Urban Mercenary Moshpit Entertainment Moshpit Entertainment 2002 Eternal War: Shadows of Light Two Guys Software Two Guys Software 2005 Nexuiz Alientrap Alientrap 2011 Xonotic Team Xonotic Team Xonotic 2021 Doombringer Anomic Games Anomic Games 2023 Wrath: Aeon of Ruin Killpixel 3D Realms, 1C Entertainment Blood West Hyperstrange Hyperstrange

Инструменты для землетрясений

QuArK – Многоцелевой инструмент для игр на движке Quake. Trenchbroom 2.0 – Редактор карт для игр на движке Quake. PakExpl – Используется для открытия pak-файлов, содержащих модели, звуки и данные уровней Quake, а также файл progs.dat. fteqccgui – Используется для открытия файла progs.dat с целью редактирования quakec-файлов, управляющих поведением объектов. qME 3.1 – Финальная версия инструмента редактирования моделей Quake, позволяющая конвертировать традиционные 3D-модели в формат mdl для Quake. qPAK – Еще один инструмент для открытия архивов Quake pak. Поставляется в комплекте с qME.