zritelvrn → Как работает Quake Engine?

18:04, 01 Август 2013      zritelvrn      1348 11      Блоги     
Цитата
Что в DooM, что в Quake, были редакторы. Их даже скачать можно. Да, да. Те самые редакторы, которыми пользовались в ID. Правда, они (карты) компилируются, для того, во-имя оптимизации.


Отвечая на этот комментарий, скажу что я имел ввиду более старые игры, типа тетрисов. Код подобных игр имел код вида function create cube, да function create cylinder. Не требовалась загрузка такого объема информации, которую и за пять минут не создашь.

В этом посте, я хотел бы затронуть, как работает BSP-дерево в Quake Engine, чем компилированная карта отличается от неоткомпилированной и иже. Изначально хотел вставить это в ответ, но заглючил браузер (где-то вспоминается совет длинные посты вообще набирать в ворде). Ну ладно.
Все начинается с двух файлов: map и wad. Первый (неоткомпилированная карта) представляет собой исключительно текстовую информацию в открытом виде (создается редактором карт). Геометрия представлена в виде параллепидов, которые представляют собой координаты, используемую текстуру из файла wad. Информация о расположении монстров, оружия, ключей и даже света также представлена в открытом виде (но начинается все с имени WADника). Все это в map не структурировано: если сначала поставили точку старта игрока, а потом добавили стену, именно в таком порядке и запишется в файл.
Второй, WAD - псевдоархив с текстурами в формате PPM. Сначала идет графика, в конце - таблица символов с инфой о том, где торчит та или иная картинка и ее имя (без расширения - не критичная информация, без которой движок может обойтись). Содержит пикселизированные картинки, размываемые в режиме opengl невысокого разрешения. Помимо текстур, имеются мипмапы (mipmaps) - уменьшенные версии существующих текстур, подгружаемые в случае, если игрок идет по длинному коридору. Движок использует данные файлы, а не интерполирует большие картинки.

В процессе компиляции в BSP производится следующее:

1. Параллепиды меняются на полигоны-треугольники. То есть был квадрат, а стало два треугольника. Только так работает трехмерная графика - авторы движка ориентировались на 3D Studio (предыдущее название 3D Max). Но почему? Потому что кирпич лучше представить как два толстых полигона (треугольника) с четырьмя вертексами, а не четыре параллепида. Иначе его нельзя будет проткнуть, сделать вогнутым - внутри ничего нет, понадобятся еще и еще новые параллепиды. Это не двумерка.
2. В BSP копируются текстуры из WAD и все их мипмаппы. В дальнейшем, WAD вообще не нужен, это только для редактора. Хотя движок может и подгружать текстуры из стороннего файла, при таком способе компиляции BSP, в карте остаются только ссылки на файл с текстурами. Вообще, было два режима компиляции, но стандартные карты WADников не требуют, почему-то решили откомпилировать так. Поскольку исходный код открыт, отдельные энтузиасты еще около 10 лет назад создали сторонную программу, которая позволяет вынимать текстуры от всей прочей информации из BSP.
3. Создаются карты освещения и теней. Да, это тоже текстуры со своими мипмаппами, которые накладываются поверх обычных. Технологии рендеринга достаточно примитивные - жесткие, мягкие, это было никому не нужно. Еще не было даже возможности менять цвет. Для Quake уже то, что в темной комнате может загореться освещение было в новинку. Все эти текстуры всегда являются частью BSP-файла и без изменения кода, не существует режима их подгрузки из сторонних файлов. Тем не менее, в BSP можно найти записи вида

Код

"light" "200"
"origin" "992 2456 280"
"classname" "light"


