[Перевод] Как работала графическая система Sega Mega Drive: Video Display Processor

uwofrn-7jbtndstyuaq91sofi6m.png


Описание концепции VDP


  • VDP
    • »Video Display Processor»
    • Чип видеоконтроллера, занимающийся работой с тайловой графикой, плоскостями скроллинга и спрайтами Genesis. На самом деле не является процессором.
  • VRAM
    • »Video RAM»
      • RAM (ОЗУ), используемая VDP
      • Содержит тайлы (изображения размером 8×8 пикселей)
  • Два основных типа консолей
    • Консоли NTSC
      • «Sega Genesis», 60-герцовые машины, в основном распространённые в США
      • Разрешения
        • Режим H40 — 320×224 пикселя (40x28 тайлов). Самый распространённый режим разрешения
        • Режим H32 — 256×224 пикселей (32x28 тайлов). Менее популярный режим разрешения
      • Наша студия Mega Cat выпускает NTSC-игры, поэтому использует эти разрешения!
    • Консоли PAL
      • «Sega Mega Drive», 50-герцовые машины, продавались во всём остальном мире
      • Разрешение
        • Режим H40 — 320×240 пикселей (40x30 тайлов). Самый распространённый режим разрешения
        • Режим H32 — 256×240 пикселей (32x30 тайлов). Менее популярный режим разрешения


23659da869b99ff768808e16cc3b62c1.jpg

Слева: NTSC Model 2 Sega Genesis, справа: PAL Model 2 Mega Drive (европейская)

3 плоскости графики


2 плоскости скроллинга

Plane B — плоскость фона. Отображает тайловую графику при помощи тайловых карт.

Plane A — плоскость переднего плана. Отображает тайловую графику при помощи тайловых карт. Window subplane — подплоскость для Plane A, графика которой не скроллится с остальной плоскостью.

Каждая строка тайлов рендерится столбец за столбцом. Тайлы на каждой плоскости могут иметь приоритет: высокий или низкий.

78fb90f779bcd55d8d9de6ea50946628.jpg


Тайлы для спрайта, отрендеренные в обычном формате (4×4 тайла)

1 спрайтовая плоскость

Отрисовывает спрайтовую тайловую графику.

Внутри консоли спрайты рендерятся в обратном порядке, т.е. каждый столбец тайлов рендерится по строкам.

Спрайты располагаются в виртуальном пространстве 512×512 пикселей, где координаты (128,128) совпадают с верхним левым углом телеэкрана.

Genesis одновременно может отображать на экране до 80 аппаратных спрайтовGenesis может отображать примерно 20 спрайтов в одной растровой строке, при большем количества возникают проблемы с переполнением спрайтов и они перестают отображаться.

Для аппаратных спрайтов размеры ограничены (w x h), где w — ширина, h — высота, принимающие значения 1–4 тайла.

Спрайты больше размеров аппаратных спрайтов можно получить при помощи нескольких спрайтов.

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

77cb84a65af06d7069d595b54c1e5850.jpg


Тайлы для спрайта внутри консоли рендерятся в спрайтовом формате (перемещённые и размером 4×4 тайла)

79b4d93498ee4c2089e12e7e44c363a0.jpg


Наглядное представление приоритета слоёв плоскостей
Источник: Genesis Software Manual

VDP CRAMColor RAM» — «цветовое ОЗУ»)

4 строки палитр, в каждой из которых 16 цветов

Каждый цвет имеет глубину 4bpp (4 бита на пиксель)

Первый цвет — это прозрачный цвет графики тайлов

Строки палитр могут рендериться в слегка более светлых или тёмных цветах при включении режимов highlight или shadow

aeb489a4ff90931b91e7aea7b2202d39.jpg


Фоны


