Введение
1993 игровой движок
id Tech 1, также известный как движок Doom, — игровой движок, используемый в видеоиграх id Software Doom и Doom II: Hell on Earth. Он также применяется в Heretic, Hexen: Beyond Heretic, Strife: Quest for the Sigil, Hacx: Twitch 'n Kill, Freedoom и других играх, созданных по лицензии. Движок был разработан Джоном Кармаком, при участии Майка Абраша, Джона Ромеро, Дэйва Тейлора и Пола Радека. Изначально разработанный для компьютеров NeXT, он был портирован на MS-DOS и совместимые операционные системы к первоначальному релизу Doom, а затем и на ряд игровых консолей и операционных систем. Исходный код версии Doom для Linux был опубликован 23 декабря 1997 года под лицензией, предоставляющей права на некоммерческое использование, а примерно через неделю, 29 декабря 1997 года, была опубликована версия Doom II для Linux. Позже исходный код был перевыпущен под лицензией GNU General Public License v2.0 или более поздней версии 3 октября 1999 года. Десятки неофициальных портов исходного кода Doom, созданных с тех пор, позволяют запускать Doom на ранее неподдерживаемых операционных системах и иногда значительно расширяют функциональность движка, добавляя новые возможности. Хотя движок отображает трехмерное пространство, оно проецируется из двухмерного плана. Линия обзора всегда параллельна полу, стены должны быть перпендикулярны полу, и невозможно создавать многоуровневые структуры или наклонные поверхности (полы и потолки с разными углами). Несмотря на эти ограничения, движок стал значительным технологическим прорывом по сравнению с предыдущим движком Wolfenstein 3D. Позднее движок Doom был переименован в "id Tech 1" для классификации в списке игровых движков id Software.
Игровая вселенная
Движок Doom отделяет отрисовку от остальной части игры. Графический движок работает настолько быстро, насколько это возможно, но игровой мир работает с частотой 35 кадров в секунду, независимо от мощности компьютера, чтобы несколько игроков могли играть друг против друга на компьютерах с разными характеристиками.
Основные объекты
Базовой единицей является вершина, представляющая собой одну 2D точку. Вершины (или "вертексы", как они называются внутри) затем соединяются для формирования линий, известных как "linedefs". Каждая линия защиты может иметь одну или две стороны, известные как "sidedefs". Sidedefs затем группируются вместе для формирования многоугольников; они называются "секторами". Секторы представляют собой определенные области уровня.
Секторы
Каждый сектор содержит ряд свойств: высоту пола, высоту потолка, уровень освещения, текстуру пола и текстуру потолка. Чтобы получить другой уровень освещения в определенной области, например, необходимо создать новый сектор для этой области с другим уровнем освещения. Односторонние лайнедефы, таким образом, представляют собой сплошные стены, а двусторонние лайнедефы – линии-мосты между секторами.
Примечания
Сидефы используются для хранения текстур стен; они полностью отделены от текстур пола и потолка. Каждый сидеф может содержать три текстуры: среднюю, верхнюю и нижнюю. В односторонних лайнах для текстуры стены используется только средняя текстура. В двухсторонних лайнах ситуация сложнее. Нижняя и верхняя текстуры используются для заполнения зазоров, возникающих, когда соседние секторы имеют разную высоту пола и потолка: нижние текстуры используются, например, для ступеней. Сидефы могут иметь и среднюю текстуру, хотя большинство из них не имеют её; она используется для создания эффекта "висящих в воздухе" текстур. Например, когда прозрачная полоса текстуры видна, образуя клетку, это пример использования средней текстуры в двухстороннем лайне.
Разделение бинарного пространства
Doom использует систему, известную как бинарное разделение пространства (BSP). Для предварительного создания данных BSP уровня используется специальный инструмент. Этот процесс может занимать значительное время для больших уровней. Именно поэтому в Doom невозможно перемещать стены; хотя двери и лифты двигаются вверх и вниз, ни одна из них не может двигаться в стороны. Уровень разделяется на двоичное дерево: каждое положение в дереве является "узлом", представляющим определенную область уровня (при этом корневой узел представляет весь уровень целиком). На каждой ветви дерева находится разделительная линия, которая делит область узла на два дочерних узла. Одновременно с этим, разделительная линия разделяет линейные дефы на сегменты, называемые "сегами". На листьях дерева находятся выпуклые многоугольники, дальнейшее разделение которых не требуется. Эти выпуклые многоугольники называются подсекторами (или "SSECTORами") и привязаны к определенному сектору. Каждый подсектор имеет связанный с ним список сегов. Процесс завершается, когда вся область пикселей заполнена (то есть, не остается незаполненных областей). Такая организация обеспечивает отсутствие затрат времени на отрисовку невидимых объектов, и в результате карты могут быть очень большими без снижения производительности.
Рисуем стены
Все стены в Doom отрисованы вертикально, поэтому нормально смотреть вверх и вниз невозможно. Возможно реализовать подобие обзора вверх/вниз с помощью "y shearing", и многие современные порты Doom это делают, а также более поздние игры, использующие этот движок, например, Heretic. По сути, это работает путем перемещения линии горизонта вверх и вниз по экрану, создавая эффект "окна" в более широкую видимую область. Перемещая это "окно", можно создать иллюзию обзора вверх и вниз. Однако, чем дальше игрок смотрит вверх или вниз, тем сильнее искажается изображение. Движок Doom отрисовывает стены, проходя по BSP-дереву, рисуя подсекторы в порядке удаления от камеры, так что ближайшие сегменты отрисовываются первыми. По мере отрисовки сегменты сохраняются в связанном списке. Это используется для отсечения других сегментов, отрисованных позже, что уменьшает перезапись. Это также используется для отсечения краев спрайтов. Как только движок достигает сплошной (односторонней) стены по определенной координате X, дальнейшая отрисовка линий в этой области не требуется. Для отсечения движок хранит "карту" областей экрана, где были достигнуты сплошные стены. Это позволяет полностью отсекать удаленные части уровня, невидимые игроку. Графический формат Doom хранит текстуры стен в виде наборов вертикальных столбцов, что удобно для рендерера, который по сути отрисовывает стены, рисуя множество вертикальных столбцов текстур.
Пол и потолок
Система для рисования полов и потолков ("площадок") менее элегантна, чем система, используемая для стен. Площадки рисуются с помощью алгоритма, подобного заполнению областей. Из-за этого, если используется некачественный построитель BSP, иногда могут возникать "дыры", где пол или потолок "протекают" к краям экрана – визуальная ошибка, обычно называемая "слизистым следом". Это также объясняет, почему, если игрок выходит за пределы уровня с помощью чит-кода noclip, полы и потолки кажутся растянутыми от уровня в пустое пространство. Пол и потолок рисуются в виде "визпланов". Они представляют собой горизонтальные полосы текстур, соответствующие полу или потолку на определенной высоте, уровне освещенности и текстуре (если два соседних сектора имеют одинаковый пол, они могут быть объединены в один визплан). Каждая x-координата в визплане соответствует определенной вертикальной линии текстуры, которую необходимо отрисовать. Из-за этого ограничения на отрисовку одной вертикальной линии в каждой x-координате, иногда необходимо разбивать визпланы на несколько. Например, представьте пол с двумя концентрическими квадратами. Внутренний квадрат будет вертикально разделять окружающий пол. В горизонтальном диапазоне, где рисуется внутренний квадрат, для окружающего пола потребуется два визплана. Это приводит к одному из классических ограничений Doom, которое долгое время разочаровывало многих картографов. В Doom существовал статический лимит на количество визпланов; при его превышении происходило "переполнение визпланов", в результате чего игра завершалась и возвращалась в DOS с одним из двух сообщений: "Больше нет визпланов!" или "Переполнение визпланов (128 или выше)". Самый простой способ вызвать ограничение визпланов – использовать большую шахматную текстуру пола; она создает большое количество визпланов. По мере отрисовки сегментов добавляются визпланы, простирающиеся от их краев к вертикальным краям экрана. Они продолжаются до тех пор, пока не достигнут существующих визпланов. Из-за этого принципа работы система зависит от порядка отрисовки сегментов движком; сначала необходимо отрисовать ближние визпланы, чтобы они могли "отсекать" более дальние. Если этого не сделать, пол или потолок будут "вытекать" к краям экрана, как описано выше. В конечном итоге визпланы формируют "карту" определенных областей экрана, в которых нужно отрисовать определенные текстуры. Хотя визпланы по сути строятся из вертикальных "полос", фактическая отрисовка на низком уровне выполняется в виде горизонтальных "сегментов" текстуры. После построения всех визпланов они преобразуются в сегменты, которые затем отрисовываются на экране. Похоже, это компромисс: проще строить визпланы как вертикальные полосы, но из-за особенностей отображения текстур пола и потолка проще отрисовывать их как горизонтальные полосы.
Вещи (приты)
Каждый сектор уровня содержит связный список объектов, хранящихся в этом секторе. По мере отрисовки каждого сектора спрайты помещаются в список спрайтов для отрисовки. Если спрайт не попадает в поле зрения, он игнорируется. Обрезка краёв спрайтов выполняется путем проверки списка ранее отрисованных сегментов. Спрайты в Doom хранятся в том же столбчатом формате, что и стены, что опять же полезно для рендерера. Для отрисовки спрайтов используются те же функции, что и для отрисовки стен. Хотя подсекторы гарантированно упорядочены, спрайты внутри них – нет. Doom хранит список спрайтов для отрисовки ("vissprites") и сортирует этот список перед рендерингом. Спрайты, находящиеся дальше, отрисовываются раньше спрайтов, находящихся ближе. Это может вызывать небольшую перезапись, но обычно она незначительна. Остается еще один вопрос – средние текстуры на двухсторонних линиях, используемые, например, в прозрачных перекладинах. Они смешиваются и отрисовываются вместе со спрайтами в конце процесса рендеринга, а не с остальными стенами.
Игры с использованием движка Doom
Движок Doom получил основную известность благодаря использованию в классическом шутере от первого лица Doom, и был применен в ряде других игр. Общепринято считать, что в "Большую четвёрку" игр на движке Doom входят Doom, Heretic, Hexen: Beyond Heretic и Strife: Quest for the Sigil.