Геймдев
#статьи

Что такое псевдотрёхмерность — и как её создавали в Doom, Duke Nukem 3D и других играх

Разбираем техники манипуляций с плоскостями в популярных шутерах 1990-х годов.

Иллюстрация: Катя Павловская для Skillbox Media

Пожалуй, одним из самых запоминающихся моментов в индустрии видеоигр 1990-х годов стало появление шутеров от первого лица. В те времена профильные медиа обозначали этот жанр довольно абстрактно — 3D-action. И хотя приписка «3D» подразумевала наличие трёхмерного пространства, на самом деле перспектива в этих играх была основана на хитрых манипуляциях с плоскостями.

У каждой технологии, в то время находившейся в руках разработчиков, был свой подход к воссозданию псевдотрёхмерных миров. Некоторые из этих технологий до сих становятся основой для различных проектов. Но как создавали подобные «псевдо-3D»-миры, чтобы они казались убедительными? Рассказываем об этом в новой статье редакции «Геймдев» Skillbox Media.

Из этого материала вы узнаете:

  • как выглядел прародитель шутеров от первого лица задолго до появления хитов от id Software и при чём тут агентство НАСА;
  • первые 3D-action, использующие технологию рейкастинга;
  • как Джон Кармак оптимизировал псевдотрёхмерную графику в Wolfenstein 3D;
  • разбор понятия BSP — нового подхода к созданию иллюзии 3D и его применение в Doom;
  • почему движок Build Engine от Кена Сильвермана был более модульным по сравнению с id Tech 1;
  • дальнейшее развитие «псевдо-3D».

Doom — 30 лет! Читайте наш большой спецпроект, приуроченный к юбилею важнейшего шутера в игровой индустрии.

В этом спецпроекте — масса крутой информации о разработке всех игр серии, о феномене первой Doom и о том, как она изменила геймдев, о людях, которые работали на франшизой, и культурных явлениях, которые окружали в момент выхода каждую из частей.

Воксельный предшественник

Удивительно, но первый прототип шутера от первого лица был создан ещё полвека назад, в 1973 году. Группа студентов из исследовательского центра Эймса, входящего в состав агентства НАСА, разработала игру Maze (также известна как Maze War) для систем графического отображения Imlac PDS-1.

В Maze иллюзия перспективы от первого лица создавалась следующим образом. Игрок пошагово блуждал по лабиринту, состоящему из примитивной кубической сетки, и атаковал других игроков, которые отображались в виде символов с уникальным ID. В противников можно было стрелять и получать очки за их устранение. Идея создания подобного лабиринта принадлежит Стиву Колли, который в то время работал над приложением для визуализации 3D-кубов на Imlac.

Секрет иллюзии трёхмерности Maze War был прост. В отличие от других мини-компьютеров того времени монитор Imlac PDS-1 поддерживал векторную графику. Сам лабиринт фактически был плоским и состоял только из кубов, а игрок мог перемещаться по нему только по прямой траектории. Картинка менялась один раз за ход. И хотя сам игровой процесс выглядел довольно абстрактно, фактически это был первый экшен с имитацией 3D-пространства и поддержкой мультиплеера.

В дальнейшем подобный подход к векторной графике встречался в симуляторе Spasim (1974), а позже — и в Battlezone (1980), успех которой вдохновил многих разработчиков на производство похожих аркад.

Скриншот: игра Battlezone (1980) / Atari

Первые игры в «псевдо-3D»

В 1987 году студия Xanth Software выпустила шутер MIDI Maze. Стиль игры был довольно минималистичным: в пространстве с однотонными стенами под синим небом шли перестрелки между большими смайлами. Но вид от первого лица в псевдотрёхмерной перспективе для того времени был инновационным, не говоря уже о том, что в MIDI Maze был доступен сетевой режим на 16 игроков — всё это задолго до появления Doom и режима Deathmatch.

За разработку графики в MIDI Maze отвечал Майкл Парк, который в то время создавал зрелищные технические демо для компьютера Atari ST. Сама MIDI Maze стала более известной после выпуска портированных версий шутера под новым названием — Faceball 2000.

Скриншот: игра MIDI Maze / Xanth Software

Псевдотрёхмерность MIDI Maze основана на методе рейкастинга. Под ним подразумевают технику компьютерного рендеринга, которая активно применялась при визуализации плоскостей. Суть метода заключается в следующем:

  • весь уровень представлен в виде статичной 2D-сетки;
  • с позиции игрока отбрасываются лучи, которые отрисовывают содержимое сцены в поле зрения игрока;
  • высота стен рассчитывается за счёт деления масштабного коэффициента на расстояние от точки обзора до точки столкновения луча со стеной.

Метод рейкастинга обеспечивает отрисовку даже сложных сцен, где стены (всегда расположенные под углом 90°) находятся на разном расстоянии от персонажа. Более подробно этот процесс разобран чуть ниже в главе, посвящённой Wolfenstein 3D.

