В двух словах об id Tech

В этой статье я попытался простым языком и максимально лаконично рассказать про то, какие технологии использовала студия id Software при разработке своих псевдотрехмерных игр. Enjoy!

В двух словах об id Tech

Современные игровые движки имеют в своем инструментарии множество графических технологий: 100500 видов сглаживания, различные реализации эффекта затенения, отражения, включая трассировку лучей, тесселяцию, фильтрации и… и еще очень много всего, перечислить невозможно. Конечно, они появились не просто так. Их придумывали, пытаясь найти баланс между производительностью на актуальном в свое время железе и качеством картинки.

Мне бы хотелось рассказать о начале становления игровых движков в сегодняшнем понимании этого слова. Само собой, речь пойдет о творениях id Software: Wolfenstein 3D engine и Doom engine aka id Tech 1. Ключевым программистом этих движков был Джон Кармак.

Этот блок временно не поддерживается

Именно благодаря нему жанр 3D экшенов существует в том виде и на той стадии развития, на которой он сейчас находится. Серьезно, если расковырять практически любой современный 3D движок, то в нем, скорее всего, найдется строчка из кода Кармака, написанного для движков серии id Tech.

Quake engine, стоящий на вершине дерева, хоть формально и не входит в семейство id Tech,  не сильно отличается от id Tech 2 (Quake 2) и берет часть технологий из id Tech 1 (Doom)<br />
Quake engine, стоящий на вершине дерева, хоть формально и не входит в семейство id Tech, не сильно отличается от id Tech 2 (Quake 2) и берет часть технологий из id Tech 1 (Doom)

Перенесемся во времени и пространстве. На дворе 1992 год, США. У тебя нет никаких эрыксов, джитииксов, эртэиксов. Никакого 3D ускорителя, только 16-ти битный Intel 80286, 40 Мегабайт на жестком диске и 1.5 Мегабайта оперативы. Это ты еще гордиться должен, для домашнего компьютера этих лет вполне неплохо. Хоть настоящие 3D игры уже существуют, о них ты во-первых не знаешь, во-вторых, вместо какой-либо графики, там какие-то палки летают, в-третьих, они еще и лагать будут на твоем агрегате. Кароче, не надо оно тебе, лучше в Prince of Persia поиграть.

Ничего не понятно, да и не особо интересно<br />
Ничего не понятно, да и не особо интересно

Примерно в это время, может чуть раньше, Джон Кармак загорелся идеей заделать 3D шутер. Ну, как я уже выше написал, честное 3D компьютер начала 90х потянуть не мог. Хорошо, если у него получится отрисовывать куб хотя бы пару раз в секунду, но, насколько я знаю, он отрисовывался все-таки раз в пару секунд. Кароче, прямой путь тут был не самым быстрым. Вернее не самым производительным. Кармак это понимал. Но понимал он также и то, что человеческий глаз достаточно легко обмануть. Существует множество оптических иллюзий. Компьютерное 3D тоже в общем-то является таковой. Просто хитрые комбинации трогонометрических функций, которые присваивают размерные коэффициенты плоским текстурам.

Узнав про raycasting (да, точно не raytracing) Джон Кармак достаточно быстро написал движок, использующий для рендера эту технологию. Суть raycasting’а состояла в том, что используя данные из двухмерного макета уровня, рисовалась его 3D версия. А может правильней сказать 2.5D версия? Никаких вершин, образующих полигны, ведь не было. В общем, я опишу то, как работает технология, а ты уж сам реши как это назвать.

Из позиции камеры игрока на каждый столбец пикселей монитора испускается луч. Допустим, у тебя 320 пикселей по ширине, а значит, 320 столбцов. Столько же лучей и выпустится из позиции камеры. Каждый луч идет до тех пор, пока не столнется с игровым объектом. Высчитав размерный коэффициент, исходя из расстояния, пройденного лучем, рисуется текстура этого объекта. Дальние объекты рисуются уменьшенными, ближние увеличенными. Таким образом можно нарисовать стены и врагов. А с полом и потолком все просто — текстурой пола красится нижняя часть экрана, а текстурой потолка, соответственно, верхняя. Чтобы упростить расчеты, получившаяся картинка записывалась в буфер в оперативной памяти, и для тех мест, где ничего не поменялось, просто подставлялись данные из буфера.

С видео перед глазами гораздо проще понять, что я имею в виду

Кстати, шутером, который хотел создать Кармак был не Wolfenstein, а Hovertank. А вот следующий… тоже не вульф, а Catacomb 3-D. Вот следующий да, был уже Wolfenstein. Шутер про Бласковица получился настолько популярным, что именно его многие считают первым 3D шутером на ПК. Ну а ты, дорогой читатель, теперь вот знаешь чуть больше многих.

