« Архитектура PlayStation (index)

Архитектура PlayStation

Chapter 4: Графика


Содержание

  1. Размещение контента
  2. Создание сцены
    1. Команды
    2. Подход к видимости
    3. Растеризация
    4. Шейдеры
    5. Текстуры
    6. Оставшиеся шаги
  3. Дизайны
  4. Работа с VRAM
  5. Секреты и ограничения
    1. Искажённые модели и текстуры
    2. Противоречивые утверждения
    3. Предварительно отрисованная графика
  6. Видеовыход

Вкратце, большую часть графического конвейера берет на себя GTE. Он обрабатывает преобразование перспективы (которая позволяет создавать 3D-пространство на 2D-плоскости, используя ракурс камеры) и освещение. Затем обработанные данные передаются в проприетарный GPU Sony для рендеринга.

Размещение контента

Система обладает 1 МБ VRAM, используемым для хранения буфера кадра, текстур и других ресурсов, которые могут потребоваться GPU для отрисовки сцены. Центральный процессор может заполнить эту область с помощью DMA.

Оперативная память типа VRAM является двухпортовой, как в Virtual Boy. VRAM использует две 16-битные шины, которые допускают одновременный доступ между ЦП, DMA, ГП и кодировщиком видео.

Image
Схема памяти при использовании VRAM.

Image
Схема памяти при использовании SGRAM.

Однако в последующих ревизиях этой консоли Sony перешла на чипы SGRAM (вариант с одним портом, использующим одну 32-битную шину данных). Фу!... Ну, справедливости ради, оба вида чипов имеют свои плюсы и минусы. Одно можно сказать наверняка: из-за разницы в таймингах поздние игры (такие, как Jet Moto 3) будут показывать неправильную картинку на системах, использующих VRAM. Если вы хотите узнать поподробнее о таких вещах, как разные тайминги, в "Nocash PSX Specifications" от Martin Korth документированы многие подобные особенности .

Создание сцены

Если Вы читали статью о Sega Saturn, то я могу сказать, что дизайн этого GPU намного проще!

Итак, чтобы продемонстрировать, как рисуется сцена, я буду в основном использовать Spyro: Year of the Dragon от Insomniac в качестве примера. Имейте в виду, что внутреннее разрешение этой игры слишком мелкое (292 на 217 пикселей). Это не даёт мне чётко разобрать сцену на каждом этапе, поэтому я немного увеличил его для демонстрационных целей. Вот образец в оригинальном масштабе, если вам интересно.

Команды

Image
Базовый конвейер команд GPU.

Для начала, ЦП посылает геометрические данные (вершины) в ГП, заполнив его внутренний 64-байтовый FIFO-буфер командами (до трех штук). Эти команды могут запрашивать отрисовку чего-либо на GPU, изменять настройки или манипулировать видеопамятью.

По сути, команда отрисовки описывает, как и где рисовать примитив. ГП может рисовать индивидуальные линии, прямоугольники и треугольники - последние являются основным ингредиентом для композиции сложных 3D моделей.

После получения геометрии применяется отсечение (clipping), чтобы пропустить невидимые полигоны (в том числе и те, которые расположены за пределами обзора камеры).

Расположение примитива определяется координатной системой X/Y, указывающей на буфер кадра. GPU PS1 использует целочисленную модель координат, где каждая координата соответствует центру пикселя (под названием точка сэмплирования). Другими словами, тут нет дробных координат.

Подход к видимости

Image
Crash Bandicoot (1996). Эта игра использует заранее отсортированную геометрию для улучшения производительности . Именно поэтому камера может двигаться только вперёд или назад.

PS1, как и её конкуренты, не имеет какого-либо аппаратного решения проблемы видимости. Тем не менее GPU обрабатывает сортировку полигонов, предоставляя таблицу упорядочения: выделенную таблицу, в которой каждая запись индексируется с использованием значения глубины (также называемого "Z-значением") и содержит адрес команды для GPU .

Процессор должен сначала вручную отсортировать полигоны, а затем сослаться на них в нужной записи таблицы. Наконец, CPU приказывает DMA отправить таблицу на GPU. Этот процесс позволит GPU рендерить геометрию в правильном порядке.

Для оказания помощи как ЦП, так и ГП в создании этой таблицы и прохода по ней также предоставляются различные функции DMA.

Растеризация

Image
Каркасный вид сцены.

Как только графический процессор декодирует команды, наступает время преобразовать полученную геометрию (вершины) в пиксели. Это позволит системе произвести наложение текстур, эффектов и в конце концов вывести их на двумерную панель (ваш телевизор или монитор). Для этого GPU выделяет матрицу пикселей, используемую в качестве рабочей области, которая называется кадровым буфером. По сравнению с более сложной Sega Saturn, для GPU нужен только один кадровый буфер.