Метод рейкастинга стал очень востребованным на слабых системах, так как поддерживал рендеринг графики на ПК, где все приложения запускались в software-режиме. По сравнению с упомянутым ранее векторным лабиринтом из Maze War, перемещение в MIDI Maze было гораздо быстрее, но из-за недостатка оптимизации игре не хватало скорости, свойственной шутерам.

Эту проблему несколько лет спустя решил Джон Кармак, уже работая в id Software. Оказалось, что создать быструю игру от первого лица, даже с учётом псевдотрёхмерности, было совсем не просто.

«Проблема, как он понимал, была в том, что компьютеру не хватало для неё мощности. Кармак прочитал все доступные материалы, но не нашёл ничего полезного. Он решил действовать по аналогии с Commander Keen: сначала пойти по очевидному пути, и, если не сработает, думать, как исхитриться. Одной из причин низкой скорости трёхмерных игр было то, что компьютеру приходилось рисовать слишком много поверхностей одновременно. Почему бы, подумал Кармак, не сузить область видимости: образно выражаясь, надеть на игрока шоры, чтобы уменьшить область требуемой прорисовки и рисовать только по несколько поверхностей за раз? Он написал программу, которая могла рисовать только один вид поверхностей — боковые трапеции; так можно было изображать стены, но нельзя — пол и потолок. <…>

Вместо того чтобы рисовать большие пласты графики целиком, что занимало много времени и памяти, с помощью рейкастинга можно было разбить их на тонкие вертикальные полосы (далее в материале они будут называться столбцами. — Авт.) и отображать на экране только те, что игрок видит в данный момент. Всё ради скорости.

Последняя сложность — добавить в трёхмерный мир персонажей. Для этого Кармак решил использовать спрайты — обычные плоские рисунки вполне годились. <…> Масштабируемые спрайты, трапеции и рейкастинг — вот быстрый трёхмерный мир и готов».

Отрывок из книги Дэвида Кушнера
«Повелители Doom», стр. 138–139

В результате всех этих манипуляций в апреле 1991 года id Software выпустила свой первый шутер Hovertank 3D. Несмотря на приписку 3D, игра использовала всё тот же метод рейкастинга и демонстрировала лишь иллюзию трёхмерной среды, как и ранее MIDI Maze. Забегая вперёд, стоит отметить, что полноценная 3D-графика, включающая статические и динамические полигональные объекты, появилась уже в 1995 году в игре жанра shoot ’em up от первого лица — Descent. В ней пилот космического корабля летал по узким коридорам и уничтожал враждебных роботов. Чуть позже, в 1996-м, вышла трёхмерная Quake, которая поддерживала более сложную архитектуру уровней и открытые пространства.

Так как ранее id Software делала лишь 2D-платформеры, новый шутер казался довольно инновационным по сравнению с той же Commander Keen. Но в «Повелителях Doom» отмечалось, что, хоть в Hovertank 3D и прослеживался авторский почерк коллектива id Software, который делал её «мрачной и зловещей», сама игра «была довольно уродливой — особенно её большие стены, залитые сплошным цветом…». Это объяснялось тем, что Кармак просто отвечал за программирование и не следил за тенденциями в компьютерной графике.

Скриншот: игра Hovertank 3D / id Software

Очередным нововведением в следующем проекте id Software стало совмещение рейкастинга с наложением текстур. Об этой технике узнал Джон Ромеро из телефонного разговора с Полом Ньюратом, который работал в компании Blue Sky Productions и участвовал в разработке ролевой игры от первого лица Ultima Underworld: The Stygian Abyss.

Перемещение в мире Ultima Underworld осуществлялось с помощью point-and-click-управления: удерживая стрелку кнопкой мыши, игрок мог двигаться вперёд-назад по уровню или осматриваться вокруг себя.

Скриншот: игра Ultima Underworld: The Stygian Abyss / Blue Sky Productions

Использование текстурных карт значительно усиливало эффект присутствия в подземелье. Узнав о новой технологической наработке, id Software добавила её в новый фэнтези-шутер Catacomb 3-D: The Descent, вышедший в 1992 году. Вместо однотонных плоскостей в игре появились стены с разнообразными текстурами — от кирпичей, покрытых зелёной субстанцией, до поверхностей, отдалённо напоминающих лавовые пещеры.

Скриншот: игра Catacomb 3-D: The Descent / id Software

И хотя релиз Catacomb 3-D: The Descent состоялся раньше, чем Ultima Underworld, последняя стала более успешной благодаря медийности издательства Origin под руководством известного предпринимателя и программиста Ричарда Гэрриота. Но нельзя отрицать, что обе игры доказали большой потенциал псевдотрёхмерности. Оставалось только его раскрыть, что и сделала id Software в Wolfenstein 3D — игре, которая стала первым по-настоящему брутальным и динамичным шутером.

Отображение плоскостей в Wolfenstein 3D

Взяв за основу технические данные из книги Game Engine Black Book Wolfenstein 3D, написанной программистом Фабьеном Сангларом, рассмотрим, как работала перспектива от первого лица в Wolfenstein 3D.

