Главная » Статьи » Эмуляция

Краткая история "улучшайзеров" отрисовки

В этой статье мы рассмотрим различные ограничения аппаратной части PS1 в отрисовке и проследим краткую историю становления "улучшайзеров" в эмуляторах. Посмотрим с чего мы начинали, куда пришли, и что будет дальше.

Технология отрисовки

Оригинальная консоль для трёхмерных вычислений использовала GTE - специальный проприетарный чип для отрисовки трёхмерной графики. При его разработке пришлось пойти на множество компромиссов, которые определили внешний вид будущих игр. Нужно понимать, что во время разработки этого чипа DirectX ещё не существовал даже в зародыше, а существенные 3D вычисления в основном производились на дорогущих рабочих станциях от Silicon Graphics.

Конечно, на ранних этапах становления эмуляции, как обычно, доступна только медленная программная отрисовка. Но быстро стало понятно, что в целом возможность прикрутить аппаратное ускорение существует, Bleemcast не даст соврать. Долгое время стандартом для PS1 эмуляции был OpenGL, поскольку альтернативы на DirectX новее 6-ой версии так и не появилось. Но в современных эмуляторах вам уже доступны и OpenGL, и DirectX 11, и даже более свежий Vulkan. В целом для конечного пользователя нет разницы на какой технологии бегает эмуляция, это сугубо зависит от железа. Если вы пытаетесь запустить D3D11 на видеокарте с D3D10, очевидно, у вас ничего не выйдет.

Ну и естественно программная эмуляция до сих пор доступна и мощности современных процессоров с лихвой покрывают нужды оригинального железа. На случай нестерпимой ностальгии по оригиналу.

Разрешение экрана

В отличие от ранних консолей с фиксированным размером кадра, PS1 поддерживала несколько разных режимов вплоть до 640x480, однако большинство игр использовало более скромные режимы от 320x240 до 512x240, чтобы обеспечить двойную буферизацию и в целом успеть отрендерить больше контента за отведённое время кадра. Очевидно, что одним из первых решений по облагораживанию картинки в эмуляторах стало увеличение разрешения. Для этого достаточно отрисовку выполнять в более крупный буфер, но при этом умножать все координаты полигонов на соответствующую разницу между оригинальным разрешением и увеличенным.

Одним из первых эмуляторов, который позволял провернуть этот трюк был тот самый Bleem и Bleemcast, благодаря которому Gran Turismo на Dreamcast выглядел куда более привлекательно.

Позднее в эмуляторских кругах заметили, что в части 2D игр изменение разрешения влияет на отрисовку 2D элементов, а именно, при заполнении сетки тайлами между ними могут возникать тонкие полоски шириной в пиксель - они возникали из-за неточноти деления. Именно по этой причине в современных эмуляторах вы скорее всего увидите не выбор разрешения, а целочисленный множитель, то есть оригинальный размер уможается на 2, 3, 4 и т. д. Это конечно позволяет избежать проблем при пересчёте координат, но с другой стороны, несоответсвие размеров буфера кадра и экрана приводит к необходимости дополнительного изменения размера, а это может приводить к замыленной картинке.

Глубина цвета

Ещё одной очевидной проблемой, ну или скорее ограничением, являлось использование режима 16бит для буфера кадра. Для решения проблемы нехватки цветов был реализован аппаратный дизеринг, который производил конверсию между вычилсенным 24 битным RGB цветом и 16битным буфером, добавляя паттерны шума в градиенты. При эмуляции в 24 бита этот механизм просто не нужен, поэтому эмулированные игры часто отличаются от оригинала более ровными градиентами, а в 16бит обычно есть переключатель для дизеринга.

Антиналожение (антиалиазинг)

Конечно, когда скорости консоли едва хватает на отрисовку самих полигонов, думать ещё и о лесенках по краям крайне расточительно. Тем более, во времена PS1 большинство всё ещё играло на ЭЛТ телевизорах/мониторах, а его аналоговая сущность вносила натуральное сглаживание в картинку. При эмуляции же мы видим сырые пиксели, ну и естественно лесенки во всей красе. В принципе, если эмулятор использует хоть какое-то аппаратное ускорение для отрисовки, видеокарта сама может докинуть антиналожение через настройки. Поэтому даже ePSXe, в котором отродясь такой опции не было, может применить данное улучшение. В современных эмуляторах вы найдёте эту опцию из коробки, ну а первым также можно отметить Bleemcast - мощностей Dreamcast уже хватало на расчёт сглаженных по краям полигонов.

Фильтрация текстур

Всё раннее 3D легко отличить визуально по огроменным растянутым на весь экран пикселям. всё потому, что мощностей на сглаживание банально не хватало. Первой консолью с фильтрацией текстур стала N64. А на ПК фильтрацию текстур принесли 3D ускорители. В целом, алгоритмов растягивания текустур величайшее множество, но в аппаратной части мы прошли следующий путь: билинейная -> трилинейная -> анизотропная -> уровни анизотропии (больше лучше). На данный момент алгоритм анизотропной фильтрации 16x пожалуй покрывает все потребности по чёткой отрисовке отфильтрованных текстур.