Которые можно ошибочно принять за параметры рендеринга света, но это не так. Свет в Quake - это текстура, накладываемая поверх, а эти записи - не более, чем ссылка на таковую. Для ситуаций, когда на карте свет нужно включить или отключить, подобные ссылки запоминают текущее состояние, без них это было бы невозможно.
4. Помимо сложных графических вычислений, которые записываются как бинарная информация (т.е. ABCD в случае бинарной информации не нужно читать как приключенческий роман, это - данные, интересные компьютеру), в BSP существует и простейшая текстовая информация. Расположение монстров, оружия, лавы, ключей представлено в том же виде, что и свет. В простейшем случае - тип объекта (classname), координаты (origin) в x y z. Это копируется из map файла практически без изменений. Иногда присутствует target. К примеру, у classname "trigger_teleport", данный параметр показывает, куда переместить игрока. Без него также не будет работать включающийся/выключающийся свет, потому что движок не знает, когда и при каких условиях, текстура должна быть убрана. Даже если мы не хотим включать его обратно, эту информацию все равно надо запоминать.
5. Удаление обратных сторон стен, полов, потолков (все, что вне "classname" "info_player_start", т.е. точки старта игрока). Это один из последних этапов, хотя в теории может быть и в начале. А что было сделано? Наложена текстура а, наложена текстура б? Это же не рендеринг в реальном времени, не необратимые изменения. Кроме того, карта делиться на vis-зоны. Все, что за дверью, хоть и находится в оперативной памяти, но не отображается, пока игрок не подойдет ближе к двери. Экономится видеопамять, но требуется больше ОЗУ. Сейчас так делают все. Почему движок называется коридорным? Quake Engine не рассчитывался на большие ландшафты.

После этого, получаем готовый для игры BSP. Но движок не ограничивается только рендерингом графики - нужно управление, GUI и т.д.
Кстати, мипмапы до сих пор используются в большинстве игр. После того, как разработчики открыли исходники движка, идею переписали Microsoft для DirectX. И тогда, и сейчас, обычная и уменьшенная текстура хранилась в одном файле. Т.е. такой подход требовал собственных файловых форматов, существующие не подходили.
Но возможно, что и авторы Quake Engine не сами придумали этот способ, а позаимствовали из форматов, представляющих шрифты для операционных систем. Там используется тот же подход, хотя там и векторная графика (в мипмапах - растровая). Растровая представлена как набор пикселей, вектор - как набор линий. В интернете можно встретить как действительно профессиональные, так и шрифты с идиотскими кеглями. Отличаются тем, что профессиональный шрифт должен нормально отображаться на седьмом кегле, маленькие версии делают вручную. Тут акцидентные (рукописные и иже) шрифты соснут.

И вы все еще хотите делать свой движок? Разберите исходники готового сначала, даже если вы программист.

Комментарии (11)
avatar
-2
8 zritelvrn • 00:06, 02 Август 2013
Небольшая поправка. Там разбивается не на один треугольник, а на столько, сколько повторяется текстура. Для мипмапов нужно.
Когда-то сидел на тематическом форуме и даже не одном (не gamedev, пониже), наверно я больше всех все знал. Проф программистов там в основном не было, разве что на одном сайте один человек, который знает движок на уровне "умножаем на лайтмапы и выводим результат в новый тексель" (вспомнилась его выдержка из исходников "порта").
avatar
0
9 Coole • 00:13, 02 Август 2013
Минимап? В квейке? :o
avatar
0
10 zritelvrn • 00:16, 02 Август 2013
Вообще-то - м и п м а п
avatar
0
11 Coole • 14:58, 02 Август 2013
окей, sorry again
avatar
0
3 Coole • 20:29, 01 Август 2013
Судя по всему сударь не играл в квейк.
avatar
1
2 Coole • 20:28, 01 Август 2013
Я дочитал до "свет это текстура..." дальше читать не стал, а вот почему:
1) Если речь идёт о лайтмапах то тогда это не текстура, а маска затемняющая участки текстуры.
2)В квейке, вашу мать, динамическое освещение! Первый движок, где свет полностью просчитывается, блин, кодом! Кодом! От этого вообще-то в игре 16 битное (при чём очень резкое) освещение на 32 битных текстурах.
А эти ваши лайтмапы используются в движке build и в этом вашем майнкрафте (с выключеным зглаживанием освещения)
avatar
1
4 zritelvrn • 22:13, 01 Август 2013
А это ничего, что лайтмап переводится как "карта света"?
Любой рендер в 3DMax генерит их как маску для существующих материалов. И про игру в Quake - судить надо по оригинальной, а не модам, иначе надо говорить с поправкой, что это в каком-то моде было. Про 32 100% не угадал - в Quake индексированные цвета. Это значит, что игра использует не миллионы цветов, а ограниченное количество из палитры (файл id1/pak0.pak/gfx/colormap.lmp, вес 17кб). Если ты сделал скрин и он в 32-х битах - это значит, что ты в каком-то моде находишься, а не запустил оригинальную игру. Поверь, я знаю о чем говорю, я смотрел исходники, прошел Quake, загружал скрины из игры в оригинальной палитре.
avatar
0
5 Coole • 22:17, 01 Август 2013
всё, признаю. Нашёл я инфу.
avatar
0
6 Soulskinner • 22:26, 01 Август 2013
Они портами зовутся. Не модами. ^_^