Как уже неоднократно упоминалось ранее, технология рендеринга игр того времени была основана на рейкастинге, и графика Wolfenstein 3D — не исключение.

Отбрасывание 320 лучей (по одному на каждый столбец) в рамках разрешения 320×200
Инфографика: Fabien Sanglard. Game Engine Black Book Wolfenstein 3D. 2022
А так выглядят 320 отрисованных столбцов, включая текстуры, в самой игре
Скриншот: игра Wolfenstein 3D / id Software

Процесс рендеринга «псевдо-3D»-сцены происходил следующим образом.

Сначала производилась очистка кадрового буфера, в результате которой на экране отображался пол и потолок (оба сплошного цвета).

Скриншот: игра Wolfenstein 3D / id Software

Направленный от игрока луч сталкивался с ближайшей преградой в виде прямой линии на двухмерной карте. После этого начиналась отрисовка столбцов стен, высота которых обратно пропорциональна расстоянию: чем больше расстояние луча, тем ниже высота будущей плоскости.

Поэтапная отрисовка стен и двери
Изображение: игра Wolfenstein 3D / id Software

Отрисовка спрайтов (враги, лампы, бочки и так далее).

Скриншот: игра Wolfenstein 3D / id Software

Отрисовка оружия главного героя.

Скриншот: игра Wolfenstein 3D / id Software

В конце происходило переключение кадровых буферов — использование только что созданного кадрового буфера во время следующей вертикальной синхронизации.

Чтобы луч мог быстро и безошибочно определить углы поверхности, карта в Wolfenstein 3D поделена на сетку, состоящую из ячеек 8×8×8. Процесс рейкастинга запускался, когда луч сталкивался с гранью ближайшей ячейки.

Такой подход значительно сокращал количество возможных координат для столкновения луча со стеной, из-за этого дизайн уровней Wolfenstein 3D стал довольно минималистичным. В основном все карты состояли из прямоугольных комнат и лабиринтов. Тем не менее визуализация плоскостей была максимально точной и быстрой. За счёт этого игра избавилась от визуальных недочётов при отрисовке, которые встречались в Hovertank 3D и Catacomb 3-D и выбивали игрока из погружения. К тому же для Джона Кармака было важно, чтобы Wolfenstein 3D и все последующие игры id Software считались «надёжными, как скала».

Отдельно стоит упомянуть дополнительные элементы уровней. Несмотря на то, что двери в Wolfenstein 3D — это подвижный объект, технически они относились к такому же типу плоскостей, что и стены. Во время рейкастинга дверным плоскостям прописывалось значение расстояния, пройденного лучом. Если дверь была открытой или частично открытой, то луч проходил сквозь дверь.

Кадр в момент частично открывающейся двери и схема отсечения лучей во время этого процесса
Изображение: игра Wolfenstein 3D / id Software / Fabien Sanglard. Game Engine Black Book Wolfenstein 3D. 2022

Секретные стены, которые отодвигались в Wolfenstein 3D при нажатии, также обозначались специальной меткой в коде. При активации стены во время рейкастинга происходило смещение координат луча, и игрок видел, как плоскость сдвигается вперёд.

Что касается спрайтов окружения, они были такого же размера, как и стены (64×64 текселя), и масштабировались на экране по аналогичному принципу. Но за счёт прозрачного слоя они визуально казались ниже стен и гармонично вписывались в перспективу.

Спрайты врагов по отношению к общей перспективе
Изображение: игра Wolfenstein 3D / id Software / Fabien Sanglard. Game Engine Black Book Wolfenstein 3D. 2022

Коллизия в Wolfenstein 3D сделана довольно просто: все тайлы плоскостей 64×64 имели два статуса — либо сквозь них можно было пройти, либо нет. Двери меняли свойства, когда процесс открытия/закрытия завершался.

Иллюзия 3D с помощью спрайтов

Практически одновременно с Wolfenstein 3D вышел японский аркадный шутер Gun Buster (1992) от студии Taito. Разработчики этой игры использовали другой подход к имитации 3D-пространства за счёт техники масштабирования спрайтов. Каждый объект — стена, враг или элемент окружения — технически был спрайтом. Плоские картинки менялись в зависимости от расстояния и угла обзора игрока, что в совокупности создавало более реалистичный эффект присутствия.

На видео выше можно увидеть, как отображение спрайтовых стен лифта меняется в зависимости от угла обзора
Источник: Digital Foundry / YouTube

В отличие от аркадных систем с достаточным количеством оперативной памяти, создать нечто подобное на ПК было довольно сложно, так как обилие динамичных картинок серьёзно сказывалось на производительности.

Поиски новых решений

После успешного релиза Wolfenstein 3D и дополнения Spear of Destiny Кармак продолжил работу над псевдотрёхмерностью. Во время производства Shadowcaster, разработанной Raven Software при участии и помощи id Software, программист внёс несколько изменений, которые добавили сценам глубины, — затухающее освещение и наложение текстур на пол и потолок.