Если задуматься, то задаче обработки столкновений в играх уделяется достаточно мало внимания. А ведь между прочим, именно из-за неоптимального решения этой проблемы, у движка Wolfenstein 3D было столько ограничений. Джоном Кармаком было принято решение использовать уже реализованный raycasting для определения того, какие объекты проходимы для игрока, а какие нет. Нюанс в том, что обычно raycasting тратит на расчеты достаточно много времени, а компьютеру нужно успевать отрисовать хотя бы 24 кадра за секунду, чтобы картинка казалась плавной. В кончном итоге, скорость расчета удалось увеличить, но в жертву была принесена геометрия уровней. В Wolfenstein 3D стены на уровне выровнены по квадратной сетке. Т. е. если сторона квадрата в сетке 160 пикселей, то стена может быть шириной или 160 пикселей, или 320, или 480, в общем, кратной 160. Стена могла располагаться только вдоль линий сетки, т. е. ни о каких диагональных стенах речи не шло. Зато теперь движку достаточно посчитать положение точек пересечения линий сетки, а отрезок, их соединяющий, сделать непроходимым, если на нем расположена стена, или наоборот, оставить проходимым, если на нем ничего нет.

На этом скриншоте отлично видно кубики, из которых строились уровни<br />
На этом скриншоте отлично видно кубики, из которых строились уровни

После успеха Wolfenstein 3D на ПК, основная часть команды занялась разработкой приквела. Но не Джон Кармак. Он в это время занимался доработкой движка для следующей большой игры компании. Речь, конечно, про Doom. Как раз в этот период в id Software поступил заказ на портирование Wolfenstein на SNES. В компании подумали-подумали, и оказалось, что это невозможно. Консоль была слишком слабой. Но если зайти на википедию, то можно увидеть, что игру все-таки портировали. Как же так? Кармак использовал метод разбиения пространства на выпуклые плоскости (Binary Space Partitioning), коротко — BSP.

Да, ты все правильно понял. На технологию BSP наткнулись именно в поисках решения, способного ускорить работу Wolfenstein, а в Doom уже раскрывали ее потенциал

Что же такое BSP? А это, дружище, жесткий математический алгоритм. Но ты не спеши открывать форточку, духоты не будет. Я просто вкратце объяcню, что получается на выходе его работы и зачем он нужен.

Итак, мы имеем уровень. Этот уровень во время компиляции в редакторе разбивается на некоторые сектора, а затем эти сектора записываются в структуру, напоминающую дерево. Так и называется, BSP-дерево.

Во время игры, перед отрисовкой кадра, движок проходится по этому дереву и для каждого сектора считает, видим он или нет. Если сектор видим, то рисуется нужная текстура, если нет, то зачем тратить время на отрисовку? Кроме того, во время обхода определялось, с какой стороны сектора стоит игрок. Если игрок пытается перейти на другую сторону помеченного непроходимым сектора через, собственно, сам сектор, игра засчитывала столкновение и не пропускала его. Т.е. BSP теперь вместо raycasting’а занимался обработкой столкновений, и делал это значительно быстрее, что позволило увеличивать размеры комнат практически без снижения производительности. А еще он может обрабатывать уровни любой формы, поэтому карты в Doom теперь выглядят несравнимо более интересными, чем в Wolfenstein. Но raycasting никуда не ушел ни в порте Wolfenstein на SNES, ни в Doom, он по прежнему выполняет свою главную задачу — рисует объекты.

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

Кстати, я выше писал, что BSP-дерево гененрируется во время компиляции уровня в редакторе, а это значит, что двигать сектора, кроме как вверх и вниз, стало невозможным. Именно поэтому все двери в Doom открываются вертикально, а не привычно на себя и от себя, как в Wolfenstein.

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

Уже в Doom объект может состоять из нескольких текстур<br />
Уже в Doom объект может состоять из нескольких текстур

Движок Doom, будучи эволюцией движка Wolfenstein 3D, все так же превращал 2d макет уровня в его (псевдо)объемную версию, но делал это в несколько раз круче. Лестницы и лифты придавали ощущение того, что игра оперирует третьим измерением, и я только могу предствить, как это срывало башню в 1993 году. Да, нельзя было создать комнату под комнатой, да потолок был всегда перпендикулярен стенам, но кого это волнует, когда после игр с видом сбоку тебе дают стать глазами думгая, который под звуки переживавшего расцвет металла без страха идет по адскому лабиринту и без сожаления уничтожает чертей, стоящих у него на пути?

Бесспорно, Doom провел жирную черту, разделяющую игры на те, которые вышли до него, и те, которые вышли после. Ну а Джон Кармак как минимум карандашиком уже вписал свое имя в историю, положив начало развитию игровых движков. Нестираемым маркером он это сделает спустя 2 года, выпустив Quake и совершив прорыв в уже настоящей 3D графике, но это уже совсем другая история, которую я, может быть, расскажу позже.

44 показа
4.2K4.2K открытий
11 репост
60 комментариев

>Джон Д. Кармак IIА есть первый Джон Кармак?

Ответить

Да, он сделан на id Tech I

Ответить

второй Джон Джон Кармак, а первый просто Джон Кармак...наверное

Ответить

во-вторых, вместо какой-либо графики, там какие-то палки летаютВо-первых, была куча игр на чисто 3D движке FreeScape вроде Total Eclipse и Driller. Хорошие и интересные игры. Да и Элиту можно вспомнить.
Во-вторых, где Ultima Underworld, раз уже 1992?
В-третьих, гдр скиншоты Катакомб 3Д? Отличная же игра была.
А так плюс за техническую сторону.

Ответить

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

Ответить

Спасибо, хороший материал. Очень рекомендую по теме серию видосов Children of Doom о развитии жанра FPS https://youtube.com/playlist?list=PLvTOVWzS1f6-ptFCaXVnl41LZIc4x8Zmo

Ответить