127c
Как развитие режима 53с предлагаю рассмотреть вариант 127c.
Формат хранения аналогичен — 768 байт атрибутов, только другая текстура и в результате псевдоцветов в 2 с лишним раза больше.
Хитрость заключается в том, что текстура составляет не 50% знакоместа, а лишь 37,5% (24 пикселя из 64), и при инверсии INK/PAPER оттенок не аналогичен (как в 53с), а меняется на противоположный (дополняющий до полного цвета) — текстуру в 40 пикселей = 62,5% площади знакоместа.
Теоретически текстура может быть любая. Конкретно данный вариант родился давно, по мотивам хитрых чанок 8x8, придуманных в секретных лабораториях Triebkraft при написании демо Electrogodzilla & Pink Socks, где можно наблюдать подобные чанки, но с ещё большим количеством градаций, за счет их динамической частичной перерисовки.
48 комментариев
Мне интересно вот что: как реализуется вывод 127ц?
1. Механическое смешивание красок. То есть имея всего два разных цвета и смешивая их в разных пропорциях мы можем получить множество оттенков стремящимся к одному из цветов, но не являющегося им.
2. Типографский растр: ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%82%D1%80_(%D0%BF%D0%BE%D0%BB%D0%B8%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)
По сути это, оптическое смешивание цвета которое происходит в глазу смотрящего человека. Такими вещами, причем более явными, занимались пуантилисты: ru.wikipedia.org/wiki/%D0%9F%D1%83%D0%B0%D0%BD%D1%82%D0%B8%D0%BB%D0%B8%D0%B7%D0%BC
Зная же это, и процентное соотношение цветов, мы можем смоделировать оптическое смешивание красок, например в фотошопе.
Делаем два слоя с нужными цветами и затем прозрачность верхнего слоя устанавливаем на 37/38% (да, точное соотношение 37.5%, но разница при 37/38% на глаз практически не заметна).
Как-то так.
P.S. Более того, используя разный растр (ну или текстуру, если будет угодно) мы можем получить еще большее количество оттенков определенного цвета. Но! Чем меньше будет процентное соотношение цветов, тем дальше нужно будет отходить от экрана, чтобы оно действительно работало, как задумано.
В общем, какие выводы:
— цветов, по факту, 101. Причем явно различных — довольно немного, на мой мутный взгляд с -7
— большой разброс по hue (мало красного, много синего). Возможно, проблема в формуле, высчитывающей luminance
— два очевидных уровня насыщенности, причем «пастельных» цветов невероятно мало
— выходная палитра очень сильно зависит от небрайта. Если указать веселые значения типа 96 или 160 — палитра резко сокращается до 64 цветов. Можно сами поэкспериментировать со значениями, добавляя их к урлу: artfield.me/127c.html?160
Вышло вот что:
Как ты видишь, оттенки не очень хорошо совпадают. У тебя, я думаю, такая же ошибка как сделал в своё время я.
Допустим, мы смешиваем 50% одного цвета и 50% другого. Законы аддитивного цвета нам говорят: нужно сложить цветовые компоненты и разделить на 2. Вроде всё правильно? Мне кажется, что нет. Дело в том, что смешение цвета происходит на экране, а у экрана — гамма. Гамма монитора в среднем будет что-то типа 2.5. Значит нужно взять покомпонентно оба цвета, перевести их в мониторную гамму, там — смешать и разделить на два, а уже потом — взять обратно гамму. Типа
Rmix = (0.5*R1^2.5+0.5*R2^2.5)^(1/2.5)
Я не специалист в gamma-коррекции, сам до конца не понимаю.
1. человек не все оттенки воспринимает одинаково, поэтому производителями железа было решено распределить яркость от 0 до 255 не линейно. То есть 127 — это не 50% яркости, как можно предположить, а 50% яркости приходится на 187.
2. Это уже давно работает в современном оборудовании (sRGB стандарт), то есть оборудование при показе рассчитывает, что 127 — это не середина градиента. От видеокарт до проекторов и принтеров, вся цепочка.
3. Формулы работы с цветами, которые мы используем, с этим нюансом не считаются, поэтому надо перед подсчетами конвертировать в линейную гамму, а после подсчета — обратно в нелинейную.
Это не учитывает яркость, если я верно всё понял.
разницы не видно
Ресайз в полтора раза без гамма-коррекции.
Ресайз в полтора раза с гамма-коррекцией.
Основное внимание не на облака, где использован любимый сомнительный прием, а на вполне «легальный» розовый градиент внизу, и на желто-голубые градиенты лучей света вверху.
Что из этого следует? хз. В идеальном мире надо учитывать этот эффект при показе работ на пати, а в реальном мире скорее всего упремся в то, что ресэмплинг делается в проекторе, он аппаратный, и внешним воздействиям не поддаётся.
nonlinear = ((linear / 255) ^ (1 / gamma)) * 255
linear = ((nonlinear / 255) ^ gamma) * 255
Я использовал стандартную GD2 функцию из PHP для конверсии, gamma ставил 2.2 и 1.0.
https://github.com/wbcbz7/watcom-stuff/blob/master/demos/volatile/15BPPTST/15BPPTST.CPP#L478
в принципе, экономия только на делении (которое в ряде случаев заменяется обычным сдвигом,
а, у нас же кроссплатформенность :), но как рабочий концепт тоже сойдет (правда тот режим в volatile так и не попал)