Растеризатор - это устройство, отвечающее за преобразование векторов в линии, треугольники или прямоугольники, а затем их в пиксели. Обработка сильно разнится в зависимости от запрошенного примитива :

В случае треугольника, единственного текстурируемого полигона, растеризатор сделает следующее:

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

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

Шейдеры

Image
Тонирование Гуро в действии.

Для применения световых эффектов над треугольниками или линиями графический процессор предоставляет два алгоритма:

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

Текстуры

Image
С наложенными текстурами (Тада!).

Треугольные поверхности ещё могут быть смешаны с текстурами (растровыми 2D изображениями), чтобы получить конечный результат.

Графический процессор выполняет обратное наложение текстур, которое заключается в прохождении по каждому растеризованному пикселю и поиске соответствующего ему пикселя на текстуре (под названием тексель). Тексели рассчитываются с использованием линейной интерполяции текстуры (находящейся в VRAM) для соответствия форме полигона. Процедура, используемая для интерполяции, называется аффинным наложением текстур. Эта техника работает только с двумерными координатами (значения X и Y), отбрасывая тем самым третью координату (Z или "глубину"), используемую для перспективы.

Так как текстуры редко совпадают по размерам с растеризуемым полигоном, может возникнуть алиасинг (неправильные результаты). Он проявляется нежелательными искажениями, такими как пропущенные или увеличенные тексели. Чтобы избежать алиасинг, сложные ГП применяют фильтрацию текстур для сглаживания (интерполяции) резких изменений цвета. В нашем случае ГП PS1 не реализует какой-либо фильтр, так что он обходится алгоритмом ближайшего соседа для исправления масштаба без сглаживания результата. Этот алгоритм очень быстрый (и дешёвый), но это также объясняет, почему текстурированные модели могут выглядеть, как будто сделаны из блоков.

Блок GPU также включает в себя следующие возможные эффекты (для треугольников):

Стоит отметить, что PS1 преуспела в этих эффектах!

Оставшиеся шаги

После завершения отрисовки, ГП записывает пиксели в область кадрового буфера в VRAM, которая потом используется кодировщиком видео и выводится на экран.

Дизайны

Давайте сделаем перерыв от всей этой теории. Вот несколько примеров игровых персонажей, разработанных с нуля для эры 3D. С ними можно взаимодействовать, поэтому я предлагаю вам их оценить!

3D model 3D model 3D model
Интерактивная модель доступна в современной версии
Spyro the Dragon (1998).
413 треугольников.

3D model 3D model 3D model
Интерактивная модель доступна в современной версии
Crash Bandicoot (1996).
732 треугольника.

Работа с VRAM

С доступным объемом VRAM (целый мегабайт) возможно разместить огромный буфер кадра размером 1024×512 пикселей с 16-битными цветами или практичный размером 960×512 пикселей с 24-битными цветами, позволяющий рисовать лучшие кадры, которые когда-либо показывала любая игра... Звучит впечатляюще, не правда ли? Что ж, тут возникают некоторые трудности, например:

Хорошо, давайте вместо этого возьмём буфер размером 640x480 с 16-битными цветами, что оставляет для материалов 424 КБ VRAM. Пока что все хорошо. И опять же, такое разрешение будет неплохо выглядеть на мониторах с ЭЛТ, но на тех телевизорах, которые имелись у каждого в доме в 90-х годах, разница неощутима. Так если ли способ оптимизировать буфер кадра ещё лучше? Знакомьтесь, настраиваемые кадровые буферы.

Image
Визуализация VRAM в отладчике NO$PSX. Вы можете заметить два буфера для кадров вместе с текстурами (они будут переведены с помощью таблицы поиска цвета, которая хранится тут же).

По сути вместо того, чтобы тратить драгоценную VRAM на "неприемлемые" разрешения, графический процессор этой консоли позволяет уменьшить буфера кадра, чтобы фактически увеличить свободное место, доступное для других ресурсов. В "Gears Episode 2" Halkun показывает способ, позволяющий разделить буфер с разрешением 640x480 на два по 320x480, а затем полагающийся на технику под названием page-flipping для отрисовки одновременно нескольких сцен.

Данная техника заключается в переключении расположения кадра для экрана между двумя доступными всякий раз, когда игра этого захочет, что позволяет игре рисовать одну сцену, пока на экране отображена другая. Это позволяет избежать мерцания и улучшить время загрузки (то, что игрок, безусловно, оценит!).

В целом, предложенная Халкуном компоновка потребляет всего 600 КБ VRAM. Остальная часть (424 КБ) может использоваться для хранения таблиц цветов и текстур. В сочетании с доступным кэшем текстур объемом в 2 КБ получается очень удобная и эффективная конфигурация.

Наконец, стоит упомянуть, что VRAM может быть заполнена с помощью нескольких цветовых глубин одновременно. Это означает, что программисты могут выделить 16-битные буферы рядом с 24-битными изображениями (используемыми, например, кадрами FMV). Это еще одна особенность, которая облегчает дальнейшую оптимизацию.

