Как работает Quake Engine? - Старый Телевизор
Как работает Quake Engine?
Действия


Цитата

Что в 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 не сами придумали этот способ, а позаимствовали из форматов, представляющих шрифты для операционных систем. Там используется тот же подход, хотя там и векторная графика (в мипмапах - растровая). Растровая представлена как набор пикселей, вектор - как набор линий. В интернете можно встретить как действительно профессиональные, так и шрифты с идиотскими кеглями. Отличаются тем, что профессиональный шрифт должен нормально отображаться на седьмом кегле, маленькие версии делают вручную. Тут акцидентные (рукописные и иже) шрифты соснут.
И вы все еще хотите делать свой движок? Разберите исходники готового сначала, даже если вы программист.

01 августа 2013, 17:04 3109 zritelvrn
Комментарии загрузка...
Войдите или зарегистрируйтесь, чтобы добавить комментарий