Разработчик(и) | id Software (Джон Кармак, Джон Ромеро, Дэйв Тейлор) |
---|---|
Окончательный релиз | 1.9 / 1 февраля 1995 г ( 1995-02-01 ) |
Репозиторий | github.com/id-Software/DOOM |
Написано в | C , язык ассемблера |
Платформа | MS-DOS , PC-98 , Windows , Mac , Linux , Android , Amiga , NeXTSTEP , NeXT , Jaguar , 32X , PlayStation , 3DO , Nintendo 64 , Saturn , Game Boy Advance , Switch , BSD , Unix , другие |
Предшественник | Движок Wolfenstein 3D |
Преемник | Двигатель Quake |
Лицензия | GNU GPL-2.0 или более поздняя версия [1] 3DO : MIT [2] |
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 сортирует подсекторы в правильном порядке для рендеринга. Алгоритм довольно прост:
Процесс завершается, когда заполняется весь столбец пикселей (т.е. больше не остается пробелов). Такой порядок гарантирует, что время не тратится на отрисовку невидимых объектов, и в результате карты могут стать очень большими без потери скорости.
This section possibly contains original research. (February 2023) |
Все стены в 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 .
Год | Заголовок | Разработчик |
---|---|---|
1993 | Рок | id программное обеспечение |
1994 | Doom II: Ад на Земле | |
Еретик | Программное обеспечение Raven | |
1995 | Окончательная гибель | id программное обеспечение |
Мастер-уровни для Doom II | ||
Hexen: За пределами еретика | Программное обеспечение Raven | |
1996 | Окончательная гибель | КомандаTNT |
Еретик: Тень всадников на змеях | Программное обеспечение Raven | |
Hexen: Короли смерти Темной Цитадели | ||
Раздор: Поиски Символа | Разбойные развлечения |
В 1990-х годах несколько разработчиков приобрели лицензии на распространение полных версий Doom , и после публикации исходного кода в 1997 году на этом движке было создано несколько отдельных игр, включая бесплатные , фанатские и коммерческие. [14]
Год | Заголовок | Разработчик |
---|---|---|
1996 | Убивая время (ПК) | Logicware |
Чекс Квест | Цифровое кафе | |
1997 | Дум 64 | Midway Studios Сан-Диего |
Chex Quest 2: Флемоиды захватывают Хекстрополис | Цифровое кафе | |
ХакИкс | Банджо Программное обеспечение | |
2000 | Соник Робо Бласт 2 | Команда Соника Юниор |
2003 | Свобода | Команда Фридома |
2008 | Чекс Квест 3 | Чарльз Якоби |
Богохульник | Команда Богохульников | |
Действие Doom 2: Городская драка [15] | Скуба Стив | |
2009 | Гармония [16] | Томас ван дер Вельден |
2014 | Приключения Квадрата [17] | BigBrik Игры |
2016 | Клинок Агонии [18] | Дэниел Гиммер |
2017 | Восстание шерстяного клубка [19] | MSPaintR0cks |
2018 | РЕККР [20] | Пересмешник Softworks |
Энни [21] | SergeJkn | |
Пепел [22] | Восток | |
Полный хаос [23] | вадаголик | |
2019 | Фокус-покус, гибель [24] | Опустошение |
Гедон [25] | Zan_HedonDev | |
Святилище [26] | Подонок | |
2020 | Проект Осирис [27] | ArcturusDeluxe |
2021 | Castlevania: Судьба Саймона [28] | батанди |
Рвотная жидкость [29] | Подонок | |
2022 | Руки Некромантии [30] | Команда HON |
Отряд полиции моды [31] | Игры Mopeful | |
CountryCide [32] | TrenchWork | |
Проект «Отсутствие» [33] | Студии Вафельницы | |
Я Сакуя: Touhou FPS Game [ требуется ссылка ] | Команда Сигьяда | |
2023 | За закатом [34] | Metacorp / Vaporware |
Пожертвование [35] | Мекворкс | |
Рискованный [36] | ПиксельФокс | |
Апокалиптические вибрации [37] | Аманито Компьютинг | |
2024 | Руки Некромантии 2 [38] | Команда HON |
За закатом [39] | Metacorp / Vaporware | |
Селако [40] | Altered Orbit Studios |