Как создать графику в стиле PlayStation 1
Разбираем специфику визуального стиля игр на этой приставке и техники по воссозданию аналогичной стилизации в современных проектах.
![](https://248006.selcdn.ru/main/iblock/d14/d146538e8abeb9e0f9c9ec34b6893cad/5aa34d52df3b79f1f5202edda67e3e7b.png)
![](https://248006.selcdn.ru/main/iblock/d14/d146538e8abeb9e0f9c9ec34b6893cad/5aa34d52df3b79f1f5202edda67e3e7b.png)
Иллюстрация: игра Crash Bandicoot / Naughty Dog / игра Tomb Raider / Eidos Interactive / игра Nightmare Kart / LWMedia / Colowgee для Skillbox Media
Первые попытки эволюционирования графики в играх из 2D в 3D начались в 1990-х годах — и для многих хитов, вышедших в то время, были характерны низкополигональные модели, пиксельные текстуры и ограниченная цветовая палитра. И всё же у большинства игроков подобная стилизация ассоциируется именно с началом эпохи PlayStation 1. Во многом это связано с популярностью приставки, ведь она продавалась гораздо лучше своих основных конкуренток, Sega Saturn и Nintendo 64. Множество технических ограничений, присущих PS1, не помешали разработчикам воплотить свои творческие задумки и создать по-настоящему знаковые игры вроде Final Fantasy 7, Metal Gear Solid, Tomb Raider и Crash Bandicoot.
Сегодня визуальный стиль PS1 — это не просто дань ностальгии, но и полноценный художественный приём, имитирующий несовершенства графики прошлого. Чаще всего к нему прибегают инди-разработчики: в стиле PS1 сделаны, например, демейк Bloodborne PSX, Paratopic, Murder House, Chasing Static. И поскольку такие игры никуда не исчезают, а люди их покупают и с удовольствием проходят, получается, что подобная стилизация до сих пор остаётся привлекательной в глазах игроков и разработчиков.
Чтобы понять, в чём секрет её магии, сперва ознакомимся с техническими возможностями приставки в целом и их влиянии на итоговое изображение.
Содержание
- Архитектура PS1
- Особенности графики PS1
- Советы по воссозданию графики PS1 в современных играх
- Полезные ресурсы
Кратко об архитектуре PlayStation 1
Как уже отмечалось ранее, разработчикам игр для первой PlayStation приходилось сталкиваться с рядом технических ограничений, включая ограниченную цветовую палитру текстур и низкий полигонаж моделей. Экономия ресурсов приводила, например, к тому, что действующие персонажи кардинально отличались от своих образов в CG-заставках и на промоматериалах. Из-за чрезмерного минимализма даже миловидные герои часто получались угловатыми и нелепыми.
![](/upload/setka_images/14011010022025_accf102caaa970ce65d217b9ae9a8e9a57caa67c.jpg)
Если углубиться в технические спецификации приставки, можно заметить, что у PS1 заявлено 2 МБ оперативной памяти. Это значит, что все данные игры, включая операции с программированием, должны занимать не более 2048 КБ. Чтобы преодолеть это ограничение, разработчики использовали динамическую подгрузку данных с CD-диска. Тем не менее объём обрабатываемой информации в реальном времени не мог превышать это значение.
Ещё одно жёсткое ограничение связано с видеопамятью объёмом в 1 МБ. В ней хранились данные актуального кадрового буфера и набора текстур, воспроизводимых на экране. При этом многие игры требовали двойной буферизации. Из этого следует, что в столь небольшой объём предполагалось уместить два кадровых буфера, а остальное свободное место отводилось текстурам и цветовой палитре.
PlayStation поставлялась с двумя сопроцессорами, расширяющими возможности центрального процессора приставки — CP0 (сопроцессор управления системой) и CP2, более известный как GTE. Последний как раз и отвечал за проецирование 3D-перспективы, функции интерполяции, отображение освещения и другие операции с 3D-графикой, необходимые для рендеринга.
Графический процессор PlayStation мог отрисовывать картинку только в 2D, то есть в пикселях. Конечно, на экране могли отображаться трёхмерные объекты, но ранее упомянутый сопроцессор преобразовывал 3D-координаты в 2D-изображение, игнорируя координаты глубины. Эта особенность напрямую влияла на итоговую картинку на экране. Чуть ниже мы разберём её более подробно.
Рассмотрим, как все перечисленные выше особенности архитектуры PS1 отразились на графике, сделав её своеобразной визитной карточкой той эпохи.
Особенности графики PlayStation 1
Практически для каждой игры на PS1 характерны следующие особенности.
Низкополигональные модели и низкое разрешение текстур
В настоящее время сложно найти информацию о максимальном количестве полигонов, которое могла бы рендерить приставка. В статье на «Википедии» встречается неподтверждённое утверждение, что PlayStation могла отображать до 90 000 полигонов с текстурами и затенением Гуро. Без освещения это количество увеличивалось в два раза.
Но на практике каких-то фиксированных значений не существовало. Многое зависело от формата игры и задействованных функций сопроцессора, что вынуждало разработчиков ограничивать полигонаж. К примеру, модель Лары из первой Tomb Raider состояла всего из 250 полигонов, а модель Леона из Resident Evil 2 — из 407. По сравнению с современными приставками, способными обрабатывать сцены с миллионами полигонов в одном кадре, подобные значения кажутся микроскопическими.
Максимальный размер текстурных карт, который могла поддерживать PS1, составлял 256×256 пикселей. Но, как правило, разработчики отдавали предпочтение формату 128×128 пикселей и ниже, оставляя 256×256 для текстурирования главных героев, чтобы получить более проработанный образ. В целях экономии ресурсов все фрагменты UV-развёртки схожих объектов размещали на текстурных атласах. Источники освещения на уровнях старались размещать крайне экономно, а шейдеры в те времена не использовали. На текстурные карты наносили самую базовую светотень, тем самым создавая минимальную иллюзию объёма. Причём затенения и блики отрисовывали на текстурах как персонажей (к примеру, складки одежды), так и окружения (затемнения по краям стен или потолков).
![](/upload/setka_images/14011010022025_08fda0244b5397e030ee401fd2bea5b24f78a72b.jpg)
Скриншот: игра Silent Hill / Konami
Для динамичных спецэффектов разработчики использовали спрайты, а движения персонажей создавались не с помощью привычной сейчас скелетной анимации, а за счёт смещения вершин (или групп вершин) модели на основе ключевых кадров. Также у PlayStation существовала своя продвинутая система MIMe Animation, где разработчики могли настроить координаты смещения вершин с помощью различных параметров.
«Дрожащие» объекты
Пожалуй, одна из главных визитных карточек PS1 — это специфическая растеризация, которая выдавала зубчатую и дрожащую картинку при движении объектов на экране. Причина тому — ранее упомянутое преобразование геометрии в 2D с помощью сопроцессора GTE, включая отсутствие субпиксельной точности при растеризации. Приставка не поддерживала плавающие значения, а только целые числа. Это значит, что векторные вычисления, необходимые для отображения новых значений, воспроизводились целыми числами пиксельных координат, хотя при вычислении края треугольников могут занимать лишь часть пикселя. Если одна из вершин полигона перемещалась — создавалась новая пиксельная сетка. В итоге при перемещении вершин трёхмерных объектов получался тот самый дрожащий эффект.
![](/upload/setka_images/14012010022025_b1f5fb33da8f50f319a53de56ac6374150b960ea.gif)
Более наглядно это явление можно рассмотреть в примерах, приведённых программистом и дизайнером Cloud Imperium Games Дэвидом Колсоном. В первом примере он визуализировал субпиксельную растеризацию треугольника, а во втором — растеризацию на PS1. Фигура в обоих примерах движется с одинаковой скоростью и вращается под одинаковым углом. Но именно на второй анимации треугольник визуально кажется нам дрожащим.
![](/upload/setka_images/14012010022025_9f4177150537e15f4549b4114125e7b7fd1ba2c4.gif)
![](/upload/setka_images/14012010022025_08b05e7a793ee96c87ad6538ed513e45f4ce5704.gif)
Отсутствие буфера глубины
Под буфером глубины, или Z-буфером, подразумевается массив данных, определяющий удалённость фрагментов сцены в 2D-изображении от зрителя. Фактически этот буфер представляет собой изображение содержимого в кадре в оттенках серого, содержащее значение глубины для каждого пикселя. Буфер глубины помогает зрителю определить, насколько далеко тот или иной фрагмент сцены расположен относительно внутриигровой камеры.
Но архитектура PS1 не предусматривала поддержку буфера глубины. В результате ответственность за корректное воспроизведение объектов на расстоянии ложилась целиком на разработчиков. Чтобы все элементы отрисовывались в правильном порядке по мере приближения, существовали специальные таблицы упорядочения (Ordering Tables).
В этих таблицах собирали данные с группами примитивов (полигоны, линии, спрайты), из которых получалось 3D-изображение, — а сами группы были связаны друг с другом внутри иерархической структуры. Для каждой группы присваивалось значение глубины. Первыми отрисовывались те примитивы, которые находились дальше всего от точки обзора, а ближайшие — в последнюю очередь. В результате 3D-сцена игры отображалась корректно.
Тем не менее в играх часто встречались моменты, когда система не могла точно определить, какой треугольник отрисовать в приоритете. В результате на экране возникали глитчи с появлением и исчезновением некоторых частей меша.
![](/upload/setka_images/14012010022025_5a1bba1c28b4a49e108d429d2577500dc235af18.gif)
Скриншот: игра Tomb Raider / Core Design
Похожий дефект встречается и в техническом демо PlayStation с тирексом, выпущенном в 1997 году.
Во время передвижения динозавра можно заметить артефакт: полигональные сетки ног и туловища частично конфликтуют друг с другом, из-за чего отдельные треугольники «проваливаются» или вылезают в ненужных местах. Это происходит из-за проблемы с вычислением глубины.
Определение глубины (Depth Cueing)
Метод, при котором видимость объекта, точнее его освещение или затенение, менялась в зависимости от расстояния, подчёркивая эффект глубины. Фактически Depth Cueing представляет собой упрощённый эффект тумана, которому можно придать разные оттенки. Классический пример такого подхода встречается в первой Silent Hill, где создавалась имитация мглы снаружи и кромешной темноты внутри помещений.
![](/upload/setka_images/14013110022025_fc9956ee2f4201e204a5532c68850c6715ed24e0.jpg)
Грубое усечение геометрии вблизи
В PlayStation объекты, находящиеся вне зоны видимости игрока, отсекаются по целым примитивам. В результате, если персонаж в игре движется очень быстро, а на переднем плане находятся массивные полигональные конструкции, из сцены могут резко пропадать крупные фрагменты.
Ещё один пример из Tomb Raider, когда отдельные полигональные конструкции проёма просто резко исчезают из сцены, оставляя пустое пространство. Стрелками отмечены исчезающие фрагменты
![](/upload/setka_images/14014010022025_67577da4d8977ebae7bbc26fe09eaca85147b425.gif)
Зазоры между полигонами
Подобное явление встречается при специфической конструкции полигональной сетки, пример которой можно увидеть ниже.
![](/upload/setka_images/14015510022025_c0c954a3a268bfc515e88839a41a25de5bd1b194.jpg)
Грань куба разбита на три треугольника — один большой и два поменьше. У последних есть общая вершина в центре одного из рёбер большого треугольника.
При статическом изображении структура останется цельной. Но в динамике координаты вершин 3D-модели рассчитываются в реальном времени — и архитектура PS1 не может корректно обработать координаты вершин ребра, соединённого с вершиной другого треугольника. В результате между смежными сторонами образуется характерный зазор.
![](/upload/setka_images/14015510022025_cece785eb92cd643f5e788e5f37e3d933a76f56c.jpg)
Изображение: Sony Computer Entertainment / Tomb Raider / Core Design
По этой причине в документации к девкитам Sony рекомендовала разработчикам выстраивать геометрию таким образом, чтобы стороны одного треугольника совпадали со сторонами других и имели общие вершины на обоих концах. Наглядный пример такой сетки можно увидеть на схеме ниже.
![](/upload/setka_images/14015510022025_2229e417950c39bd1ac90259b6c781a232a40430.jpg)
Отсутствие MIP-маппинга
В компьютерной графике MIP-маппингом называют метод текстурирования, при котором создаётся несколько копий одной текстуры с разной детализацией — от стандартного разрешения до самого минимального.
Некоторые разработчики решали эту проблему в PS1 с помощью кода. Например, в Wipeout MIP-уровни хранились на CD, и игра сама подгружала подходящие текстуры, исходя из того, насколько далеко текстурированный фрагмент сцены находился от внутриигровой камеры.
![](/upload/setka_images/14015510022025_71b97f3681cfd481f98f8279e17d064ae63ea66a.jpg)
Изображение: Phoboslab
Nintendo 64, к слову, поддерживала MIP-маппинг. И хотя метод избавлял игры от пикселизированной картинки, из-за низкого разрешения тогдашних игр текстуры порой выглядели чересчур размытыми. Поэтому графика на приставке часто подвергалась критике.
Компенсация ограниченной цветовой палитры дизерингом
Под дизерингом (англ. — Dithering) подразумевается особый вид шума, который в контексте компьютерной графики имитирует более широкий спектр цветовой палитры за счёт создания определённых узоров из пикселей двух текущих цветов.
![](/upload/setka_images/14015510022025_b96f49b701f581862428f9c58e1a46c731d0aa89.jpg)
Скриншот: игра Metal Gear Solid / Konami
Дизеринг был по умолчанию встроен в графический процессор PS1 и применялся на все текстурированные модели, даже несмотря на то, что приставка относилась к 24-битным системам и поддерживала более 16 миллионов цветов. Позже моддеры нашли решение, как обойти эту особенность в рамках эмулятора.
Деформация и искажение текстур
Когда внутриигровая камера в играх PlayStation направлялась на объекты под углом, текстуры на них сильно искажались. Это явление происходило из-за аффинного наложения текстур (Affine Texture Mapping), при котором интерполяция UV-координат между вершинами происходила только в значениях X и Y — то есть в 2D-пространстве, игнорируя значение глубины Z, отвечающее за перспективу. Все тексели при этом оставались одинаковых размеров. Для каждого треугольника полигональной сетки текстура всегда накладывалась параллельно двум сторонам треугольника (катетам). А так как при изменении перспективы треугольники отрисовывались разных размеров, посередине возникало искажение. В результате изображение начинало плыть.
![](/upload/setka_images/14015610022025_d75dd4921f9f5ca9dc828e1efafbd5a21dfa9c5d.jpg)
Скриншот: игра Tomb Raider / Core Design / Eidos Interactive
В теории эту проблему можно решить, разбив площадь на большее количество треугольников и тем самым сведя артефакты к минимуму. Но такой подход слишком ресурсозатратный, так как полигональная сетка даже самых примитивных объектов, например пола или потолка, усложнилась бы в разы.
Плоское затенение и затенение методом Гуро
В середине 1990-х компьютерная графика не могла похвастаться современными технологиями освещения. PlayStation поддерживала только два типа — плоское затенение, при котором каждой грани присваивалось определённое значение освещения, и затенение по Гуро. В последнем методе значения присваивались каждой вершине и интерполировались по всей грани. В результате светотень выглядела более плавной и органичной. Интерполяция, используемая при затенении Гуро, производилась по тем же алгоритмам, что и у текстур, поэтому в светотени всё равно возникали искажения. Но они не так сильно бросались в глаза, как искривления рисунка текстуры под углом.
Эстетика PlayStation 1 в наши дни
Чтобы создать игру в стилистике первой PlayStation, совсем необязательно писать собственный движок с нуля на языке C для полной аутентичности. Подобный стиль в принципе нетребовательный, и его можно воссоздать на любом движке, поддерживающем трёхмерную графику. Рассмотрим несколько пунктов, на которые стоит обратить внимание, чтобы добиться максимального сходства с играми на легендарной приставке.
Моделирование
В качестве инструмента для создания низкополигональных моделей подойдёт любая программа для 3D-моделирования, в том числе бесплатная Blender. Во время создания модели желательно отдавать предпочтение примитивным, угловатым формам.
![](/upload/setka_images/14015710022025_b76bc71fa80c20942ed01e19c21ead7b69ad6b89.jpg)
Например, торс персонажа можно сформировать из куба, немного подразделить структуру примитива, а затем подогнать образовавшиеся грани под нужную форму туловища. Для рук в качестве основы вполне подойдёт шестигранный цилиндр или куб, из которых также можно сформировать плечо и предплечье. Главное — сохранять примитивную структуру полигональной сетки, избегая детальной проработки и применения Групп сглаживания (Smoothing Groups), характерных для высокополигонального моделирования. Помните, что полигональная сетка должна оставаться простой. Используйте образы персонажей из игр PlayStation в качестве референса и следите за тем, чтобы общее количество полигонов не превышало 500. Если получится меньше — ещё лучше.
При создании UV-развёртки соблюдайте стандартные правила обозначения швов и старайтесь отмечать их в местах предполагаемых стыков. Например, если речь идёт о голове — отмечаем шов ровно по линии затылка или по бокам. В дальнейшем на этом UV-острове можно немного увеличить область, где должно располагаться лицо, и наложить на эту область текстуру лица. Получится своеобразный эффект плоской маски, который присутствовал у многих персонажей из игр на PS1.
Также можно рассмотреть программы для создания 3D-моделей на основе тайлов — Crocotile 3D или Blockbench.
Текстурирование
На основе UV-развёртки можно готовить текстуры — в Photoshop, GIMP или любом другом графическом редакторе для работы с 2D-изображениями, в котором можно настроить специальные параметры разрешения и цветовой палитры (о них чуть ниже). Для текстурирования фрагментов подойдёт как готовая фотореалистичная основа (её необходимо правильно распределить по сегментам UV), так и нарисованные вручную текстуры поверх сетки UV-островов.
Чтобы экспортировать UV-карту в Blender как изображение для дальнейшего редактирования, в режиме UV Editing необходимо развернуть вкладку UV и выбрать последний пункт — Экспортировать UV-развёртку (Export UV Layout).
У каждого художника может быть свой набор инструментов и техник для получения желаемой текстуры в стиле PS1. Если говорить о примерном пайплайне работы с подобным типом контента, он может выглядеть следующим образом.
В редактор загружаем карту с UV-островами, после чего на них можно нарисовать желаемое изображение вручную или перенести готовые слои изображений и адаптировать их под форму UV. Например, на центральной части UV-острова головы можно разместить фото лица, подогнав его под форму граней, и проделать аналогичные манипуляции с заполнением остальных UV-шеллов. При необходимости деталям можно добавить авторских штрихов — например, нанести тени и блики на складки одежды или на части тела.
После всех манипуляций размер изображения необходимо уменьшить до 128×128 пикселей (для получения более детализированных текстур можно выбрать 256×256). В Photoshop окно масштабирования изображения вызывается комбинацией Alt + Ctrl + I. Также можно открыть окно вручную: Изображение (Image) — Размер изображения… (Image Size…).
Определившись с размерами, необходимо выбрать метод интерполяции при изменении масштабирования — иными словами, решить, насколько картинка станет пикселизированной. В Photoshop за это отвечает функция Ресамплинг (Resample), где по умолчанию стоит параметр Автоматически (Automatic), визуально сглаживающий изображение. Нам же необходимо добиться зернистой (пиксельной) картинки, характерной для PS1, поэтому выбираем опцию По соседним пикселям (чёткие края) (Nearest Neighbour (hard edges)).
![](/upload/setka_images/14015810022025_1c076733da30d01108464d85a8ffad1517acec59.jpg)
Скриншот: Adobe Photoshop / Adobe
Остаётся только добавить ограничения для цветовой палитры, так как для PS1 характерно урезание глубины цвета. Вызываем окно Сохранить для Web (старая версия)… (Save for Web (Legacy)…) комбинацией Alt + Shift + Ctrl + S. Опцию также можно найти в Файл (File) — Экспортировать (Export).
В окне нужно выбрать формат будущего файла (верхняя вкладка справа) — меняем GIF на PNG-8. Так как на практике большинство игр PS1 в основном отображало 15 бит на пиксель (32 768 цветов), подобные ограничения цветовой палитры можно сымитировать, выбрав значение «16» в пункте Цвета (Colors). Для большей аутентичности можно добавить дизеринг. Для этого нужно развернуть четвёртую вкладку слева и выбрать Случайное (Diffusion).
![](/upload/setka_images/14020010022025_1cc7c7aaff1472b38801633d33e2f9e6221a290f.jpg)
Скриншот: Adobe Photoshop / Adobe
Примечание
Важно помнить, что дизеринг в PS1 — это особенность рендеринга консоли, в самих же текстурах шум отсутствовал. Поэтому, если вы создаёте ассеты для игры, а не для визуализаций или артов, — рекомендуется обратить внимание на тематические фильтры постобработки для движков или фреймворки.
Анимация
Ранее уже упоминалось, что в играх той эпохи движения героев были достаточно простыми, порой даже резкими и неестественными из-за манипуляций с вершинами. Это стоит учитывать при анимации персонажей в проекте.
Как правило, для персонажа по подобию человека можно создать простой скелетный риг и сделать набор примитивных анимаций на основе ключевых кадров. Здесь нужно отметить, что для персонажей из игр на PS1 характерны перемещения конечности целиком — то есть если двигалась нога, двигался весь меш ноги. Поэтому, к примеру, для рига человека достаточно трёх костей на одну ногу (для бедра, голени и стопы). Для некоторых животных может быть достаточно и одной кости на лапу.
Прочие особенности
Чтобы сымитировать искажение и дрожание текстур, усечение геометрии и другие ключевые особенности визуального стиля PlayStation, придётся прибегнуть к программированию фреймворков. Впрочем, на тематических порталах и маркетплейсах можно найти готовые решения в виде шейдеров и постпроцессинга. Ниже — список некоторых таких наработок:
- PSX Shader Kit для Unity;
- PSX Retro Shader для Unity;
- PS1 Shader для Godot;
- Retro Shader Pack для Unreal Engine 4;
- Retro Graphics для Unreal Engine 5;
- набор инструментов Drips PSX EFX для Blender;
- кастомные рендеры по типу Polybox.
Стоит помнить, что универсальных рекомендаций в этой области дать невозможно, так как у каждого движка и программы для 3D-моделирования своя специфика. Так что для каждого отдельного проекта придётся искать решения на форумах разработчиков или даже вырабатывать свои собственные. А ещё не забывайте, что можно проявить творческую смекалку и подойти к воплощению стиля другим путём — например использовать фильтр VHS в качестве постобработки, который также добавит визуальных искажений.
Подведём итоги
Самобытный визуальный стиль первой PlayStation стал своего рода компромиссом между прогрессивной для того времени графикой и массой технических ограничений. Сочетание низкополигональных моделей, пиксельной графики и артефактов до сих пор остаётся уникальным явлением в истории игр, привлекая как игроков, ностальгирующих по ретроприставкам, так и современных инди-разработчиков и дизайнеров. Шумиха вокруг демейков, 3D-артов и новых игр в стиле PS1 доказывает, что эта эстетика продолжает вдохновлять людей, сокращая пропасть между временем и технологиями.
![](/upload/setka_images/14020210022025_62bf1942effdabf0107c530d35221fdf53489254.jpg)
И всё же стоит понимать, что в идеале для разработки проекта в духе PS1 одного творческого подхода и копирования определённых технических стандартов уже недостаточно. Игра должна вписываться в современную индустрию. А для этого нужно переосмыслить наследие, которое оставила после себя приставка, и попытаться объединить его с современными тенденциями геймплея. В результате получится нечто новое — пусть и хорошо притворяющееся старым.
Полезные ссылки с ресурсами о PlayStation 1
- Технический обзор архитектуры PS1 от разработчика Родриго Копетти (Rodrigo Copetti).
- Подробный анализ визуального стиля PS1 и технические рекомендации по его воплощению на примере личного проекта от программиста и дизайнера Дэвида Колсона.
- Разработка анимации в духе PS1 на базе Cinema 4D (ютуб-канал pwnisher).
- Руководство по воссозданию стилизации PS1 в Blender (ютуб-канал Miziziziz).
- Создание тематических ассетов в 3ds Max (ютуб-канал Aaron Young). Также на этом канале найдётся много полезных материалов по разработке игры в духе PS1 на Unreal Engine.
- Ветка форума Unity, посвящённая разработке игр в стиле PlayStation.