Скриншот: игра Shadowcaster / Raven Software / id Software

«В Wolfenstein каждая комната была ярко освещена без изменения оттенков. Но, как известно любому художнику, свет — это то, что оживляет картину. Кармак оживлял целый мир.

Для большего погружения он также научился накладывать текстуры на пол и потолок и делать стены разной высоты. Скорость была примерно в два раза меньше, чем у Wolfenstein, но, поскольку это была приключенческая игра (в данном случае речь идёт о Shadowcaster. — Авт.), основанная на исследовании, более спокойный темп действия казался гармоничным. <…> Он даже сделал наклоны на полу, чтобы игрок мог чувствовать, что он бежит вверх или вниз по склону. <…> И всем было очевидно, что id нужно использовать эту технологию для следующей игры».

Отрывок из книги Дэвида Кушнера
«Повелители Doom», стр. 200

Во время разработки Doom, Кармак и Ромеро старались придать миру новой игры больше разнообразия и реализма. Для этого им пришлось отказаться от прежней кубической архитектуры в пользу стен разной высоты, способных пересекаться под любым углом. Но такой дизайн закономерно бы повлиял на производительность. Вскоре Джон Кармак нашёл решение этой проблемы.

«При портировании Wolfenstein для консоли Super Nintendo Кармак читал о процессе программирования, известном как двоичное разбиение пространства, или BSP. Один программист (Брюс Нейлор. — Авт.) из Bell Labs применил этот процесс, чтобы ускорить визуализацию трёхмерных моделей на экране. Проще говоря, вместо того, чтобы медленно рисовать много маленьких полигонов за раз, он разбил модель на более крупные секции — листы данных. Когда Кармак прочитал об этом, в нём что-то щёлкнуло. Что, если использовать BSP для создания не только одного трёхмерного изображения, но и всего виртуального мира?»

Отрывок из книги Дэвида Кушнера
«Повелители Doom», стр. 229

Уже в Wolfenstein 3D для SNES на визуализацию поверхностей влиял не столько рейкастинг, сколько новая технология BSP в сочетании с низким разрешением (112×96, увеличенном до 224×192 в «режиме 7»).

В результате портированная версия выдавала оптимальную частоту кадров. Правда, из-за строгой политики Nintendo визуал игры был сильно изменён: враги не умирали, а падали навзничь, овчарки превратились в огромных крыс, а все ассеты, связанные с символикой нацизма, были заменены на более нейтральные.

BSP и технология Кармака

Первые упоминания о двоичном разделении пространства встречались ещё в исследовании 1969 года. В нём описывались методы генерации цифровых изображений, которые могли создать иллюзию вида из окна в авиасимуляторах, разработанных для обучения пилотов ВВС США. Но окончательно метод BSP был сформулирован в работе Брюса Нейлора, с трудами которого и ознакомился Кармак.

Двоичное разделение пространства — это метод разбиения виртуального пространства с помощью рекурсии, в результате которого получается иллюзия 3D-среды, состоящей из множества плоскостей. Объекты, созданные с помощью такой техники, содержат структуру данных, которая называется BSP-деревом. Используя двоичное разделение пространства в рамках игры, можно отсортировать визуальные объекты по принципу их расстояния от персонажа и обозначить пересечения плоскостей.

Для лучшего понимания метода BSP в рамках карт Doom рассмотрим пример, описанный Фабьеном Сангларом в книге Game Engine Black Book: Doom.

Пространство, в центре которого находится колонна. Всего восемь линий и восемь вершин
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

На схеме выше представлена карта, которая состоит из восьми вершин. Четыре из них образуют комнату из линий A, B, C, D. Внутри комнаты расположена колонна, которая тоже состоит из четырёх линий E, F, G, H. Все линии имеют определённое направление и только одну сторону.

Архитектура комнаты сама по себе довольно простая, но с точки зрения визуализации псевдотрёхмерности отобразить её в игре довольно сложно, так как порядок отрисовки будет изменяться в зависимости от местоположения игрока.

Чтобы построить BSP-дерево на основе текущей карты, необходимо провести прямую вдоль плоскости. Этот отрезок разобьёт площадь карты на две части. Основная задача состоит в том, чтобы продолжить деление площади до тех пор, пока каждый сектор в результате постепенного разбиения не станет выпуклым — то есть сегментом, который находится в рамках одной грани, без вогнутых участков. Для лучшего понимания понятия выпуклости в отношении участков игровых карт можно представить некое пространство, обтянутое резинкой.

Примечание

В своей книге Фабьен называет разделяющие линии сегментами, а секторы, созданные в результате этого разбиения, — подсекторами. Стоит помнить, что это не единственный вариант обозначений данных элементов. В Сети и различной литературе встречаются и другие определения — например, прямые (разбивающие линии) и подплоскости (сегменты, которые получились в результате разбиения). Но в любом случае в самом BSP-дереве они всегда обозначены как узел (разбивающая линия) и лист (фрагмент объекта внутри полученной грани).

