Обзор архитектуры Sega Saturn



Основные сведения взяты из официальной документации — обзора разработки под Sega Saturn: segaretro.org/images/1/16/13-APR-94.pdf


Довольно забавная штучка первого поколения 3D и так же как и 3DO базовым элементом сделавшая не треугольник, а четырёхугольник.
Терминология тоже в силу молодости индустрии весьма непривычная, так эти четырёхугольники даже с 3Д и освещением по Гуро они продолжают называть спрайтами. Вышла консоль в конце 1994 года то есть за два года до выхода на пользовательский рынок ПК продукции 3Dfx Interactive — графических ускорителей Voodoo, но примерно в то же время когда появилась на свет Sony Playstation.

Нафаршировали систему с каким то даже остервенением.
Два 32-битных RISC-процессора Hitachi SH-2 делят общие 1,5 Мб рабочей памяти.
Предполагается что второй из них выполняет всякие вспомогательные штуки типа трансформации вершин, но при этом узким местом является доступ к рабочей памяти. Поэтому у процессоров по 4Кб кеша которые во втором переведены в режим 2Кб кеша + 2Кб сверхбыстрой памяти.
Но кроме основных процессоров программированию так же поддавался SCU (System Control Unit) — этот модуль разводил данные по шинам системы, содержал DMA-контроллер и DSP гарвардской архитектуры с модулями умножения, в который можно было загружать небольшие программы которые могли опять таки решать задачу умножения на матрицы с одновременной перегонкой данных из рабочей памяти в видеочипы по DMA. Sega в официальном SDK предоставляла несколько полезных микропрограмм для этого модуля.
Еще был 4-битный микроконтроллер Hitachi сидящий на таймере, задачах генерации прерываний и опроса данных от периферии (например геймпадов). Он работает всегда и питается от батареи когда системы выключена, видимо через него консоль включается/выключается.
Подсистема CD-ROM-а содержит собственный процессор Hitachi SH-1 и 0,5 Мб памяти под буфера ввода. Программировать его нельзя, общение происходит посредством заранее обозначенных команд. Например можно было заставить его закешировать какой либо файл для быстрой подкачки.
Звуковая система содержала 32-канальный генератор PCM или FM-звуков, которые подают свой сигнал в особый DSP на 128 инструкций, которые могут делать массу преобразований с этими звуками и в довесок еще работает всё это под управлением опять таки программируемого микроконтроллера 68EC000 (упрощенная версия m68k) который по умолчанию был запрограммирован Sega как midi-секвенсер, но при необходимости его тоже можно было перепрограммировать.

Видеосистема состоит из двух видеочипов — VDP-1 и VDP-2. Каждый имеет выделенные 512Кб VRAM.
VDP-1 делит свои пополам на два фреймбуфера по 256Кб. Пока рендерим в один буфер другой отображается на экране.
Базовые разрешения — 320x224 и 352x240 пикселей. В них пиксели во фреймбуферах 16-битные.
Есть режим повышающий разрешение по горизонтали вдвое, однако при нём отваливается 16-битная цветность и видеорежим становится 8-битным с 256-цветной палитрой. Кроме этого есть режим (interlace) повышающий разрешение по вертикали тоже вдвое, тут уже отваливаются два фреймбуфера и буферизация, так что видимо рисовать надо успевать во время обратного хода луча ЭЛТ, ибо явно написано, что нельзя рендерить во фреймбуфер отображающийся на экране. Скорее всего этот режим пригоден только для вывода статичной графики.