Sega Genesis имеет 2 плоскости тайловых карт: плоскость фона («Plane B») и плоскость переднего плана («Plane A»). В зависимости от типа машины (NTSC или PAL) и используемого видеорежима (H40 или H32), полноэкранная тайловая карта будет занимать в ширину 32 или 40 тайлов и в высоту 28 или 30 тайлов. Каждый тайл состоит из изображения размером 8×8 пикселя, а каждый пиксель соответствует индексу цвета (0–15). Строго говоря, window plane является подплоскостью Plane A; её графика не скроллится с остальной частью Plane A. Плоскости можно использовать множеством разных способов, например, для полноэкранных слоёв переднего плана и фона, или для техники, которой знамениты многие игры для Sega Genesis: параллаксного скроллинга. Выполняя скроллинг отдельных строк тайлов на плоскостях с разной скоростью, можно создать иллюзию глубины. Тайлы на тайловых картах разных плоскостей могут иметь параметр приоритета: высокого или низкого. Этот параметр определяет, где должны отображаться спрайты (которые тоже имеют высокий или низкий приоритет), под тайлом, или над ним.

15f5c0d406fc20bb0ad4c052156e2060.jpg


3adaefa53b41042a5154db857f587566.jpg


610dac7e293fd022b20285c7e7e2e6a6.jpg


9ff6aaab4755501aef66d9764f120abc.jpg


4b6e577dc081d5e849c81ac003eed857.jpg


5654e4d04b45b40cb2e718e157cdaeb4.jpg

VSRAM

(Video Scroll RAM — видеопамять скроллинга)

Слои Plane A и Plane B могут иметь тайловые карты плоскостей скроллинга размером (w x h), где w — ширина в тайлах, h — высота в тайлах. Каждый из размеров может быть равен только 32, 64, или 128 тайлам. Эти плоскости скроллинга «прокручиваются внутрь/наружу» активного разрешения экрана (размер определяется типом машины и режимом H32/H40). Плоскости скроллинга размерами 128×64/64×128 и 128×128 недопустимы. По умолчанию части VRAM по стандартным адресам VRAM 0xC000 и 0xE000 отображаются как «мусорные тайлы», но на самом деле каждый пиксель в этих «мусорных тайлах» компактным образом кодирует тайловую карту VSRAM. Пользователь никогда не должен записывать в эти «мусорные тайлы» настоящие тайлы, иначе возникнут странные графические баги/сбои, замедления, или мусорные тайлы начнут отображаться на плоскостях скроллинга. Плоскости могут использовать 1 из 3 режимов скроллинга: по растровой строке, по тайлу, или по блоку (секции из 2×2 тайлов). Каждая плоскость может скроллиться одновременно по горизонтали и вертикали.

Цвет


Тайлы одновременно могут использовать только 1 из 4 строк палитр. Каждая строка палитры содержит 16 цветов. Первый цвет зарезервирован под прозрачный цвет, который рекомендуется делать розовым (255,0,255) (RGB). Чтобы сохранять в игре целостность стиля, для отдельных элементов можно выделить 1 или 2 палитры. Например, строка палитры 1 может использоваться для персонажа игрока, а строка палитры 2 — для элементов UI. Для отрисовки врагов, фонов и других изменяющихся элементов можно использовать различные палитры.

355ded81ea6ceb76a93ae362412a19bc.jpg


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

Существуют две популярные техники работы с палитрами — циклическая смена палитр (palette cycling) и растровые эффекты (raster effects). Благодаря смене цвета определённых элементов в отдельной строке палитры каждые несколько кадров можно реализовать такие эффекты, как водопад, пульсирующее освещение, и так далее.

Пример эффекта циклической смены палитр для мерцающих полос Берсерка в Zombie Football League


ecd52222d78153725b5e5d98c9d25d05.jpg


216134ec8ab9c799e35ad9d6229ec9e4.jpg


Растровые эффекты заменяют все или некоторые цвета строки палитры после определённой растровой строки. Мы не будем подробно рассматривать эту технику, но по сути она заключается в замене части всех цветов CRAM после прохождения электронного луча телевизора определённой горизонтальной строки развёртки. Эта техника полезна для реализации смены палитр для объектов, находящихся под водой. В частности, она используется для подводных цветов уровня Labyrinth Zone в игре Sonic the Hedgehog.

784cb79434e88396c05beb49600e14f3.jpg


Спрайты


8b4bc4312f5421bb76e489dfe2be7d09.jpg


Спрайт позы Эшли из Coffee Crisis

