Приведенная ниже статья будет интересна всем, кто хочет узнать как раньше делались игры, и какие чудеса смекалки проявляли разработчики, чтобы сделать свои игры более реалистичными, в эпоху примитивной графики и ничтожных мощностей персональных компьютеров.
3D-режим в Diablo 2
Это перевод поста Don't Starve, Diablo — Parallax 7 из блога Simon Schreibt от 25 февраля 2014 года.
Осторожно, тяжелые гифки.
В 90-х игры начали свое движение от 2D к 3D. Если бы НЛО тогда посетило землю, пришельцы решили бы, что используемые в то время низкополигональные модели без всякой фильтрации никому не нужны, и уничтожили бы Землю.
Со временем они, конечно, научились бы тому, что делало людей особенными: даже в эру 2D у них было невероятное желание рендерить в 3D, даже при том, что тогда это было просто невозможно! Все началось с реализации эффекта параллакса (в зависимости от «дистанции» некоторые элементы двигались быстрее других). Этот эффект параллакса взорвал людям мозг еще в 1982 году:
Игра: Moon Patrol
Действительно, интересно, что несколько плоскостей, двигающихся по-разному, создают такой впечатляющий эффект. Но выглядит немного плоско, да? Перспективная камера над поверхностью земли выглядела бы лучше, но это невозможно сделать без применения «настоящего» 3D? Ок, воспользуемся машиной времени и переместимся в SNES-эру:
Игра: Moon Patrol
Выглядит как 3D, но это не 3D! Это технология SNES под названием “Mode 7”. Для ее визуализации Nintendo манипулировала текстурами (уменьшая высоту в пользу глубины) при помощи некой программистской магии. Вот слова человека, который знает, как ее применять (он говорит о Gameboy Advance, но, насколько я знаю, для SNES рецепт тоже подходит):
«У GBA нет никаких аппаратных возможностей рендерить 3D, но можно его подделать, если по-умному управлять масштабом и переходами REG_BGxX-REG_BGxPD для каждой линии», Cearn
Кстати, даже сегодня некоторые люди сходят с ума по Mode 7 и используют его для проектов с RPG Maker. Впечатляет!
Сегодня можно рендерить каждый ресурс в «настоящем» 3D чтобы придать объем, но существуют примеры, где это просто не нужно. Фактически, иногда даже лучше использовать олдскул:
Источник: Don't Starve
Все кусты, деревья и враги в Don’t starve плоские. Мне кажется, выглядит круто!
Для меня Diablo 2 (2D ARPG 2000-го года) была первой игрой, которая совместила параллакс-эффект из Moon Patrol и что-то подобное подходу Mode 7.
Давайте посмотрим на игру со стандартными настройками. Чистый 2D. Никакой перспективы. Никакого параллакса:
Источник: Diablo 2
Но у игры был «Режим перспективы». Давайте его включим! Обратите внимание, колья закрывают разные пиксели на земле в разное время:
Выглядит как Don’t Starve, но помните: Diablo 2 – 2D игра! Официальной информации об этом режиме не было. Все, что вы сейчас читаете, стало известно благодаря отличным инструментам/документации Тома Амиго и Пола Симари. Отдельное спасибо Полу за то, что он ответил на все мои вопросы и во многом меня поддержал.
Может показаться, что программисты Blizzard всего лишь каким-то образом двигали спрайты, но если сравнить игру с включенным режимом перспективы и выключенным, и при этом не передвигаться, то станет заметно, что они, по сути, сдвигали все относительно линии горизонта.
Если заменить текстуру земли прекрасной шахматной текстурой, видно даже лучше:
В смысле, подумайте вот о чем: каждый ресурс в сцене нужно было каким-то образом трансформировать, чтобы он выглядел перспективно без щелей у границ спрайта. Тем более учитывая количество спрайтов в сцене (шанс получить щели был достаточно велик…):
При этом код игры не должен был быть слишком запутанным! Так что, пожалуйста, имейте в виду, что в Blizzard подразделяли спрайты на кусочки размером 32х32px. Загружать только те части картинки, которые необходимы – выглядит как оптимизация. Плюс ко всему, это становится полезно, когда необходимо применить трансформацию. Смотрите, как подразделяются спрайты в игре:
Источник: D1 format by Paul Simary
Я нарисовал на прозрачной текстуре линии через каждые 32px, чтобы показать ложную сетку. Результат превзошел мои ожидания! Как показывают вертикальные линии, у спрайта есть «настоящая» точка схода глубоко в земле (чего вы могли ожидать от перспективы):
Однако я не знаю, почему нижний край так выгнут. Для перспективы это не нужно (ниже есть сцена из 3ds Max, показывающая, что, если камера не вращается вокруг своей оси, то горизонтальные линии остаются прямыми):
В любом случае, волшебники из компании Blizzard знают, зачем они это сделали. Может, это ничего и не стоит, но такая деформация зависит от «угла», под которым вы смотрите на спрайт (позиции игрока/камеры). Смотрите, как нижний край выпрямляется:
Вот скриншот для тех, кому интересно искажение шахматной текстуры:
Если вы думаете, что это все достаточно интересно, то читайте дальше и очумейте. Пол пишет, что спрайты могут иметь некое значение ориентации. В зависимости от этого значения спрайты искажаются по-разному (да… еще сложнее)! Вот пример: у стены есть направления (Левый край, верхний край, левый нижний край, и т.д.)
Источник: DT1 format by Paul Siramy
Давайте я продемонстрирую как (по-моему) это сделано. На следующем изображении показан стандартный вид ISO. Ниже представлены шаги, которые я предпринял, чтобы сделать спрайты «перспективными». Мне пришлось их переместить, отмасштабировать и дважды деформировать, чтобы добиться такого эффекта.
Как видно, трансформация в моем представлении слегка запутанная. Давайте посмотрим, как это на самом деле сделано в игре:
Этот спрайт ориентирован иначе, чем в примере, который я упомянул раньше. Смотрите, деформация совсем другая! Верхняя и нижняя границы уже не сгибаются, вместо этого они как бы «смотрят» на точку схода слева. Снова обратимся к примеру как это выглядит в 3ds Max:
Судя по всему, игра преувеличивает искажения, чтобы избежать щелей между спрайтами и мне кажется, довольно успешно, потому что каждый спрайт забора отлично подходит. Обратите внимание на то, что направление граней (верхних и нижних) изменяется в зависимости от их местоположения:
Следующий пример показывает, насколько важно значение ориентации у спрайтов. Если просто сказать игре: «это не левая стена, а правая», наступает время щелей:
Этот режим можно было активировать только в полноэкранном режиме с D3D (Diablo 2 так же поддерживал режимы Glide и Программное ускорение), что заставило меня попытаться разобраться со старой документацией по DirectX, безуспешно.
Таким образом… здесь заканчивается наше путешествие и я надеюсь, что вы впечатлились этим примером жажды заставить 2D выглядеть, как 3D так же, как и я. Недостаток официальной информации и отсутствие официальных заявлений по этому поводу (посмотрите на сайте правительства, там нет ничего на тему «Режим перспективы в Diablo 2») подвел меня к неизбежному выводу:
Это все технологии пришельцев!
Использовавшиеся инструменты:
- MPQ Editor (для извлечения DT1 файлов из MPQ) by Tom Amigo
- DT1 Tools (для извлечения PCX файлов из DT1) by Paul Simary
- DT1 Tutorial (для понимания формата DT1) by Paul Simary
- GIMP (для редактирования/сохранения файлов PCX)
- Diablo 2 Map Editor(для понимания карт D2) by Paul Simary