Однако в эмуляции этот параметр прошёл несколько более странный путь. Тот самый Bleemcast умел выполнять билинейную фильтрацию, но вот другие эмуляторы почему-то долгое время не спешили реализовывать данную фичу. В ePSXe например был доступен только алгоритм 2xSaI (приносим глубочайшие извинения эмулятору ePSXe, там есть билинейная фильтрация из коробки, но способ настройки неочевиден), но он приводил к не самым радужным результатам и требовал больше видео памяти. В Retroach и нынче помимо обычной билинейной фильтрации есть куча странных алгоритмов, некоторые из которых способны сломать игру визуально и вносят немалый оверхэд по производительности. Плюс, эти алгоритмы зачастую заточены под скейлинг 2D спрайтов 16битных консолей, а вот с "фотореалистичными" текстурами они работают так себе.

Мип-маппинг (которого нет)

В продолжение вопроса о фильтрации текстур, может показаться странным, но фактически ни один эмулятор до сих пор не ввёл поддержку мип-маппинга - аппаратного уровня детализации текстур. Часть разработчиков самостоятельно решали данный вопрос, вводя текстуры 2-3 размеров (например серии Crash и Spyro, и надо сказать для эмуляции это скорее минус, чем плюс), но в большинстве случаев, мы приходим к тому, что даже на высоких разрешениях удалённые текстуры слишком большого размера банально мерцают. Анизотропная фильтрация с мип-маппингом элегантно решает эту проблему, но в эмуляции PS1 по какой-то причине это всё ещё невиданный зверь.

Широкий экран

В эпоху становления ЖК-панелей и экранов с LED подстветкой мир начал медленное движение в сторону соотношения сторон 16:9. В начале жизни PS2 часть игр всё ещё работала в 4:3, но уже начал появляться переключатель для соотношения сторон. Понятно, что во время жизни PS1 все игры писались под 4:3. А это значит, что все параметры для 3D расчётов также подгонялись под это соотношение. Тем не менее, это не значит, что приставка не могла рендерить 16:9. В конце концов, это всего лишь параметр в матрице, и если его поменять, мы можем получить любое значение, какое захотим. Ну, это в теории. На практике, когда поддержка широкого экрана появилась в эмуляторах через хак GTE чипа, выяснилось, что немалое количество разработчиков, не будучи дураками, отрезали всё, что выходило за рамки 4:3, поэтому во многих играх наблюдаются "дырки". Также 2D элементы обычно рисуются в кадр напрямую (например игровой интерфейс), поэтому такие элементы остаются растянутыми.

К сожалению, решить данную проблему аппаратно невозможно - для этого нужно править сами игры. Чем собственно и занялись с 2014 года пользователи форума pscx2. Они написали великое множество патчей для кучи разных игр первой playstation: https://forums.pcsx2.net/Thread-PSOne-Widescreen-Patches

В pcsx2 реализована база таких патчей и они применяются по умолчанию, а вот в PS1 эмуляции такого до сих пор нет, и к сожалению в ближайшем будущем не предвидится. Так что применять только ручками.

Шейдеры

К середине нулевых уже практически все игры требовали поддержки шейдеров от аппаратных ускорителей. Конечно, засунуть шейдеры в уже готовую игру сложно, но вот полноэкранные эффекты вполне работают. Большинство из них написано по фану и рассматривать их в качестве реального улучшения картинки довольно трудно, но как факт, поддержка шейдеров имеется, и если вам захочется накинуть CRT фильтр, подкрутить контрастность или добавить мультяшности чёрными контурами - это всё можно сделать. В какой-то степени этот функционал сравним с ReShade на ПК и в целом скорее прикручен для галочки, чем для реального использования.

Попиксельная точность (sub-pixel precision)

Так перевели этот хак в ePSXe, хотя корректнее было бы перевести как межпиксельная точность. Вы все видели, какая на PS1 дёрганная картинка. Это всё потому, что чип GTE оперировал числами с фиксированной запятой (20 бит на целую часть, 12 бит на дробную). Это значит, что ваши вычисления каждый раз обрезались до определённой границы и для части из них это округление было критично. Например, это касалось положения вертекса на экране. Представьте, что вам нужно получить перемещение объекта в пределах между 0.01 и 0.02 а потом умножить это на координаты в мире. А вместе с тем помножить ещё на десяток параметров и на каждом шаге откусывается часть точности. Вот вам и природа дёрганий.

Первой попыткой улучшить результаты вычислений естественно стало увеличение той самой дробной части, чтобы она не отбрасывалась (вернее, отбрасывалась не так рано, если прям интересно, стоит почитать про IEEE 754) и это кое-где помогло уменьшить артефакты оригинального железа, но к сожалению игры писались с учётом железа и далеко не всегда это действительно кардинально влияло на картинку, поскольку часть информации всё равно терялось на этапе общения с GTE. А иногда это наоборот приводит к появлению артефактов там, где их изначально не было, потому что разработчики сами учитывали этот факт и специально полагались на округление дробной части.

Коррекция перспективы

