VGA-палитра

Материал из Old-Games.RU Wiki
Перейти к навигации Перейти к поиску
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Стандартная палитра VGA для DOS

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