Спрайты в Sega Genesis задаются как изображения с размером (w x h), где w — ширина в тайлах, а h — высота в тайлах, которые могут принимать значения 1–4 тайлов. Каждый спрайт одновременно может использовать только одну строку палитры. Аппаратные спрайты могут иметь максимальный размер 4×4 тайлов. Sega Genesis может обрабатывать до 80 экранных спрайтов, по 20 спрайтов на одну растровую строку, однако чтобы избегать тормозов, лучше не достигать этого предела. Чтобы обойти ограничение на размеры аппаратных спрайтов, многие игры используют несколько спрайтов, собирая из них одного персонажа/объект. Принцип создания классического пиксель-арта заключается в том, чтобы выбрать достаточно большое разрешение для обеспечения нужной детализации и читаемости изображения, но достаточно малое, чтобы его можно было легко анимировать. Вся графика тайлов Sega Genesis всегда должна делиться на 8 пикселей, чтобы соответствовать размерам тайлов. Спрайты могут зеркально отображаться по горизонтали («hflip») и/или по вертикали («vflip»), а также иметь флаг высокого или низкого приоритета. Этот параметр определяет, должен и спрайт отображаться под или над тайлами других плоскостей (которые также имеют параметр высокого или низкого приоритета). Аппаратные спрайты также могут иметь значение «link»; каждый спрайт должен иметь собственное уникальное значение link. Среди прочего, оно влияет на отрисовку: спрайты с низкими значениями link отрисовываются поверх спрайтов с высокими значениями link.

Анимация


38a44d71638f29d4d3680ffd80701999.jpg


Бегущий бронированный минотавр-футболист из Zombie Football League

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

Сегодня среди разработчиков ROM-хаков Sonic the Hedgehog распространена техника под названием »Dynamic Pattern Load Cues» (DPLC). Она заключается в динамической загрузке тайлов для спрайтов во VRAM на лету вместо хранения всех тайлов для кадров спрайтов во VRAM одновременно. Очень часто детализированные спрайты (например, спрайты главного героя), занимают слишком большое количество тайлов во VRAM, используемых для кадров спрайтов. Если загружать в видеопамять только те тайлы, которые необходимы для текущего отрисовываемого кадра спрайта, можно экономить ограниченную память VRAM и занять её другой тайловой графикой. К сожалению, тайлы, используемые для DPLC, необходимо распаковывать в ROM, чтобы загрузка во VRAM была быстрой и не замедляла игру. (Распаковка сжатой графики тратит ресурсы процессора и занимает слишком много его циклов.) Функции спрайтового движка SGDK (в файле заголовка ) обычно используют техники DPLC для вырезания неиспользуемых тайлов.

05dcd79a260718d8761c1c9443dbc0e0.jpg


Рекомендуемые инструменты для отладки и создания графики


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

ПО для создания графики:

  • RetroGraphicsToolkit
    • Отличный инструмент для разделения графики на тайлы, создания оптимизированных тайловых карт и снижения цветов изображений
    • Работа в Truecolor, свободное ПО, имеет открытый исходный код
    • Скриптинг на Lua
    • Набор инструментов для создания многоплатформенной графики
      • Sega Genesis, Sega Master System, Game Gear
      • NES
    • Информационные ссылки
  • Irfanview
    • ПО общего применения для просмотра/редактирования изображений, имеет плагины и широкую поддержку множества типов файлов изображений
    • Может редактировать, экспортировать и импортировать палитры, а также увеличивать/уменьшать количество цветов изображения и показывать это количество. Полезен для подготовки файлов графики для работы с rescomp движка SGDK
    • Свободное и открытое ПО
    • Имеет PNG-плагин для изменения глубины цвета с сохранением порядка цветов в палитре
    • Информационные ссылки
  • PCXpal
    • Полезное ПО, позволяющее выполнять конвертацию между несколькими разными форматами палитр.
    • Полезно для преобразования из/в палитры Megadrive .bin и формат палитр Irfanview JASC
    • Форматы импорта
      • Изображения BMP, GIF, PCX
      • Сохранения эмуляторов Genesis: GGD, GS*, MSD
      • Файлы палитр Jasc, Megadrive, MS RIFF, Tile Layer Pro
    • Форматы экспорта
      • Палитры Jasc, Megadrive и Tile Layer Pro
    • Информационные ссылки