Отрисовка происходит скармливанием видеочипу связного списка команд к отрисовке. Геометрические примитивы называются «parts» и делятся на оттекстуренные (четырёхугольные «спрайты» произвольного искажения и ротации) и неоттекстуренные (одноцветные четырёхугольники или линии). К любым из них может быть применено сглаженное затенение по Гуро, затенение делением компонент RGB на 2 или полупрозрачность арифметическим средним.
Как и у 3DO природа отрисовки спрайтов/полигонов позволяет сделать трюк с так называемыми end codes — это специальные значения цветов которые позволяют оптимизировать отрисовку спрайтов с большими регионами прозрачности методом полного пропуска сканлайна при встрече специального значения пикселя означающего end code. Причём т.к. спрайты можно зеркалировать по горизонтали, то пропуск происходит после встречи двух end codes так, чтобы отбрасываться могли ненужные куски в конце растров как при отрисовке справа-налево так и слева-направо.
Пиксели 16-битные, но цвета выставляются довольно забавно. RGB-компоненты все по 5 бит и самый старший неиспользуемый бит отведён под признак палитры.
Если спрайт пишется во фреймбуфер в RGB-цвете, то в верхнем бите у него выставляется 1 и он уходит потом на телевизор как есть.
Но если в верхнем бите содержится 0, то включается режим палетризации — и нижние биты уже означают номер слота в палитре и через этот механизм можно даже управлять порядком отрисовки с VDP-2.
Дело в том, что финальное изображение формирует VDP-2 извлекая картинку из фреймбуфера VDP-1 и накладывая на неё до 4 задних фонов и уже итог и выводится на телевизор. Эти задние фоны могут быть битмапами, а могут быть сделаны по полным лекалам 16-битных видеочипов — квадратные сетки замощёных тайлов 8x8 которые можно легко скроллить и даже вращать, причём цвета тайлов могут быть тоже как в RGB-формате так и вхождениями в палитре. Максимальный размер палитры — 2048 вхождений.
Так вот — настройками VDP-2 можно управлять порядком наложения слоёв и фреймбуфера вплоть до того, что палетризированные пиксели фреймбуфера будут иметь разный порядок отрисовки, нежели непалетризированные. Таким образом можно генерировать всякие SFX похожие на стенсильный буфер по эффектам.
Причём задние фоны могут быть двух типов — обычные и вращаемые. Обычные на самом деле тоже можно вращать, но только по оси Z. А вот вращаемые можно вращать сразу по двух осям, что видимо помогает делать SFX типа уходящих вдаль горизонтов как в Mario Cart на SNES.

Забавна сама архитектура переезда в 3D. Фактически они выделили то что в 16-битных консолях было слоем спрайтов в отдельный фреймбуфер чтобы в него можно было рендерить четырёхгольные спрайты произвольных трансформаций:



Т.е. как и в 3DO здесь рендер проходил идеологически последовательные шаги по отрисовке обычных спрайтов, потом отзеркаленных спрайтов, потом отмасштабированных, потом просто повёрнутых и уже в конце всего — искаженных любыми способами и даже с интерполяцией затенения по Гуро между четырьмя вершинами. В глубоком отличии от классического (и современного) рендера который идёт по пикселям экрана и делает для них текстурные выборки здесь проход осуществляется по пикселям спрайта с переносом их на экран через трансформации. Поэтому возможен тот же трюк с end codes. Но это приводило так же и к негативным эффектам: так в документации от Sega замечается, что при сильных искажениях спрайта нельзя полагаться на полупрозрачность, потому в один и тот же пиксель экрана могут быть нарисованы несколько пикселей из спрайта, а следовательно они все дадут вклад в затенение итогового изображения.
Тем не менее из этого слоя спрайтов можно было формировать по настоящему трёхмерную графику. Стоит так же отметить, что в целях совместимости с «треугольной» графикой уже набравшей обороты система поддерживала вырожденные четырёхугольники с одной общей вершиной. Слои же задних (и передних) фонов остались как были в старых консолях и в принципе могли быть использованы для вывода задних фонов в привычных платформерах, но в полноценном 3D их применение было существенно более ограниченным — панельки с игровой информацией разве что, да пол-потолок в чём нибудь типа Wolf3D (т.е. протяжённая плоскость уходящая в закат)…
Так что в итоге подход с четырёхугольными спрайтами потом вымер, т.к. обладал рядом существенных недостатков.

2 комментария