Пространство нужно разделять максимально эффективно. Поэтому в текущем примере за основу взята линия H. После этого комната будет практически разделена пополам.

Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

Таким образом после разделения плоскости по линии H сформировалась основа BSP-дерева с двумя подсекторами. Один подсектор уже выпуклый (A, B1, H, D1), и его не нужно разделять. Структуру другого подсектора (E, F, G, D2, C, B2) нужно упрощать дальше. На схеме ниже площадь разделили ещё на два сегмента — и таким образом в BSP-дереве появился узел G и два образованных от него листа.

Обновлённая схема BSP-дерева
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

Осталось упростить зону между линиями B2, C2, F и E, поэтому проводится ещё одна прямая по линии F.

Финальный вид карты и схемы BSP-дерева
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

В итоге на карте появилось уже 12 вершин и 12 прямых, которые помогут сформировать данные для отбора будущих визуальных элементов с разных точек обзора.

12 вершин. 12 разбивающих линий. Одно BSP-дерево
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

Как уже упоминалось ранее, это не единственный вариант разбивки подсекторов. Но, если, к примеру, начать строить BSP-дерево в алфавитном порядке, его структура сильно увеличится.

Альтернативный вариант BSP-дерева на основе карты из примера
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

Преимущество BSP-деревьев в том, что при их использовании всегда требуется одинаковый объём вычислений, независимо от того, в какой точке находится игрок. Теперь, зная, как создаётся структура BSP, можно перейти к разбору псевдотрёхмерности id Tech 1 на примере Doom.

Иллюзия трёхмерного пространства в Doom

Дизайн уровней Doom создавался с помощью DoomEd — специального редактора, в котором карта выглядела как архитектурный план. В программе можно было обозначить разметку и высоту секторов, назначить текстуры, а также отметить расположение спрайтовых объектов окружения и различных ивентов — например, спавна монстров.

Скриншот интерфейса ранней версии DoomEd
Скриншот: DoomEd / @DonMacAskill / X

Далее карта обрабатывалась в специальном инструменте doombsp, который рассчитывал наиболее оптимальные варианты разделения пространства, отдавая предпочтение выпуклым подсекторам с большой площадью (что уменьшало количество узлов в дереве, как в примере выше) и прямым линиям, выровненным по осям.

Такая первичная разметка упрощала отладку и быстрое выполнение побочных тестов. В теории подобные вычисления занимали большое количество времени, но так как Кармак создавал все BSP-деревья на передовом для того времени компьютере NeXTstation Turbo, процесс шёл намного быстрее. Например, расчёт двоичного разбиения пространства карты E1M1 занял восемь секунд, а на все 30 карт первого Doom ушло 11 минут.

На третьей из приведённых выше иллюстраций можно заметить, что каждая карта состояла из множества подсекторов. Каждому из них задавались уникальные параметры: высота пола и потолка, изображение текстуры и даже уровень освещённости. За счёт этого получалась многоуровневая структура локаций. Так как карта была уже заранее поделена на подсекторы, во время запуска шутера значительно сокращалась нагрузка на процессор.

Для коллизии Кармак разработал blockmap — специальную структуру данных на основе сетки площадью 128×128 ячеек. Каждая ячейка содержала данные о линиях, которые находились в её границах. Далее происходила индексация координат линий, и уже в коде эти координаты проверялись на столкновение с помощью абстрактного метода P_PathTraverse. Функция P_AimLineAttack позволяла наносить ближние атаки кулаком и бензопилой на врагах-спрайтах. Координаты последних обновлялись каждый раз, когда те меняли позицию.

Линии на карте E1M1, индексированные через blockmap. Ячейки, в которых не было линий, оставались пустыми. Прямые подсекторов разбиты на отдельные отрезки и могли находиться в разных клетках
Инфографика: Fabien Sanglard. Game Engine Black Book: Doom. 2018

Технически проецирование стен в Doom происходило следующим образом.

  • Отрисовка сектора, в котором находится персонаж.
  • Вершины пространства перестраивались таким образом, чтобы сам мир начинал вращаться вокруг персонажа.
  • Закрепление вершин линий, расположенных перпендикулярно к углу обзора игрока.
  • Определение X-координаты угла стены в экранном пространстве.
  • За счёт значения глубины (по оси Z) вершин, расположенных по бокам экрана, происходила интерполяция высоты стены от первой вершины на экране до второй.

При рендеринге вертикальные плоскости (стены) отрисовывались от ближних к дальним. В процессе также был задействован рейкастинг, за счёт которого визуализировались только плоскости, которые находились в поле зрения игрока, даже если за ними существовали другие подсектора.

В первоначальной версии Doom нельзя смотреть вверх или вниз. Уже в более поздних итерациях движка, в частности в играх Heretic и Hexen, появилась техника сдвига по оси Y, известная как y-shearing. С ней линия горизонта смещалась при изменении угла обзора. Для лучшего понимания можно представить сцену в виде изображения с большой высотой, разделённого на два сегмента. И при взгляде вверх или вниз перспектива плавно перемещалась к верхним или нижним участкам видимых плоскостей.

