id Tech 1 , также известный как движок Doom , — игровой движок, используемый в видеоиграх Doom и Doom II: Hell on Earth компании id Software . Он также используется в Heretic , Hexen: Beyond Heretic , Strife: Quest for the Sigil , Hacx: Twitch 'n Kill , Freedoom и других играх, выпущенных лицензиатами. Он был создан Джоном Кармаком , со вспомогательными функциями, написанными Майком Абрашем , Джоном Ромеро , Дэйвом Тейлором и Полом Радеком. Первоначально разработанный на компьютерах NeXT [3] , он был портирован на MS-DOS и совместимые операционные системы для первоначального выпуска Doom , а затем был портирован на несколько игровых консолей и операционных систем .
Исходный код Linux - версии Doom был выпущен для публики по лицензии, предоставляющей права на некоммерческое использование, 23 декабря 1997 года, а затем, примерно через неделю, 29 декабря 1997 года , вышла Linux-версия Doom II. [4] [5] Исходный код был позднее переиздан по лицензии GNU General Public License v2.0 или более поздней версии, 3 октября 1999 года. [6] [7] Десятки неофициальных исходных портов Doom , созданных с тех пор, позволяют Doom работать на ранее неподдерживаемых операционных системах и иногда радикально расширяют функциональность движка новыми функциями.
Хотя движок визуализирует трехмерное пространство, это пространство проецируется с двухмерного плана этажа . Линия взгляда всегда параллельна полу, стены должны быть перпендикулярны полу, и невозможно создавать многоуровневые структуры или наклонные области (полы и потолки с разными углами). Несмотря на эти ограничения, движок представлял собой технологический скачок по сравнению с предыдущим движком Wolfenstein 3D от id . Движок Doom позже был переименован [ требуется ссылка ] в «id Tech 1», чтобы отнести его к длинной линейке игровых движков id Software . [8]
Движок Doom отделяет рендеринг от остальной части игры. Графический движок работает так быстро, как это возможно, но игровой мир работает со скоростью 35 кадров в секунду независимо от оборудования, поэтому несколько игроков могут играть друг против друга, используя компьютеры разной производительности. [9]
Простая схема, демонстрирующая, как Doom представляет уровни изнутри
Если смотреть сверху вниз, все уровни Doom на самом деле двумерны, демонстрируя одно из ключевых ограничений движка Doom : невозможность «комнаты над комнатами ». Однако это ограничение имеет и положительную сторону: можно легко отобразить «режим карты», который представляет стены и положение игрока, как на первом изображении справа.
Базовой единицей является вершина , которая представляет собой одну 2D-точку. Вершины (или «вершины», как их называют внутри) затем соединяются в линии , известные как «linedefs». Каждая linedef может иметь одну или две стороны, известные как «sidedefs». Sidedefs затем группируются вместе, образуя многоугольники ; они называются «секторами». Секторы представляют собой определенные области уровня.
Каждый сектор содержит ряд свойств: высоту пола, высоту потолка, уровень освещенности, текстуру пола и текстуру потолка. Например, чтобы иметь другой уровень освещенности в определенной области, для этой области должен быть создан новый сектор с другим уровнем освещенности. Таким образом, односторонние linedefs представляют собой сплошные стены, а двусторонние linedefs представляют собой линии мостов между секторами.
Sidedef используются для хранения текстур стен ; они полностью отделены от текстур пола и потолка. Каждый sidedef может иметь три текстуры; они называются средней, верхней и нижней текстурами. В односторонних linedef для текстуры на стене используется только средняя текстура. В двусторонних linedef ситуация более сложная. Нижняя и верхняя текстуры используются для заполнения промежутков, где смежные сектора имеют разную высоту пола и потолка: нижние текстуры используются для ступенек, например. Sidedef также могут иметь среднюю текстуру, хотя большинство ее не имеют; это используется для того, чтобы текстуры висели в воздухе. Например, когда прозрачная текстура бруска образует клетку, это пример средней текстуры на двустороннем linedef.
Doom использует систему, известную как двоичное разбиение пространства (BSP). [10] Инструмент используется для предварительной генерации данных BSP для уровня. Этот процесс может занять довольно много времени для большого уровня. Именно из-за этого невозможно двигать стены в Doom ; в то время как двери и лифты движутся вверх и вниз, ни один из них никогда не движется вбок.
Уровень разделен на двоичное дерево : каждое местоположение в дереве является «узлом», который представляет определенную область уровня (при этом корневой узел представляет весь уровень). На каждой ветви дерева есть разделительная линия, которая делит область узла на два подузла. В то же время разделительная линия делит linedefs на сегменты линий, называемые «segs». [11]
На листьях дерева находятся выпуклые многоугольники , где дальнейшее разделение уровня не требуется. Эти выпуклые многоугольники называются подсекторами (или «SSECTORS») и привязаны к определенному сектору. Каждый подсектор имеет список сегментов, связанных с ним. [10]
Система BSP сортирует подсекторы в правильном порядке для рендеринга. Алгоритм довольно прост:
Процесс завершается, когда заполняется весь столбец пикселей (т.е. больше не остается пробелов). Такой порядок гарантирует, что время не тратится на отрисовку невидимых объектов, и в результате карты могут стать очень большими без потери скорости.
Все стены в Doom нарисованы вертикально; именно из-за этого невозможно правильно смотреть вверх и вниз. Можно выполнить вид взгляда вверх/вниз с помощью "y-shearing", и многие современные исходные порты Doom делают это, а также более поздние игры, использующие движок, такие как Heretic . По сути, это работает путем перемещения линии горизонта вверх и вниз в пределах экрана, по сути, предоставляя "окно" на более высокой видимой области. Перемещая окно вверх и вниз, можно создать иллюзию взгляда вверх и вниз. Однако это исказит вид, чем дальше вверх и вниз смотрит игрок.
Движок Doom визуализирует стены по мере обхода дерева BSP, рисуя подсекторы в порядке расстояния от камеры, так что ближайшие сегменты рисуются первыми. По мере того, как сегменты рисуются, они сохраняются в связанном списке. Это используется для обрезки других сегментов, визуализируемых позже, что снижает перерисовку. Это также используется позже для обрезки краев спрайтов.
Как только движок достигает сплошной (односторонней) стены в определенной координате x, больше не нужно рисовать линии в этой области. Для отсечения движок сохраняет «карту» областей экрана, где были достигнуты сплошные стены. Это позволяет полностью отсечь далекие части уровня, которые невидимы игроку.
Графический формат Doom хранит текстуры стен в виде наборов вертикальных столбцов ; это полезно для рендерера, который по сути рендерит стены, рисуя множество вертикальных столбцов текстур.
Система рисования полов и потолков («квартир») менее элегантна [ по мнению кого? ], чем та, что используется для стен. Квартиры рисуются с помощью алгоритма заливки . Из-за этого, если используется плохой конструктор BSP, иногда можно получить «дыры», где пол или потолок просачиваются к краям экрана, визуальная ошибка, обычно называемая «слизневым следом». [13] Это также причина, по которой, если игрок выходит за пределы уровня, используя чит noclip, полы и потолки будут казаться растянутыми от уровня по пустому пространству.
Пол и потолок рисуются как «visplanes». Они представляют собой горизонтальные прогоны текстуры от пола или потолка на определенной высоте, уровне освещенности и текстуре (если два соседних сектора имеют абсолютно одинаковый пол, их можно объединить в одну visplane). Каждая позиция x в visplane имеет определенную вертикальную линию текстуры, которая должна быть нарисована.
Из-за этого ограничения на рисование одной вертикальной линии в каждой позиции x иногда необходимо разбить visplanes на несколько visplanes. Например, рассмотрим просмотр пола с двумя концентрическими квадратами. Внутренний квадрат вертикально разделит окружающий пол. В том горизонтальном диапазоне, где рисуется внутренний квадрат, для окружающего пола необходимы две visplanes.
Doom содержал статический лимит на количество visplanes; при его превышении возникало «переполнение visplane», из-за чего игра выходила в DOS с одной из двух ошибок: «Больше нет visplanes!» или «переполнение visplane (128 или выше)». Самый простой способ вызвать лимит visplane — это большой шахматный узор пола; это создает большое количество visplanes.
По мере рендеринга сегментов также добавляются visplanes, простирающиеся от краев сегментов к вертикальным краям экрана. Они простираются до тех пор, пока не достигнут существующих visplanes. Из-за того, как это работает, система зависит от того, что сегменты рендерятся по порядку общим движком; необходимо сначала нарисовать более близкие visplanes, чтобы их можно было «отрезать» другими, более удаленными. Если их не остановить, пол или потолок «просочится» к краям экрана, как описано ранее. В конце концов, visplanes образуют «карту» определенных областей экрана, на которых можно рисовать определенные текстуры.
В то время как visplanes по сути строятся из вертикальных «полос», реальный низкоуровневый рендеринг выполняется в виде горизонтальных «пролетов» текстуры. После того, как все visplanes построены, они преобразуются в пролеты, которые затем визуализируются на экране. Это, по-видимому, компромисс: проще построить visplanes как вертикальные полосы, но из-за природы того, как выглядят текстуры пола и потолка, проще рисовать их как горизонтальные полосы.
Каждый сектор на уровне имеет связанный список вещей, хранящихся в этом секторе. По мере рисования каждого сектора спрайты помещаются в список спрайтов для рисования. Если они не находятся в поле зрения, они игнорируются.
Края спрайтов обрезаются путем проверки списка ранее нарисованных сегментов. Спрайты в Doom хранятся в том же столбчатом формате, что и стены, что опять же полезно для рендерера. Те же функции, которые используются для рисования стен, используются и для рисования спрайтов.
Хотя подсекторы гарантированно упорядочены, спрайты внутри них — нет. Doom хранит список спрайтов для отрисовки («висспрайты») и сортирует список перед рендерингом. Далекие спрайты отрисовываются раньше близких. Это приводит к некоторой перерисовке, но обычно она незначительна.
Есть последняя проблема средних текстур на 2-сторонних линиях, используемых, например, в прозрачных барах. Они смешиваются и рисуются со спрайтами в конце процесса рендеринга, а не с другими стенами.
Движок Doom получил наибольшую известность в результате работы над классическим шутером от первого лица Doom , а также использовался в нескольких других играх. Обычно считается, что «большая четверка» игр на движке Doom — это Doom , Heretic , Hexen: Beyond Heretic и Strife: Quest for the Sigil .
В 1990-х годах несколько разработчиков приобрели лицензии на распространение полных версий Doom , и после публикации исходного кода в 1997 году на этом движке было создано несколько отдельных игр, включая бесплатные , фанатские и коммерческие. [14]