avatar
Немного еще посмотрел в то как именно работают палетризированные цвета в Saturn, ибо там сразу было видно, что дела обстоят непростым образом, но за ворохом слов было не очень понятно.
Оказалось что и с палитрами там всё очень сложно.
Во первых — при рендере текстурированного спрайта в 16-битный фреймбуфер данные о цвете его битмапа могут быть представлены непосредственно как 16-битные значения, а могут быть 4-битными слотами в 16-цветной палитре 16-битных же цветов. Но в любом случае во фреймбуфер попадает 16-битное данное у которого верхний бит контролирует является оно RGB или является цветом в палитре.
Так вот когда оно является цветом в палитре существует 8 глобально выставляемых форматов того какие биты в нём отвечают за:
а) номер цвета в палитре (до 10 бит)
б) порядок отрисовки между задними фонами (до 3-х бит)
в) номер расширенного вычисления цвета (до 3-х бит)
г) бит «тени»
Кроме того для 8-битного режима фрембуфера есть так же 8 форматов как эти же биты, но уже в урезанном количестве распределены по 8-битному данному о цвете в нём.
И там такая битовая мешанина из сотен регистров управляющих всякими этими битовыми комбинациями, что как говорится «без поллитры не разберешься».
Реально ловлю то же самое ощущение что было в похожем по духу эпохи 3DO — вся эта битово-палитрово-слоевая мехника переусложнена до жути.
Мегадрайв от той же фирмы был просто гимном лаконичности и простоты своей графической начинки — одна палитра, один палитровый режим и для спрайтов и для тайлов, но пасаран. Тут же прям им крышу сорвало на то как впихать в биты как можно большее число всяких палитр, режимов и цветов. Сомневаюсь что даже половина этих всех вещей была в реальности востребована.

А вот дальше еще на другом форуме подсказали, что была такая весьма забавная видеокарта как Diamond Edge 3D — согласно википедии первая видеокарта на пользовательском рынке ПК с аппаратным ускорением (95-ый год). Так вот это был некий синтез видео- и звуковых чипов из Sega Saturn в виде платы для IBM PC. И вот тут всё стало совсем интересно, ведь Diamond Edge 3D в сердце своём содержит чип NV1 который разработала, да, nVidia.
Похоже, что это был одна из первых попыток этой фирмы продвигать 3Д в массы.
В статье про Sega Saturn этому посвящена всего одна строчка (мой перевод):
Шеффилд сказал, что использование Сатурном четырёхугольников подорвало поддержку системы третьими сторонами, но поскольку «nVidia вложилась в четырёхугольники» в то же время есть «отдалённая возможность», что они смогут «стать стандартом вместо треугольников», если каким то образом, магически, Сатурн стал бы самой популярной консолью той эпохи".
И удивительно, но в русском википедии есть гораздо больше интересной информации, чем в английской: ru.wikipedia.org/wiki/NV1
Использование квадратичных поверхностей было элегантным и абсолютно новым решением в 3D-мире. Хотя теория была придумана давно, в железе такого до этого никто не делал. Главная идея заключалась в том, что в 1995 году реализовать операцию деления 1/z в железе была невероятно сложно и дорого, и в результате этого имплементировать перспективную проекцию было очень трудно. Классический подход, заключавшийся в линейной аппроксимации гиперболической функции, имел свою проблему аппроксимации в окрестности нуля и требовал сложного программного обеспечения. Квадратичная теория, использованная в NV1, аппроксимировала функцию 1/z параболической интерполяцией и такая интерполяция по качеству превосходила кусочно-линейную, которая была использована в решениях конкурентов.

Попытка исследовательской группы NVIDIA портировать квадратичную технологию на API Microsoft провалилась. Попытка выполнить наложения текстуры и операцию clipping приводило к уравнениям 5 степени невычислимыми в радикалах. Хотя демонстрационные примеры с квадратичными поверхностями выглядели довольно неплохо, работа с ними оказалась чрезвычайно трудной.

Дальнейшая разработка NV1 под новым названием — NV2 была остановлена, NV1 производство было свернуто. В 1996 году Nvidia начала разработку классического акселератора.
Хех, оказывается за этими квадратностями стояла никто иная, как сама nVidia и это был её первый блин комом.
avatar
Спасибо, любопытно было почитать про то, как индустрия пришла к полигонам от спрайтовых преобразований.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.