Скриншот: игра Heretic / Raven Software

Но так как сама сцена представляет собой набор перпендикулярных плоскостей, то чем дальше угол обзора отклонялся от изначальной точки Y, тем сильнее искажалась перспектива. За счёт y-shearing также получилось реализовать механику полетов в той же Heretic.

После рендеринга вертикальных плоскостей визуализировались горизонтальные — полы и потолки, которые в рамках движка назывались виспланами (от англ. visplanes).

В отличие от стен, рендеринг которых происходил вертикально по столбцам, виспланы отрисовывались построчно. Для неба использовалась отдельная текстура потолка без высоты и настроек освещения. И хотя движок распознавал её как отдельную плоскость, формально она тоже причислялась к категории виспланов.

Так как вертикальные плоскости по оси X отличались по высоте из-за перспективы, они разбивались на отдельные сегменты. То же самое происходило и с виспланами. Но проблема в том, что отрисовка последних занимала большое количество оперативной памяти, и движок поддерживал ограниченное количество виспланов — не более 128 уникальных поверхностей пола и потолка одновременно. Если их выходило больше, игра выдавала ошибку No more visplanes. Именно поэтому в целях оптимизации соседние виспланы часто объединяли в один, если параметры подсекторов были одинаковыми.

На последней стадии отрисовывались ранее упомянутые Things — спрайты монстров, оружия, бочек; а также отдельные спрайтовые элементы окружения (Specials) — например, полупрозрачные стены-решётки. Примечательно, что, в отличие от статичного окружения, спрайты отрисовывались задом наперёд и проецировались на экран в зависимости от положения игрока.

Эффект затухающего освещения в Doom был реализован с помощью специальной таблицы с 32 оттенками 256 цветов. Используя их, на дальнем расстоянии можно было имитировать затенение в пространстве, которое усиливалось по мере отдаления персонажа от плоскости. Подобное наложение «карт освещения» подчёркивало глубину картинки.

Цветовая карта DOOM с использованием 32 оттенков, полученных в результате смешивания цветов из основной гаммы. Всего в общей сумме так и остаётся 256 цветов
Изображение: Fabien Sanglard. Game Engine Black Book: Doom. 2018

В итоге благодаря новому подходу к псевдотрёхмерности id Software удалось создать революционный шутер с уникальной на тот момент архитектурой. К недостаткам BSP-структуры можно отнести большой объём предварительных вычислений, а также невозможность изменить в дальнейшем позицию стен, так как при каждом смещении подсектора пришлось бы генерировать новое BSP-дерево. Именно поэтому все динамические конструкции Doom (ловушки, двери секретных комнат) двигались только вертикально.

Кармак продолжил совершенствовать подход с двоичным разделением пространства и даже консультировался с самим автором техники Брюсом Нейлором, который уже на тот момент потерял интерес к компьютерной графике и передал программисту все свои наработки. Таким образом усовершенствованная технология BSP появилась спустя несколько лет уже в трёхмерной Quake.

После выхода Doom интерес к псевдотрёхмерной технологии стремительно вырос. В 1994 году Apogee Software выпустила шутер от первого лица Rise of the Triad: Dark War на модифицированном движке Wolfenstein 3D.

Как и в предшественнице, архитектура уровней Rise of the Triad была построена на прямых плоскостях, но сами карты выглядели гораздо более разнообразными за счёт текстурированных полов и потолков, а также возможности сделать стены более высокими. Появилось перемещение по вертикали: игрок мог летать, как в Heretic (после получения одного из специальных предметов), прыгать на катапультах и кататься на спрайтовых подъёмниках.

Визуально игра стала выглядеть более реалистично, в том числе за счёт вышеупомянутой иллюзии освещения. Появилась имитация динамического освещения: при разбивании светильника текстура ближайшей к нему стены менялась на более тёмный вариант. К слову, геймдизайнером, главой разработки и продюсером Rise of the Triad: Dark War был Том Холл, ушедший из id Software во время разработки Doom.

Скриншот: игра Rise of the Triad: Dark War (1994) / Apogee Software

Build Engine как воплощение творческих идей

Немалый вклад в реализацию псевдотрёхмерности внёс молодой программист Кен Сильверман, разработавший свой собственный игровой движок Build Engine в 1993 году. Как и многие игроки, юноша был впечатлён Wolfenstein 3D и хотел создать собственную технологию, которая могла бы имитировать трёхмерную среду.

Его первый серьёзный проект на собственном движке — Ken’s Labyrinth — заметила Apogee Software (будущая 3D Realms). За месяц до поступления Кена в колледж компания приняла юношу в свой штат в качестве программиста и предоставила ему все условия, чтобы он мог совмещать работу над технологией с учёбой.

В дальнейшем именно Build Engine смог передать зрелищную иллюзию полноценной трёхмерной игры настолько, насколько это было возможно в то время, — и конкурировать не только с движком id Tech 1, но и с его второй итерацией, ставшей основой для трёхмерной Quake. Ниже приведено несколько ключевых особенностей Build Engine, которые помогли перенести «псевдо-3D» на новый уровень.

