Хранение несжатой графики на различных игровых системах

Автор SPOT, 17 марта 2015, 15:55

« назад - далее »

SPOT

Увидел на форуме тему «Написания распаковщика графики для Dendy». Эта тема натолкнула меня на мысль, а какое устройство у несжатой графики в  Hex-редакторе. Так сказать, каким образом она хранится в роме игры. В этой теме я попробую это выяснить и заодно то, как она хранится на других приставках.
Как и в случае с моей статьёй «Sega MegaDrive палитра» умных слов не будет, и я постараюсь максимально понятно объяснить методы хранения несжатой графики.
Надеюсь, многим моя статья будет полезна и интересна.
 
1BPP (Метод хранение несжатой графики 1BPP)
GB/GBC (Метод хранение несжатой графики в играх для GB/GBC)
GBA (Метод хранение несжатой графики в играх для GBA)
SMS/GG (Метод хранение несжатой графики в играх для SMS/GG)
SNES (Метод хранение несжатой графики в играх для SNES)
Sega 32X (Метод хранение несжатой графики в играх для Sega 32X) 8-bit (color indices) (A1B5G5R5)
PSX (TIM 4-bit (color indices))
PSX (TIM 8-bit (color indices))
PSX (TIM 16-bit (actual colors) [TBGR / A1B5G5R5])
PSX (TIM 24-bit (actual colors) [RGB / R8G8B8])
 
 
Sega MegaDrive / Sega CD
Метод хранение несжатой графики в играх для SMD / SCD
Так же используется и в играх для Sega 32X.
 
Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе 16 различных цветов (15+цвет фона))
 
Как на мой взгляд, у SMD довольно простая система хранения графики. Но в связи с этим, графика занимает не мало места в роме. Для хранения одного тайла нужно 32 байта.
 
В свою очередь один пиксель занимает пол байта или 4 бита.
 
Как я писал раньше, тайл может содержать в себе 16 различных цветов. Каждый пиксель должен соответствовать какому-то цвету. Палитра тайлам присваивается позже, поэтому каждый пиксель соответствует месту в палитре (номеру цвета). От 0 до F (в шестнадцатеричной системе счисления).
 
Пример для лучшего понимания.
 
 
 
 
 
 
Тут всё посложнее, чем в случае с SMD, но я постараюсь разъяснить.
 
Nintendo Entertainment System
Метод хранение несжатой графики в играх для NES
 
Как и в прошлый раз, в качестве примера будет рассматривать один тайл. Один тайл состоит из 64 пикселей. (Тайл содержит в себе всего 4 цвета, а фактически три (3+цвет фона)).
 
Для хранения одного тайла нужно 16 байт.
 
Один пиксель занимает два (2) бита. При этом система хранения довольно интересная. Это связано с тем, что нам нужно хранить данные о четырёх цветах, а не о двух, иначе было бы намного проще.
Данный тайла разделены на две области по 8 байт или 64 бита.
 
01111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111,
01111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111
 
Месту каждого пикселя соответствует его «порядковый номер» в битах. То есть первому пикселю соответствует первый бит первой и второй группы бит. Последнему пикселю соответствует последний (64) бит в обеих группах бит. Объяснить это сложно, лучше посмотреть на картинку, нагляднее намного понятнее.
 
10000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001
10000000 00000000 00000000 00001000 00000000 00000000 00000000 00000001
 
Пиксели назначаются (обозначаются) следующим образом:
Первый цвет соответствует значению 0 0 (Условно прозрачный)
Второй цвет соответствует значению 1 0
Третья цвет соответствует значению 0 1
Четвёртая цвет соответствует значению 1 1

SPOT

Мне лично непонятно, зачем было выдумывать столь заумную систему хранения несжатой графики в SNES, возможно сказывается наследие NES. А может всё из-за архитектуры приставки. Ответ на этот вопрос оставим специалистам. Нас же интересует не почему, а как.
 
Объяснить метод хранения несжатой графики в SNES играх будет сложно, но я всё же попробую сделать это максимально доходчиво.
 
Super Nintendo Entertainment System
Метод хранение несжатой графики в играх для SNES
 
Опять же, как и в предыдущих случаях с SMD и NES, мы будем рассматривать один тайл. Повторюсь, один тайл состоит из 64 пикселей. (Так же как и в SMD, тайл может содержать в себе до 16 цветов.)
 
Как и в случае с Sega MegaDrive тайл занимает 32 байта. На этом, пожалуй, сходства с МегаДрайвом заканчиваются.
 
Условно эти 32 байта мы делим на 8 частей. Каждая из частей, соответствует определенной строке в тайле (строка состоит из 8 пикселей). Лучше посмотреть на картинку и попытаться визуально понять, чем я буду писать кучу текста и только больше вас запутывать им.
 
Дальше нам предстоит работать с битами.
 
Каждому пикселю соответствует своё место в битах (по номеру пикселя в строке из 8 пикселей). А точнее даже четыре места, в каждом из байт.
 
То есть для определения одного пикселя мы используем четыре (4) бита. При помощи этих четырёх (4) бит мы узнаём цвет, а точнее номер цвета пикселя в палитре.
Таким образам каждому цвету соответствует набор из 4 бит.
 
Палитра состоит из 16 цветов. Будем их нумеровать с первой (1) по шестнадцатую включительно (16) [1-16].
 
Спойлер
Первый цвет  в палитре (1):
0 0
0 0
 
Второй цвет в палитре (2):
1 0
0 0
 
Третий цвет в палитре (3):
0 1
0 0
 
Четвёртый цвет в палитре (4):
1 1
0 0
 
Пятый цвет в палитре (5):
0 0
1 0
 
Шестой цвет в палитре (6):
1 0
1 0
 
Седьмой цвет в палитре (7):
0 1
1 0
 
Восьмой цвет в палитре (8):
1 1
1 0
 
Девятый цвет в палитре (9):
0 0
0 1
 
Десятый цвет в палитре (10):
1 0
0 1
 
Одиннадцатый цвет в палитре (11):
0 1
0 1
 
Двенадцатый цвет в палитре (12):
1 1
0 1
 
Тринадцатый цвет в палитре (13):
0 0
1 1
 
Четырнадцатый цвет в палитре (14):
1 0
1 1
 
Пятнадцатый цвет в палитре (15):
0 1
1 1
 
Шестнадцатый цвет в палитре (16):
1 1
1 1

SPOT

Переходим к Game Boy и Game Boy Color соответственно. По-моему у них одинаковое устройство хранения несжатой графики, если я ошибаюсь, поправьте меня.
Схема хранения похожа на схему хранения для NES, но имеет кое-какие различия.
 
Nintendo Game Boy / Game Boy Color
Метод хранение несжатой графики в играх для GB / GBC
 
В очередной раз повторюсь для тех, кто мог не читать материал представленный выше.
Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл содержит в себе 4 цвета)
 
Для хранения одного тайла нужно 16 байт.
 
Один пиксель занимает два (2) бита. Визуально разделяем 16 байт на пары по два (получится восемь частей). Два байта (16 бит) соответствуют одной строке (строка состоит из 8 пикселей). Дальше мы будем рассматривать одну строку.
 
Одна строка из 8 пикселей занимает два (2) байта. Эти два байта делятся между собой по 8 бит (8 бит и 8 бит). Место в этих восьми (8) бит соответствует месту пикселя в строке.
 
Цвет пиксели назначается (обозначается) следующим образом:
Первый цвет соответствует значению 0 0
Второй цвет соответствует значению 1 0
Третья цвет соответствует значению 0 1
Четвёртая цвет соответствует значению 1 1
 
(Значения цветов соответствуют значению цветов в NES)

SPOT

Вот подошло время рассмотреть Sega Master System (SMS). Таким же образом несжатая графика хранится в играх для Sega Game Gear (GG).
Мне опять-таки непонятно, почему нельзя было хранить несжатую графику, так же как и в SMD. Метод хранение несжатой графики в играх для SMS больше похож на метод хранение несжатой графики в SNES. Но, естественно, имеются кое-какие различия.
 
Sega Master System / Sega Game Gear
Метод хранение несжатой графики в играх для SMS / GG.
Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе до 16 различных цветов)
 
Для хранения одного тайла нужно 32 байта.
 
Делим 32 байта на восемь (8) частей по четыре (4) байта. Тут для восприятия будет попроще. Строки идут подряд. То есть первые четыре (4) байта отвечают за первую строку, состоящую из 8 пикселей. Следующие четыре (4) байта отвечают за вторую строку, состоящую из 8 пикселей. Далее будет рассматривать строку (Строка состоит из восьми пикселей).
 
Дальше мы будем работать с битами. Для хранения одного пикселя понадобится четыре (4) бита. Каждый их этих битов стоит на своём месте в каждом из четырёх (4) байт. Месту бита соответствует место пикселя в строке. То есть первый пиксель будет первым байтом в каждом из четырёх байт. Для лучшего восприятия нужно внимательно посмотреть на картинку.
Палитра состоит из 16 цветов. Будем их нумеровать с первого (1) по шестнадцатый включительно (16) [1-16].
 
Первый цвет  в палитре (1): 0 0 0 0
Второй цвет в палитре (2): 1 0 0 0
Третий цвет в палитре (3): 0 1 0 0
Четвёртый цвет в палитре (4): 1 1 0 0
Пятый цвет в палитре (5): 0 0 1 0
Шестой цвет в палитре (6): 1 0 1 0
Седьмой цвет в палитре (7): 0 1 1 0
Восьмой цвет в палитре (8): 1 1 1 0
Девятый цвет в палитре (9): 0 0 0 1
Десятый цвет в палитре (10): 1 0 0 1
Одиннадцатый цвет в палитре (11): 0 1 0 1
Двенадцатый цвет в палитре (12): 1 1 0 1
Тринадцатый цвет в палитре (13): 0 0 1 1
Четырнадцатый цвет в палитре (14): 1 0 1 1
Пятнадцатый цвет в палитре (15): 0 1 1 1
Шестнадцатый цвет в палитре (16): 1 1 1 1

SPOT

Сегодня я постараюсь рассказать вам о том, как же хранится несжатая графика в играх для GBA. Тут всё довольно просто и очень схоже с методом хранения несжатой графики в играх для SMD.
 
Nintendo Game Boy Advance
Метод хранение несжатой графики в играх для GBA.
 
Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе 16 различных цветов)
 
У ГБА довольно простая система хранения для визуального восприятия. Один тайл занимает 32 байта.
 
Один пиксель занимает пол байта или 4 бита. Но в отличие от SMD, здесь значения перевёрнуты. То есть сначала идёт второй пиксель, а потом первый. Проще говоря, пиксели в байте считываются справа налево.
 
Палитра состоит из 16 цветов. Будем их нумеровать с первого (1) по шестнадцатый включительно (16) [1-16].
 
Первый цвет  в палитре (1): 0000
Второй цвет в палитре (2): 0001
Третий цвет в палитре (3): 0010
Четвёртый цвет в палитре (4): 0011
Пятый цвет в палитре (5): 0100
Шестой цвет в палитре (6): 0101
Седьмой цвет в палитре (7): 0110
Восьмой цвет в палитре (8): 0111
Девятый цвет в палитре (9): 1000
Десятый цвет в палитре (10): 1001
Одиннадцатый цвет в палитре (11): 1010
Двенадцатый цвет в палитре (12): 1011
Тринадцатый цвет в палитре (13): 1100
Четырнадцатый цвет в палитре (14): 1101
Пятнадцатый цвет в палитре (15): 1110
Шестнадцатый цвет в палитре (16): 1111

SPOT

Вот и подошла очередь рассмотреть формат хранения 1BPP. Данный формат хранения несжатой графики может использоваться на различных игровых системах.
 
1BPP
Метод хранение несжатой графики в формате 1BPP
 
Ещё раз повторюсь для тех, кто не читал посты выше.
Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл содержит в себе два (2) цвета)
 
Тайл занимает 8 байт.
 
Каждый байт соответствует одной строке (строка состоит из 8 пикселей). Дальше мы будем рассматривать одну строку.
 
Каждому пикселю соответствует свой бит в байте. Считывание данных происходит стандартно (слева на право). Поскольку цветов всего два, значения может быть либо 0, либо 1. Следовательно, 0 соответствует первому цвету, а 1 – второму.
 
10101101

SPOT

Sega 32X
8-bit (color indices) (A1B5G5R5)
Метод хранение несжатой графики в играх для Sega 32X.
 
Данный метод хранение схож с методом хранения TIM файлов формата 8-bit (color indices) для PSX.
 
В качестве примера рассмотрим тестовую демку для S32X под названием 32X Sample Program - Celtic - PWM Test. (Почему-то данный ром запустился у меня только на Fusion)
 
Так выглядит часть графических данных (рисунка) в Hex-редакторе. Данные изображения начинаются с $5F0B4 и заканчиваются $6ECB7 включительно.
 
Устройство изображения:
2 байта – ширина
2 байта – высота
200 байт – палитра
Ширина * Высоту байт – пиксели (изображение)
 
Ширина. Сколько пикселий выводить по X.
01 40 = 320
 
Высота. Сколько пикселий выводить по Y.
00 C8 = 200
 
Палитра. Данные занимают 512 (0x200) байт. По 2 байта на один цвет. Всего 256 цветов. Палитра хранится в формате TBGR / A1B5G5R5.
 
Первый цвет. Занимает 2 байта. Хранится в формате TBGR / A1 B5 G5 R5. То есть по 5 бит на цвет (RGB). Как расшифровать цвет рассказывать не буду. Это описано в статье TIM 16-bit (actual colors) [TBGR / A1B5G5R5]. (Но в нашем случае байты местами менять ненужно.)
 
Один пиксель занимает 8 бит или, проще говоря, равен одному байту.
 
Счёт идёт от 00 до FF, то есть всего 256 значений.

admin

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

ЦитироватьOdyssey сказал(а) 17 Мар 2015 - 16:42:
    Огромное спасибо, это ведь таким образом можно найти тайлы которые нужно перерисовывать, если их зрительно найти не получается.
 
Да, можно.
 

ЦитироватьGreengh0st сказал(а) 17 Мар 2015 - 18:07:
    Odyssey, если зрительно не получается, то скорее всего она пожата и мне кажется так её будет не найти.
 
Зрительно можно искать различные буквы или заставки. А вот если нужно найти какую-то часть персонажа, да её ещё нет в основной массе тайлов. То можно попробовать найти графику через Hex-редактор. 
 
Mefistotel
Доступно изложено для новичков."Пиксиль" по всему тексту нужно исправить на "пиксЕль". Всё-таки грамотность никто не отменял.И не мешало бы добавить СНЕС, ну и может, геймбой и прочее.
 
SPOT
Не успел ещё, так же в них ещё самому нужно разобраться :)
 
Greengh0st
Может их под спойлер убрать, хотя не будет каши посмотри у шефов статья про указатели и поболе этой будет, лучше всё таки вместе, а то ползать по теме не совсем удобно. просто спрятать их а картиночку красивенькую прикрутить.


Mefistotel

Есть пожелания. Первое, проверь орфографию своих статей хотя бы в ворде. Или попроси кого-нибудь. Словечки типо "мок" режут глаз. Это, вроде как, форум переводчиков.
Второе, не помешало бы добавить и Turbografx-16 (PC Engine). Консолька имеет два процессора, 8 битный центральный и 16 битный видео.




Марат

Цитата: Mefistotel от 19 марта 2015, 23:42Есть пожелания. Первое, проверь орфографию своих статей хотя бы в ворде. Или попроси кого-нибудь. Словечки типо "мок" режут глаз. Это, вроде как, форум переводчиков.
Второе, не помешало бы добавить и Turbografx-16 (PC Engine). Консолька имеет два процессора, 8 битный центральный и 16 битный видео.
В Турбографе используется тот же формат, что и в SNES.

Greengh0st

И на Turbografx-16 мало переводов((( Надо бы заняться комунить)))) Бонк до сих пор лежит у меня, но я и до него доберусь, не зря мы выковыриваем всё что лежало у нас с незапамятных времен.



Mefistotel

Можно было добавить, что на SNES довольно часто встречается графика в формате 2BPP (Phantom 2040, Demon`s Crest) - 16 байт на тайл, а также экзотические штуки, такие как 8BPP (титульник в Spell Craft) - 64 байта на тайл. 
В некоторых редакторах есть режим 3BPP SNES (YY-CHR). Мне, пока, такой не попадался.