При искажении полигона вглубь экрана, количество точек на дальнем конце сильно меньше, чем на ближнем. И чтобы текстура выглядела правильно, необходимо производить перерасчёт на каждой строке пикселей с учётом двух сторон. Однако, есть более дешёвые афинные преообразования, которые можно рассчитывать только по одной стороне. Но и выглядят они менее убедительно. Чтобы обеспечить скорость отрисовки при разработке Ps1 было решено отказаться от коррекции перспективы и это ещё один параметр, по которому легко узнать игру для PS1. Интересно отменить, что именно отсутствие коррекции перспективы взбесило Джона Кармака при разработке портов Doom и он запретил использовать аппаратное ускорение. Только CPU, только хардкор. Поэтому многие консольные порты Doom урезаны и плохо масштабируются в эмуляторах.

Некоторые разработчики за время работы тоже поняли, что выглядит это мягко говоря не очень презентабельно, поэтому некоторые из них начали резать полигоны, которые находятся ближе всего к камере на более мелкие. Такая вот "тесселяция" на PS1 (скриншот снизу, последняя колонка). Это позволило уменьшить искажение и увеличить детализацию. В основном эта техника относится к более поздним играм. Яркий пример - это Crash Team Racing, очень заметно, если понаблюдать за игрой в режиме рендера сетки (wireframe).

Полностью же решить же проблему коррекции перспективы в эмуляции удалось только с появлением PGXP.

Буфер глубины (Z-buffer)

Playstation известна тем, что в нём нет аппаратного буфера глубины, а отрисовка производится по сути в 2D. То есть GTE производит умножения векторов на матрицы, а по итогу выплёвывается информация о том, в каких 2D координатах нужно рисовать треугольник. Это порождало проблему сортировки - если вы отрисуете героя раньше дома, который находится за ним, то уже при отрисовке дома он просто закрасит героя. Поэтому порядок отрисовки треугольников должен был определятся разработчиком. И если чаще всего это можно было сделать малой кровью, иногда бывают неразрешимые задачи. Именно поэтому вы можете видеть капот машины сквозь боковое стекло в Gran Turismo.

Для решения этой проблемы во времена 3Dfx стали использовать дополнительный буфер, чаще всего размерностью в 1-2 байта, куда записывается удалённость данного вертекса от экрана. При отрисовке того же дома видеокарта сверится с буфером глубины, увидит, что часть пикселей дома по глубине уже перекрывается и просто не отрисует их. Таким образом с буфером глубины порядок отрисовки уже неважен. Сама технология описана в 1974 году, но мощности появились только через 25 лет.

"Плоская" природа отрисовки Playstation долгое время не позволяла использовать буфер глубины, поскольку значение глубины приставка просто выкидывала. Данную проблему удалось решить только с помощью PGXP.

PGXP

2016 году некто по имени iCatButler взорвал интернет, поскольку ему удалось "прокинуть" исходные трёхмерные данные как бы параллельно основным вычислениям, и с помощью них построить буфер глубины. Это означало, что теперь эмуляция производится в "истинном" 3D - нам доступно относительное положение объектов друг от друга, а значит можно исправить множество багов, которые вносило оригинальное железо, а также реализовать различные шейдеры, которые опираются на глубину, например Depth of Field, когда объект замыливается тем сильнее, чем дальше он удалён от камеры.

С 2016 года механизм постоянно улучшался и на данный момент практически доведён до идеала. К сожалению, это всё равно не серебряная пуля и часть игр продолжают "воблить". Лучшая имплементация PGXP на данный момент пожалуй в проекте ReDriver2, но это не эмулятор, а более глубокий порт игры на ПК.

В современных эмуляторах PGXP это несомненная "киллер-фича", и по этой причине ePSXe фактически выбыл из гонки. Сейчас флагманами являются Retroach со своим BeetlePSX ядром и DuckStation.

Задел на будущее - текстурные моды

На самом деле, в современных эмуляторах уже есть возможность подменять текстуры. Однако из-за природы PS1, делать это не так просто, как на других консолях. Пока есть ограничения, не для всех игр это работает одинаково хорошо, но когда-нибудь эта проблема будет решена и мы наверняка увидим улучшенные нейросетью текстуры по крайней мере для самых популярных игр PS1.

Задел на будущее - VR

Эмулятор Dolphin для GameCube и Wii поддерживает VR режим для 3D игр. Тоже самое может появится и в играх PS1. Эксперименты уже проводились в 2018 году и возможность доказана, но мэйнстримные эмуляторы пока ещё не ступили на дорожку виртуальной реальности.

Статья про EmuKit 2 от 2018 года: https://medium.com/webmr/emukit-2-immersive-psx-n64-vr-on-the-web-7c1ec110a592

Категория: Эмуляция | Добавил: UltraTaber (06.06.2021) | Автор: UltraTaber
Просмотров: 671 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории

Эмуляция [15]
Статьи по эмуляции.
Прочие статьи [7]
Прочие статьи.
Русификация игр [1]
Статьи по русификации игр для PSX
Приставка [8]

Авторизация

Чат


Опрос

Переводы каких студий Вам ближе?
Всего ответов: 142

Статистика


Посетителей на сайте: 1
Гостей: 1
Пользователей: 0