Деление карт на секторы. Секторы хранили информацию о высоте полов и потолков (то есть верхние и нижние грани сектора), которым можно было задавать наклон. С помощью таких манипуляций получалась более разнообразная архитектура, хотя технически стены всё ещё были расположены под углом 90 градусов. Структура секторов (форма, высота и наклон) могла меняться в реальном времени.

Именно за счёт такой техники реализовано разрушаемое окружение в шутерах Duke Nukem 3D и Blood. Также сектора могли вращаться (в пределах одного сектора), за счёт чего в играх на Build Engine встречались горизонтальные лифты.

Манипулируя переключателями, игрок в Duke Nukem 3D мог перемещаться по уровню горизонтально
Скриншот: игра Duke Nukem 3D: Lunar Apocalypse / 3D Realms

Система порталов вместо BSP-деревьев. Порталами в Build Engine называют сегменты (ими могут быть дверные проёмы, окна и даже мебель), которые позволяют видеть окружение одного фрагмента карты из другого участка. Для лучшего понимания природы порталов достаточно заглянуть в соседнюю комнату, находясь в это время в другой. Порталом в данном случае станет дверной проём.

Преимущество такого подхода в том, что он лучше подходит для создания масштабных карт. Build Engine сначала отрисовывает сектор, в котором находится игрок, с учётом всех видимых порталов. После этого он рекурсивно запускает рендеринг секторов, которые видны за порталами (не затрагивая, то что уже нарисовано). Все плоскости, которые находились за пределами угла обзора, отсекались.

При таком методе стены не подразделялись на мелкие сегменты, как это было в id Tech 1, и цельность структуры обеспечивала более быстрый рендеринг плоскостей. Ниже можно увидеть стадии рендеринга в Duke Nukem на локации вблизи кинотеатра.

Первые восемь секунд происходит рендеринг пола — до нижней линии портала-тротуара; вслед за ним движок отрисовывает сектор за тротуаром по правую сторону игрока. С 18-й секунды отрисовывается большой участок пола по левую сторону, затем тротуары слева и, наконец, фасад кинотеатра
Источник

Примечание

Более подробную информацию о технических особенностях рендеринга в Build Engine можно прочесть в статье Фабьена Санглара, посвящённой движку Build Engine, или ознакомиться с её переводом на русский язык на Habr.

«Комната над комнатой» — манипулирование секторами с целью имитации многоуровневой среды. Многоэтажная структура уровней создавалась за счёт единой основы, которой мог быть пол или потолок. Например, игрок может зайти в зал на первом этаже, подняться вверх по лестнице, огибая при этом пару углов, и попасть на второй этаж, расположенный над первым. Также в дизайне уровней существовала практика телепортирования игрока в другой сектор с помощью лифтов, а также при прыжках в воду или в ямы.

Зеркала в играх на движке Build Engine технически представляют собой большой (чтобы в отражение вмещалось всё, что может видеть игрок) пустой сектор, соединённый с комнатой, в которой расположено зеркало. Движок копирует отражение комнаты в зарезервированное пространство, и таким образом всё, что игрок видит в «зеркальном» секторе, отображается как отражение.

Видео, в котором более подробно разобран принцип работы зеркал в Duke Nukem 3D

Поддержка вокселей. Более поздние итерации движка Build (после релиза Duke Nukem 3D) стали поддерживать воксельную графику. Воксельные объекты можно встретить на уровнях Blood, которые выглядели достаточно эффектно на фоне плоских спрайтов.

Воксельный объект в Blood
Изображение: игра Blood (1996) / Monolith Productions

Даже после середины 1996 года, когда на прилавках магазинов появился шутер Quake с полноценной 3D-графикой, игр на движке Build становилось только больше. Многие из них — Blood, дополнения к Duke Nukem 3D, Shadow Warrior, Redneck Rampage — стали по-настоящему знаковыми хитами.

Причина, по которой псевдотрёхмерные игры были востребованы среди аудитории, заключалась не только в креативном подходе разработчиков, но и в низких системных требованиях игр. Как уже отмечалось ранее, псевдотрёхмерные шутеры запускались в software-режиме и распространялись по условно-бесплатной лицензии shareware. Поэтому в них можно было поиграть с любого ПК: дома, в офисе и даже в университете.

Даже после середины 1996 года, когда на прилавках магазинов появился шутер Quake с полноценной 3D-графикой, игр на движке Build становилось только больше. Многие из них — Blood, дополнения к Duke Nukem 3D, Shadow Warrior, Redneck Rampage — стали по-настоящему знаковыми хитами.

Причина, по которой псевдотрёхмерные игры были востребованы среди аудитории, заключалась не только в креативном подходе разработчиков, но и в низких системных требованиях игр. Как уже отмечалось ранее, псевдотрёхмерные шутеры запускались в software-режиме и распространялись по условно-бесплатной лицензии shareware. Поэтому в них можно было поиграть с любого ПК: дома, в офисе и даже в университете.