Рекомендуемые специализированные эмуляторы для отладки VDP

  • Туториал по использованию страниц отладки в эмуляторе Gens и его производных (Gens v2.11+)
  • Gens v11a Re-recording
    • Модифицированная версия знаменитого эмулятора Gens, написанного Stef
    • Имеет возможно переключения слоёв и замены слоёв спрайтов
    • Стандартная страница просмотра VDP отладчика Gens
    • Запись видео в AVI
    • Информационные ссылки
  • Gens KMod
    • Модифицированная версия эмулятора Gens с расширенными возможностями окон отладчика. Написана KanedaFR из Spritesmind
    • Просмотр VRAM в реальном времени
    • Просмотр спрайтов в реальном времени
    • Просмотр плоскостей в реальном времени
    • Просмотр регистров VDP в реальном времени
    • Переключатель слоёв
    • Информационные ссылки
  • Эмулятор Exodus
    • Точно моделирующий циклы эмулятор, предназначенный для отладки и разработки. Создан Nemesis, известным по ROM-хакингу Sonic и Spritesmind. Настоящий Rolls-Royce эмуляции Genesis.
    • Может быть полезен для отладки задержек, возникающих только на реальном оборудовании
    • Может создавать достаточно серьёзную нагрузку на систему, и для работы с удобной частотой кадров требуется очень мощная машина
    • Просмотр VDP VRAM, CRAM
    • Просмотр спрайтов
    • Просмотр регистров VDP
    • Информационные ссылки


Игры для SEGA GENESIS, которые стоит изучить


3c3f47f459adc4b4a21785501c9ca36e.jpg


Существует множество красивых игр для Sega Genesis, из которых можно почерпнуть различные техники и спецэффекты. В том числе:

  • Серия Streets of Rage
  • Серия Sonic the Hedgehog
    • Растровые эффекты палитры воды
    • Приоритет спрайтов/тайлов (особенно циклы и двуслойная система фрагментов в Sonic 2 и Sonic 3/Knuckles)
    • Высокопроизводительный, быстрый, очень качественный игровой движок
    • Спрайтовая DPLC
    • Отличный дизайн уровней и стили графики (особенно в Sonic 3/Knuckles)
    • Эффекты циклической смены палитр
    • Эффекты параллакса
  • The Adventures of Batman and Robin
    • Куча сложных графических эффектов
  • Castlevania Bloodlines
  • Aladdin
  • Серия Earthworm Jim
    • Плавная анимация
  • Серия Phantasy Star
  • Red Zone
    • 1-битное плавное чёрно-белое видео в заставке
    • Программная имитация поворота спрайтов и тайловых карт!
    • Графика в изометрии/с видом сверху
  • Panorama Cotton (Jap), Street Racer
    • Графика, напоминающая SNES Mode 7, очень сложный скроллинг строк и графические эффекты
  • Hard Drivin' и Race Drivin'
    • 3D, программный рендеринг полигональной графики
  • Zero Tolerance и Beyond Zero Tolerance (не выпущена)
    • Программный raycaster, напоминающий DOOM
  • Toy Story
    • Растровые эффекты палитры, позволяющие превысить количество цветов CRAM в статичных изображениях заставок
    • Raycaster в стиле DOOM на уровне от первого лица
    • Эффекты параллакса для геометрии уровня на первом уровне с Вуди


  • Star Cruiser (Jap)
    • 3D, программный рендеринг полигональной графики
  • Contra: Hard Corps
    • Робот-минибосс Giant на первом уровне — это тайловая карта с имитацией поворота тайловых карт/спрайтов
  • Огромная самодельная RPG под названием Pier Solar
    • Отличная графика
    • Несколько лет создавалась командой фанатов, гуру и homebrew-разработчиков Genesis
    • Огромный картридж на 64 МБ


Заметьте, как разные игры используют аппаратные ограничения Genesis и как некоторые игры выжимают из железа максимум. В Streets of Rage и Batman превосходно показаны суровые городские локации. В играх Sonic присутствуют очень яркие, контрастные цвета, которые позволяют распознавать окружение даже несмотря на высокую скорость Соника. В Aladdin и Earthworm Jim реализованы плавные и забавные анимации, хорошо подчёркивающие характеры персонажей.

Справочные материалы и дополнительное чтение


© Habrahabr.ru