И тут уже под вопросом относительно любого рендерера. Всё безобразие можно запечь, но не всегда получится. А рейтрейсеры... Да и Сканлайны, просчитывают свет "на лету". Это уже для теней генерятся карты. И то если выбраны... Забыл как этот алгоритм назывался, а не рейтрейснутые тени.
avatar
0
7 Coole • 22:31, 01 Август 2013
вообще, у меня WinQuake стоял, не оригиналка конечно же
avatar
1
1 Soulskinner • 19:20, 01 Август 2013
>> Отвечая на этот комментарий, скажу что я имел ввиду более старые игры, типа тетрисов. Код подобных игр имел код вида function create cube, да function create cylinder. Не требовалась загрузка такого объема информации, которую и за пять минут не создашь.

Лол. Долго думал ты имел в виду Doom-ы и Quake-и, или более старые игры. Если более старые, то тут уже хз. И только в тетрисе нет редактора.) А только рэндом.

Что касается статьи, она мне понравилась, но она уж слишком размазана. Как будто, некоторые куски - Quake, некоторые про остальные движки. Но и есть ляпы.
Форматы карт bsp и компиляцию в целом, я бы не назвал особенностью движка. Или даже частью. Не, они связаны, но это немного разные вещи. И только не знаю возможно-ли использование многоугольников, в том же Quake-е. Правда именно не интересовался. К тому же, и квады существуют.

Другая деталь... Не уверен, что в id вообще знали про 3D Studio... Да и оно на хрен не надо было знать. Тем более, многие исследования в 3D и формулы, были представлены... Ещё в 70-ых. Quake именно оптимизацией стал крут. В 3D редакторах-то фиг что оптимизируешь. Не, правда. Там просто не бывает "скрытых" поверхностей. А геометрия может очень быстро меняться самым кардинальным образом.
Сами id в качестве моделера, использовали Alias Animator.

Валидной полигональной геометрией, могут быть как треугольники, так как квады (четырёхугольники). Квады даже быстрее работают и куда лучше работают с текстурами, но! С ними сложнее возиться, так как нужно, чтобы они были плоскими. ^_^

Другая деталь - в MAP файлах (и вообще, браши), используются не полигоны... Внезапно, а? Там используются плоскости, которые потом конвертируются в полигоны. Ну и в BSP всё в бинарном формате хранится. А то ASCII - слишком медленен.

А mipmap-ы, не гарантировано, но скорее всего из Рендермена пришли. Потому как, там текстуры хранятся именно в таком виде + в виде тайлов. Ещё прикол, не знаю кто задумывался, но полный mipmap, занимает где-то... Хм. Меньше чем на половину, больше размера простого изображения. И именно из-за mipmap-ов желательно чтобы размеры текстур были степенями двойки.
Чтобы добавить комментарий войдите или зарегистрируйтесь