Как добавить цветовую палитру к ч / б изображению?
Я заметил, что в некоторых игровых движках на основе плиток плитки сохраняются в градациях серого, а иногда даже в черном или белом цвете, а затем цвет добавляется посредством сохранения "палитры" вместе с ней для применения к определенным пикселям, однако я никогда не видел, как это знает, какие пиксели.
Просто чтобы назвать несколько движков, которые я видел, используйте это, Minicraft Notch и старые игры Pokemon для Gameboy. Это то, что сообщило мне о том, как цветовая палитра используется в старых играх: деконструктор
Из всего, что я видел в людях, использующих эту технику в уроках, она использует форму сдвига битов, однако я хотел бы знать, насколько она была настолько эффективной, что она была почти обязательной в старых 8-битных консолях - как она можно применять красный, зеленый и синий цвета к определенным пикселям изображения в каждом кадре вместо сохранения всего цветного изображения (некоторый псевдокод был бы хорош).
1 ответ
Эффективная вещь об этом - то, что это экономит память. Для хранения значений RGB обычно требуется 24 бита (8 бит на канал). При наличии палитры из 256 цветов (требующей 256*24 бит = 768 байт) каждому пикселю требуется всего 8 бит (2^8 = 256 цветов). Таким образом, в одном и том же объеме памяти может храниться в три раза больше пикселей (если не считать нужную палитру), но с ограниченным набором цветов, очевидно. Раньше это поддерживалось в аппаратном обеспечении, поэтому графическая память также могла использоваться более эффективно (ну, на самом деле это все еще поддерживается в современном аппаратном обеспечении ПК, но почти никогда не используется, так как графическая память больше не ограничена).
Некоторые устройства (включая Super Gameboy, поддерживаемый первыми играми Pokemon) использовали более одной аппаратной палитры одновременно. Различные наборы плиток отображаются на разных палитрах. Но способ отображения плиток на разные палитры очень зависит от аппаратного обеспечения и часто не очень прямолинеен.
То, как хранятся биты изображения, тоже не всегда так просто. Если пиксели составляют 8 битов, это может быть массив байтов, где каждый байт просто равен одному пикселю (как в классическом режиме VGA, используемом во многих старых играх для DOS). Но Gameboy, например, использует 2 бита на пиксель, а другие используют 4, то есть 2^4 = 16 цветов на палитру. Распространенным способом размещения битов в памяти является использование битовых плоскостей. То есть (в случае 16-цветной графики) сохраняется 4 отдельных ч / б изображения. Но в некоторых случаях битовые плоскости также могут чередоваться по-разному. Так что нет простого и универсального ответа на то, как декодировать / кодировать графику таким образом. Так что я думаю, вы должны быть более конкретными, для чего вы хотите псевдокод.
И я не уверен, как все это относится к Minicraft. Может быть, просто как графика хранится на диске. Но это не имеет значения, когда графика загружается в графическую память. (Может быть, у вас есть какая-то другая особенность Minicraft?)