Скриншот: Shadow Warrior (1997) / 3D Realms

Если сравнить количество игр на Build Engine и id Tech 1, обнаружится интересная деталь. Если не считать многочисленные модификации и переиздания оригинальной Doom, игры на движке id Tech 1 можно пересчитать по пальцам. Помимо собственных проектов id Software (Doom и Doom 2: Hell on Earth), id Tech 1 использовали игры Heretic, Hexen: Beyond Heretic, Strife: Quest for the Sigil и Chex Quest. Почему же разработчики отдавали предпочтение Build Engine, несмотря на известность и надёжность технологии id Software?

Лицензия Build была гораздо дешевле, чем id Tech 1. В те времена у разработчиков было не так много альтернатив: либо они покупали движок Doom, либо создавали собственную технологию. И появление Build на рынке давало шанс небольшим студиям сделать свой проект в популярной псевдотрёхмерности, делая упор исключительно на разработку самой игры, а не движка.

В такой ситуации оказалась студия Monolith, когда в 1994 году начала делать Blood: движок Doom был ей не по карману, а создание собственной технологии могло заметно увеличить сроки производства. Но, заключив контракт с издательством Apogee, Monolith получила право использовать Build Engine как основу для будущего шутера.

Воплощение самых амбициозных идей. Технология id Tech 1 была достаточно лаконичной, и, как уже упоминалось ранее, в ней были существенные ограничения. А с помощью структуры Build Engine, основанной на секторах и порталах, можно было добиться довольно реалистичной среды, добавив подводные секции, горизонтальные лифты, иллюзию разрушаемого окружения и взаимодействия со спрайтовыми объектами.

Скриншот: игра Duke Nukem: Nuclear Winter
Источник

«Думаю, что Duke Nukem 3D задала общий тон играм на движке Build, особенно в плане юмора, говорящих персонажей, отсылок к поп-культуре и прочей безбашенности. В то время как id Software сконцентрировалась на выпуске очень суровых и лаконичных игр, мы задали нашим проектам (Duke Nukem 3D и Shadow Warrior) другое направление; и команды, которые лицензировали Build, последовали нашему примеру», — объяснял Скотт Миллер, основатель 3D Realms (ранее Apogee Software) в интервью Retro Gamer.

Удобные инструменты для создания карт, включая собственный 3D-редактор. Оценить его возможности можно до сих пор, запустив Mapster32 — пользовательскую версию редактора карт, которая входила в набор открытого исходного кода Duke Nukem 3D под названием EDuke 32.

Доступность и разнообразие функций Build Engine позволяли разработчикам делать игры на этом движке вплоть до 1999 года. Но какую бы убедительную картинку не старались передать через псевдотрёхмерность, с развитием 3D-графики технология стала считаться устаревшей. И уже к концу нулевых внимание игроков переключилось на проекты в полноценном 3D. Но это не значит, что псевдотрёхмерные игры окончательно канули в лету.

Скриншот: Redneck Rampage / Xatrix Entertainment

Что было дальше

23 декабря 1997 года Кармак выложил открытый исходный код Doom для некоммерческого использования. В 1999-м статус лицензии был обновлён до свободного ПО.

Исходный код Build Engine от Кена Сильвермана появился чуть позже, в 2000 году. В дальнейшем вышла вторая версия движка, адаптированная под современные системы.

В совокупности все эти релизы мотивировали поклонников шутеров старой школы и ностальгирующих по «псевдо-3D» воплощать свои задумки. Как итог, на тематических порталах появились и до сих пор появляются сотни и тысячи уникальных проектов на движке, многие из которых стали не просто модификациями для Doom, но полноценными играми с уникальным сюжетом, графикой и музыкой.

Движок Build Engine и вовсе смог вернуться в индустрию и выйти за рамки пользовательских проектов. В 2019 году состоялся релиз Ion Fury на модифицированной версии этого движка: всё с той же псевдотрёхмерной перспективой, но с поддержкой современных систем и высокой частоты кадров и разрешения.

Скриншот: игра Ion Fury / Voidpoint, LLC

Итог

Можно сделать вывод, что интерес к «псевдо-3D» не угасает до сих пор. Но если раньше эту технологию использовали за неимением других альтернатив, то сейчас псевдотрёхмерность стала одним из видов стилизации, которую намеренно выбирают разработчики, чтобы привлечь внимание поклонников шутеров старой школы.

При этом, учитывая многогранность компьютерной графики в наше время, гонка за реализмом в визуале отошла на второй план, поэтому проекты в подобной ретростилистике продолжат занимать определённую нишу на рынке. И недавно вышедшее дополнение для Ion Fury — тому подтверждение.

Научитесь работать с нейросетями — бесплатно!
Большая конференция по ИИ: пять экспертов и 10 нейросетей. Освойте нейросети — работа с ними становится обязательным навыком. Нажмите на баннер, чтобы узнать подробности.
Смотреть программу
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована