Перейти к содержимому


Фотография

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

Графика Ромхакинг Програмирование Хранение несжатой графики Sega MegaDrive Денди SMD Dendy NES Romhacking

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 17

#1 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 17 Март 2015 - 15:55

Увидел на форуме тему «Написания распаковщика графики для 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.

 

post-95-0-78890000-1426600065.png

Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе 16 различных цветов (15+цвет фона))

 

post-95-0-03551100-1426600066.png

Как на мой взгляд, у SMD довольно простая система хранения графики. Но в связи с этим, графика занимает не мало места в роме. Для хранения одного тайла нужно 32 байта.

 

post-95-0-28028300-1426600066.png

В свою очередь один пиксель занимает пол байта или 4 бита.

 

post-95-0-56320600-1426600065.png

Как я писал раньше, тайл может содержать в себе 16 различных цветов. Каждый пиксель должен соответствовать какому-то цвету. Палитра тайлам присваивается позже, поэтому каждый пиксель соответствует месту в палитре (номеру цвета). От 0 до F (в шестнадцатеричной системе счисления).

 

post-95-0-53889300-1426600066.png

Пример для лучшего понимания.

post-95-0-30244600-1426600065.png

 

 

 

 

 

 

Тут всё посложнее, чем в случае с SMD, но я постараюсь разъяснить.

 

Nintendo Entertainment System

Метод хранение несжатой графики в играх для NES

 

post-95-0-78890000-1426600065.png

Как и в прошлый раз, в качестве примера будет рассматривать один тайл. Один тайл состоит из 64 пикселей. (Тайл содержит в себе всего 4 цвета, а фактически три (3+цвет фона)).

 

post-1-0-04730500-1426623064.png

Для хранения одного тайла нужно 16 байт.

 

post-1-0-85180600-1426623063.png

Один пиксель занимает два (2) бита. При этом система хранения довольно интересная. Это связано с тем, что нам нужно хранить данные о четырёх цветах, а не о двух, иначе было бы намного проще.

Данный тайла разделены на две области по 8 байт или 64 бита.

 

01111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111,

01111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111, 11111111

 

Месту каждого пикселя соответствует его «порядковый номер» в битах. То есть первому пикселю соответствует первый бит первой и второй группы бит. Последнему пикселю соответствует последний (64) бит в обеих группах бит. Объяснить это сложно, лучше посмотреть на картинку, нагляднее намного понятнее.

 

post-1-0-59390000-1426623063.png

10000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001

10000000 00000000 00000000 00001000 00000000 00000000 00000000 00000001

 

Пиксели назначаются (обозначаются) следующим образом:

Первый цвет соответствует значению 0 0 (Условно прозрачный)

Второй цвет соответствует значению 1 0

Третья цвет соответствует значению 0 1

Четвёртая цвет соответствует значению 1 1

Прикрепленные изображения

  • tile P2.png
  • palitra tile.png
  • tile.png
  • tile2.png
  • tile3 bit.png
  • tile P.png
  • tile nes bits.png
  • tele razdelen nes.png
  • tile2 nes.png

  • 2

#2 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 18 Март 2015 - 14:57

Мне лично непонятно, зачем было выдумывать столь заумную систему хранения несжатой графики в SNES, возможно сказывается наследие NES. А может всё из-за архитектуры приставки. Ответ на этот вопрос оставим специалистам. Нас же интересует не почему, а как.
 
Объяснить метод хранения несжатой графики в SNES играх будет сложно, но я всё же попробую сделать это максимально доходчиво.
 

Super Nintendo Entertainment System

Метод хранение несжатой графики в играх для SNES

 
Опять же, как и в предыдущих случаях с SMD и NES, мы будем рассматривать один тайл. Повторюсь, один тайл состоит из 64 пикселей. (Так же как и в SMD, тайл может содержать в себе до 16 цветов.)
 

post-95-0-66976000-1426682968.png

Как и в случае с Sega MegaDrive тайл занимает 32 байта. На этом, пожалуй, сходства с МегаДрайвом заканчиваются.
 

post-95-0-50093100-1426682968.png

Условно эти 32 байта мы делим на 8 частей. Каждая из частей, соответствует определенной строке в тайле (строка состоит из 8 пикселей). Лучше посмотреть на картинку и попытаться визуально понять, чем я буду писать кучу текста и только больше вас запутывать им.
 

post-95-0-29902000-1426682968.png

Дальше нам предстоит работать с битами.
 

post-95-0-82373800-1426682968.png

Каждому пикселю соответствует своё место в битах (по номеру пикселя в строке из 8 пикселей). А точнее даже четыре места, в каждом из байт.
 
