VGA-палитра

Материал из Old-Games.RU Wiki
Версия от 10:28, 19 марта 2014; Winterheart (обсуждение | вклад) (Новая страница: «'''VGA-палитра''' - понятие, тесно связанное со стандартом VGA и представлением этим стандар…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

VGA-палитра - понятие, тесно связанное со стандартом VGA и представлением этим стандартом отображаемых цветов. Из спецификации VGA следует, что поддерживающие его устройства могут отображать до 256 индексированных цветов из доступных 218 = 262 144 цветов. Почему 218? Дело в том, что для глубины цвета RGB в VGA стандартом отводится 6 бит. Так как каналов цвета у нас три (красный, зелёный, синий), то для определения полного цвета нам нужно 18 бит. Но так как во времена разработки стандарта понятия "видеопамять" не существовало (кадровый буфер размещался в ОЗУ), то эту самую память следовало экономить. Поэтому в VGA используется понятие палитра, которое позволяет снизить потребление памяти на 125 % по сравнению с "чистым" 18-битным представлением.

Поскольку игры могут отображать только 256 цветов, палитра может не хранится в самих растровых изображениях, а где-то отдельно. Классические VGA-палитры имеют фиксированный размер в 768 байт (3 байта на RGB * 256), так что если после распаковки ресурса вы найдете файлы с таким размером, то на 80 % это - VGA-палитры. Обычно первый цвет в палитре - черный, так что первое значение обычно будет 00 00 00 (тоже неплохой способ детектировать палитры). Некоторые графические форматы файлов содержат уже в себе используемую палитру, например, в PCX-файлах она может находиться в последних 768 байтах.

Палитра хранится в трехбайтной упаковке по шесть бит на цветовой канал (значения от 0 до 63), иначе говоря, глубина цвета такой палитры - 18 бит. Чтобы представить ее в современной 24-битной глубине (по восемь бит на цветовой канал), нужно провести несложные вычисления с каждым цветовым каналом по следующей формуле:

цветовой_канал_8_бит = (цветовой_канал_6_бит << 2) | (цветовой_канал_6_бит >> 4)

Обратное преобразование следующее:

цветовой_канал_6_бит = цветовой_канал_8_бит >> 2