Секреты и ограничения

Хоть PS1 и имеет очень простую и удобную архитектуру, проблемы в любом случае будут возникать. Удивительно, что некоторые из них были решены весьма умными трюками!

Искажённые модели и текстуры

Video
Video - Final Fantasy VIII от Square Soft (1999). При перемещении текстуры немного дёргаются.

Известно, что процедуры, используемые для обработки геометрии и наложения текстур, содержат некоторые неточности.

Для начала, растеризатор работает только с целыми пикселями: В то время как координаты вершин заданы целыми числами, вычисляемые края треугольника могут занимать только долю пикселя. Однако растеризатор нарисует пиксель только если область треугольника покрывать точку сэмплирования пикселя, и он не будет запоминать занимаемую долю . Это порождает некоторые проблемы:

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

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

Более того, уменьшение разрешения буфера кадра может усилить все эти проблемы с алиасингом.

В конце концов, как вам известно, аффинные преобразования игнорируют глубину перспективы. Это может сбить с толку восприятие пользователя, когда камера находится близко к модели и расположена перпендикулярно зрителю . Этот эффект также называют искажением текстур (texture warping). Поэтому для устранения искажения некоторые игры прибегают к тесселяции (разделение большого полигона на несколько маленьких), а другие просто заменили текстуры на сплошные цвета. В общем, GPU решает эту проблему путём применения коррекции перспективы, которая интерполирует текстуры с помощью значения глубины.

Противоречивые утверждения

Зайдя на различные технические каналы или форумы, вы обнаружите альтернативные объяснения об эффектах тряски/искажения на PS1. Некоторые из них совпадают с тем объяснением, которое я дам ниже, но другие могут доказывать обратное. Так что я бы хотел поделиться своим мнением о том, почему следующие заявления не соответствуют действительности:

Модели/текстуры трясутся из-за отсутствия FPU

FPU не определяет возможность компьютера работать с дробными числами. Как и любой другой компьютер без FPU, PS1 по-прежнему может выполнять арифметику с фиксированной точкой. Более того, с помощью программной эмуляции можно также вычислять и числа с плавающей точкой (хотя и не так быстро). Короче говоря, FPU - это просто ускорители, не путайте их с ALU (арифметико-логическое устройство, важная часть процессора, которая делает вычисления) или десятичными числами.

Модели/текстуры трясутся из-за использования целочисленных координат в ГП

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

Текстуры искажаются из-за отсутствия MIP-текстурирования

Графические процессоры, которые реализуют обратное наложение текстур, как в нашем случае, подвержены ошибке измерения под названием "undersampling" (один пиксель наложен на несколько текселей). Это и создаёт алиасинг (неправильные результаты). Поведение заметно при отображении геометрии вдалеке от камеры. Для исправления этой проблемы современные устройства наложения текстур применяют "трилинейную фильтрацию", которая смягчает тексели, использующие те же текстуры, но в разных масштабах (MIP-текстуры) и применяет интерполяцию между ними. То есть, MIP-текстурирование - это подход к решению алиасинга. Проблема в аффинном наложении текстур (не имеющем коррекции перспективы), которое интерполирует текстуры на трёхточечных поверхностях, не учитывая глубину. Отсюда и берётся эффект "искажения".

Модели/текстуры мерцают из-за отсутствия Z-буферизации

ГП с Z-буфером решает проблему определения видимых поверхностей на аппаратном уровне. PS1 полагается на таблицу сортировки, а это значит, что разработчики берут ответственность за то, какая геометрия будет стоять перед какой. Короче говоря, любое мерцание треугольников на моделях вызвано процедурами сортировки (на уровне ПО), так что и решается эта проблема программно.

Предварительно отрисованная графика

Image
Final Fantasy VII от Square Soft (1997). Сцена с предварительно нарисованным фоном. То, как модели взаимодействуют и двигаются - важно, чтобы обмануть чувство восприятия зрителя.

Давайте для разнообразия обсудим какую-нибудь "положительную" особенность...

Если игра стремилась к более реалистичным сценам, чем мог обеспечить GPU, одним из доступных вариантов было сложить два треугольника и использовать Motion Decoder для рисования на них предварительно отрисованных роликов. FMV-видео может занимать много места, но к счастью, CD-ROM к такому был готов.

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

Видеовыход

Первая ревизия консоли оказалась удивительно щедрой на количество видео сигналов со следующими портами:

Последующие ревизии консоли убрали эти порты и в конце концов остался только "AV Multi Out".


Previous: 3. Процессор

Next: 5. Звук


Rodrigo Copetti © 2026 RSS Feed

Переключиться на современную версию

Домашняя страница · Статьи · Поддержка · Об авторе · О сайте