То есть для определения одного пикселя мы используем четыре (4) бита. При помощи этих четырёх (4) бит мы узнаём цвет, а точнее номер цвета пикселя в палитре.
Таким образам каждому цвету соответствует набор из 4 бит.
 
Палитра состоит из 16 цветов. Будем их нумеровать с первой (1) по шестнадцатую включительно (16) [1-16].
 

Прикрепленные изображения

  • tile snes bit.png
  • tele snes del.png
  • tile snes.png
  • tile snes 4bits.png

  • 2

#3 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 10:32

Переходим к Game Boy и Game Boy Color соответственно. По-моему у них одинаковое устройство хранения несжатой графики, если я ошибаюсь, поправьте меня.

Схема хранения похожа на схему хранения для NES, но имеет кое-какие различия.

 

Nintendo Game Boy / Game Boy Color

Метод хранение несжатой графики в играх для GB / GBC

 

post-95-0-78890000-1426600065.png

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

Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл содержит в себе 4 цвета)

 

post-1-0-04730500-1426623064.png

Для хранения одного тайла нужно 16 байт.

 

post-1-0-24708400-1426771209.png

Один пиксель занимает два (2) бита. Визуально разделяем 16 байт на пары по два (получится восемь частей). Два байта (16 бит) соответствуют одной строке (строка состоит из 8 пикселей). Дальше мы будем рассматривать одну строку.

 

post-1-0-94557700-1426771208.png

Одна строка из 8 пикселей занимает два (2) байта. Эти два байта делятся между собой по 8 бит (8 бит и 8 бит). Место в этих восьми (8) бит соответствует месту пикселя в строке.

 

Цвет пиксели назначается (обозначается) следующим образом:

Первый цвет соответствует значению 0 0

Второй цвет соответствует значению 1 0

Третья цвет соответствует значению 0 1

Четвёртая цвет соответствует значению 1 1

 

(Значения цветов соответствуют значению цветов в NES)

Прикрепленные изображения

  • tile gb2.png
  • tile gb.png

  • 1

#4 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 10:32

Вот подошло время рассмотреть Sega Master System (SMS). Таким же образом несжатая графика хранится в играх для Sega Game Gear (GG).

Мне опять-таки непонятно, почему нельзя было хранить несжатую графику, так же как и в SMD. Метод хранение несжатой графики в играх для SMS больше похож на метод хранение несжатой графики в SNES. Но, естественно, имеются кое-какие различия.

 

Sega Master System / Sega Game Gear

Метод хранение несжатой графики в играх для SMS / GG.

post-95-0-78890000-1426600065.png

Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе до 16 различных цветов)

 

post-1-0-12693600-1427101744.png

Для хранения одного тайла нужно 32 байта.

 

post-1-0-45692000-1427101744.png

Делим 32 байта на восемь (8) частей по четыре (4) байта. Тут для восприятия будет попроще. Строки идут подряд. То есть первые четыре (4) байта отвечают за первую строку, состоящую из 8 пикселей. Следующие четыре (4) байта отвечают за вторую строку, состоящую из 8 пикселей. Далее будет рассматривать строку (Строка состоит из восьми пикселей).

 

post-1-0-61329900-1427101744.png

Дальше мы будем работать с битами. Для хранения одного пикселя понадобится четыре (4) бита. Каждый их этих битов стоит на своём месте в каждом из четырёх (4) байт. Месту бита соответствует место пикселя в строке. То есть первый пиксель будет первым байтом в каждом из четырёх байт. Для лучшего восприятия нужно внимательно посмотреть на картинку.

post-1-0-91356700-1427101743.png

Палитра состоит из 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

Прикрепленные изображения

  • tele sms4.png
  • tele sms.png
  • tele sms2.png
  • tele sms3.png

  • 1

#5 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 10:32

Сегодня я постараюсь рассказать вам о том, как же хранится несжатая графика в играх для GBA. Тут всё довольно просто и очень схоже с методом хранения несжатой графики в играх для SMD.

 

Nintendo Game Boy Advance

Метод хранение несжатой графики в играх для GBA.

 

post-95-0-78890000-1426600065.png

Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл может содержать в себе 16 различных цветов)

 

post-1-0-96259700-1427184175.png

У ГБА довольно простая система хранения для визуального восприятия. Один тайл занимает 32 байта.

 

post-1-0-72459100-1427184175.png

Один пиксель занимает пол байта или 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

Прикрепленные изображения

  • tike gba 2.png
  • tike gba.png

  • 1

#6 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 10:34

Вот и подошла очередь рассмотреть формат хранения 1BPP. Данный формат хранения несжатой графики может использоваться на различных игровых системах.

 

1BPP

Метод хранение несжатой графики в формате 1BPP

 

post-95-0-78890000-1426600065.png

Ещё раз повторюсь для тех, кто не читал посты выше.

Для простоты будем рассматривать один тайл. Размер одного тайла 8 на 8 пикселей. То есть один тайл содержит в себе 64 пикселя. (Тайл содержит в себе два (2) цвета)

 

post-1-0-73041900-1427447098.png

Тайл занимает 8 байт.

 

post-1-0-94578700-1427447098.png

Каждый байт соответствует одной строке (строка состоит из 8 пикселей). Дальше мы будем рассматривать одну строку.

 

post-1-0-38916400-1427447098.png

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

 

10101101

Прикрепленные изображения

  • tile 1bpp 3.png
  • tile 1bpp.png
  • tile 1bpp 2.png

  • 1

#7 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 10:34

Sega 32X

8-bit (color indices) (A1B5G5R5)

Метод хранение несжатой графики в играх для Sega 32X.

 

Данный метод хранение схож с методом хранения TIM файлов формата 8-bit (color indices) для PSX.

 

1337959272_32x-sample-program-celtic-pwm

В качестве примера рассмотрим тестовую демку для S32X под названием 32X Sample Program - Celtic - PWM Test. (Почему-то данный ром запустился у меня только на Fusion)

 

post-1-0-82181500-1431952658.png

Так выглядит часть графических данных (рисунка) в Hex-редакторе. Данные изображения начинаются с $5F0B4 и заканчиваются $6ECB7 включительно.

 

Устройство изображения:

2 байта – ширина

2 байта – высота

200 байт – палитра

Ширина * Высоту байт – пиксели (изображение)

 

post-1-0-78082900-1431952659.png

Ширина. Сколько пикселий выводить по X.

01 40 = 320

 

post-1-0-03876700-1431952660.png

Высота. Сколько пикселий выводить по Y.

00 C8 = 200

 

post-1-0-12797500-1431952659.png

Палитра. Данные занимают 512 (0x200) байт. По 2 байта на один цвет. Всего 256 цветов. Палитра хранится в формате TBGR / A1B5G5R5.

 

post-1-0-34205400-1431952659.png

Первый цвет. Занимает 2 байта. Хранится в формате TBGR / A1 B5 G5 R5. То есть по 5 бит на цвет (RGB). Как расшифровать цвет рассказывать не буду. Это описано в статье TIM 16-bit (actual colors) [TBGR / A1B5G5R5]. (Но в нашем случае байты местами менять ненужно.)

 

post-1-0-55747500-1431952659.png

Один пиксель занимает 8 бит или, проще говоря, равен одному байту.

 

Счёт идёт от 00 до FF, то есть всего 256 значений.

Прикрепленные изображения

  • 32x pal 1.png
  • 32x pal.png
  • hex 32x.png
  • 32x pixel.png
  • 32x X.png
  • 32x Y.png

  • 2

#8 admin

admin

    Администратор

  • Администраторы
  • 1 381 сообщений

Отправлено 19 Март 2015 - 10:44

Сообщения пришлось удалить.

Вот история сообщений:


  • 0

#9 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 19 Март 2015 - 15:42

Добавил обновление по методу хранения несжатой графики в играх для GB/GBC


  • 0

#10 Mefistotel

Mefistotel

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 148 сообщений
  • ГородМагадан

Отправлено 19 Март 2015 - 23:42

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

#11 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 23 Март 2015 - 11:25

Добавил обновление по методу хранения несжатой графики в играх для SMS/GG


  • 1

#12 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 24 Март 2015 - 10:11

Добавил обновление по методу хранения несжатой графики в играх для GBA


  • 1

#13 Mefistotel

Mefistotel

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 148 сообщений
  • ГородМагадан

Отправлено 24 Март 2015 - 13:10

Про турбика не забудь)


  • 0

#14 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 24 Март 2015 - 19:33

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

В Турбографе используется тот же формат, что и в SNES.


  • 0

#15 Greengh0st

Greengh0st

    Продвинутый пользователь

  • Администраторы
  • 1 500 сообщений

Отправлено 25 Март 2015 - 00:09

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


  • 0

#16 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 27 Март 2015 - 11:15

Добавил обновление по методу хранения несжатой графики 1BPP


  • 1

#17 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 18 Май 2015 - 14:50

Добавил информацию по методу хранения несжатой графики в SEGA 32X.


  • 1

#18 Mefistotel

Mefistotel

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 148 сообщений
  • ГородМагадан

Отправлено 22 Июль 2015 - 00:52

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

В некоторых редакторах есть режим 3BPP SNES (YY-CHR). Мне, пока, такой не попадался.


  • 0





Темы с аналогичным тегами Графика, Ромхакинг, Програмирование, Хранение несжатой графики, Sega MegaDrive, Денди, SMD, Dendy, NES, Romhacking

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru Яндекс.Метрика