127c


Как развитие режима 53с предлагаю рассмотреть вариант 127c.

Формат хранения аналогичен — 768 байт атрибутов, только другая текстура и в результате псевдоцветов в 2 с лишним раза больше.

Хитрость заключается в том, что текстура составляет не 50% знакоместа, а лишь 37,5% (24 пикселя из 64), и при инверсии INK/PAPER оттенок не аналогичен (как в 53с), а меняется на противоположный (дополняющий до полного цвета) — текстуру в 40 пикселей = 62,5% площади знакоместа.

Теоретически текстура может быть любая. Конкретно данный вариант родился давно, по мотивам хитрых чанок 8x8, придуманных в секретных лабораториях Triebkraft при написании демо Electrogodzilla & Pink Socks, где можно наблюдать подобные чанки, но с ещё большим количеством градаций, за счет их динамической частичной перерисовки.

48 комментариев

avatar
Кстати, вспомнил, вот видяшка атрибутная как раз на тему увеличения цветов с помощью другой текстуры. Я в своё время наконвертил из этого видео, ну какбе само просилось. Сначала тупо напихал непакованных кадров в мегабайт своего кая, а потом великий DDp закодил потоковый депакер и все утрамбовал в 128к.
avatar
Да, с такой текстурой, как в видео 106 цветов у меня вышло.
avatar
Офигеть круто! Почему ты не выкладывал никуда?)
  • sq
  • +1
avatar
Выкладывал давно какие то версии на длкорпе. И вот еще zxn.ru/prod.php?p=6548 тоже одна из версиий под мегабайт (кай, профи и атм).
avatar
ну тут с видео прям подсиропили :)
avatar
Был бы редактор с мышкой, можно и рисовать.
avatar
Делаешь палитру нужную в ФШ, рисуешь, конвертишь чем тебе удобно (я выгружал 8-биный raw и скриптом на питоне конвертил)
avatar
Можно сделать. Дайте мне только выходной формат и текстуру чанка
avatar
похоже, что текстуры на картинке.

Мне интересно вот что: как реализуется вывод 127ц?
avatar
Любопытный способ достижения большего количества цветов. Вполне может прийти на замену 53с, как считаю — издержек совсем мало при таком методе.
avatar
По теории все правильно, но нужно смотреть как эти кучерявые чанки на готовых работах смотреться будут. Одно дело динамика и совсем другое статическая картинка. 50% заливка текстурой выглядит ровной, тут же глаза могут за отдельные пикселы «цепляться». Ну или отходить прийдется от монитора еще дальше.
avatar
чанки в electro godzilla были основаны на чанках из 4к интры Smile/Sage Group — только больше цветов (ну и тормознее из-за этого)
avatar
Ну давайте попробуем в онлайн редакторе это реализовать и порисовать попробовать. Посмотрим что из этого получится.
avatar
А давайте! :)
avatar
О, это очень круто! Всего лишь изменив текстуру и заюзав инверсию получаем 127 цветов! Сильно!
avatar
А можно мне, дураку, расписать, как вот эти 127 цветов получились? Хотя бы на примере парочки из середины?
avatar
Тут два крупных принципа заложены, даже три.

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. Более того, используя разный растр (ну или текстуру, если будет угодно) мы можем получить еще большее количество оттенков определенного цвета. Но! Чем меньше будет процентное соотношение цветов, тем дальше нужно будет отходить от экрана, чтобы оно действительно работало, как задумано.
avatar
а выводятся знакоместа с текстурами фреймово?
avatar
Всё в ваших руках! :)
avatar
мм. у Алисы есть хорошая песня. Во фрейм не вмещается вроде бы. Или руки выросли из жопы?
avatar
Я тут чутка загнался и сделал вот такую тестовую страничку: artfield.me/127c.html (за работоспособность везде не отвечаю, делал на скорую руку, работает в Хроме)

В общем, какие выводы:
— цветов, по факту, 101. Причем явно различных — довольно немного, на мой мутный взгляд с -7
— большой разброс по hue (мало красного, много синего). Возможно, проблема в формуле, высчитывающей luminance
— два очевидных уровня насыщенности, причем «пастельных» цветов невероятно мало
— выходная палитра очень сильно зависит от небрайта. Если указать веселые значения типа 96 или 160 — палитра резко сокращается до 64 цветов. Можно сами поэкспериментировать со значениями, добавляя их к урлу: artfield.me/127c.html?160
avatar
Артём, я слегка изнасиловал твой скрипт, чтобы сделать заливку поплотнее и лучше увидеть оттенок.
Вышло вот что:
Как ты видишь, оттенки не очень хорошо совпадают. У тебя, я думаю, такая же ошибка как сделал в своё время я.

Допустим, мы смешиваем 50% одного цвета и 50% другого. Законы аддитивного цвета нам говорят: нужно сложить цветовые компоненты и разделить на 2. Вроде всё правильно? Мне кажется, что нет. Дело в том, что смешение цвета происходит на экране, а у экрана — гамма. Гамма монитора в среднем будет что-то типа 2.5. Значит нужно взять покомпонентно оба цвета, перевести их в мониторную гамму, там — смешать и разделить на два, а уже потом — взять обратно гамму. Типа

Rmix = (0.5*R1^2.5+0.5*R2^2.5)^(1/2.5)
avatar
Да, дядьлеш, точно, спасибо. Я люму сначала высчитывал через гамму и думал, что за байда с цветами. Правда стандартную гамму юзал 2.2.
avatar
Слушай, а ответь на вопрос по CSS немного в сторону. Сделать таблицу со строками в 1px очень просто; просто делаешь line-height: 1px; и вперёд. А как сделать ширину ячеек в 1px? Просто width: 1px не работает, видимо из-за того, что не влезает  . Но если убрать  , ячейки вообще схлопываются. Какое стандартное «правильное» решение в этом случае?
avatar
не влезает & n b s p; :)
avatar
font-size: 0 =) ну или 1px
avatar
А, ну да :)
avatar
Вот как получилось: покоцанная страничка.
avatar
У меня отмеченные блоки прям очень сильно отличаются по цвету (в «вычисленных» цветах прям очень темнее).
avatar
А на картинке этого не видно (
avatar
У меня такая же проблема. На картинке этого не видно из-за того, что картинка уменьшена. При фильтрации яркость отдельных узоров нередко съезжает, я это уже встречал не раз. Где-то читал, что это из-за некорректной фильтрации, не учитывающей srgb в рассчетах.
avatar
А как их учитывать?
avatar
Вроде бы оно — www.4p8.com/eric.brasseur/gamma.html
Я не специалист в gamma-коррекции, сам до конца не понимаю.
avatar
Дим, спасибо, шикарная статья. С первого захода не всё осознал, буду вчитываться на каникулах.
avatar
Я сам второй раз читаю, а потом за ненадобностью забывается. tldr, чтобы запомнить самому:
1. человек не все оттенки воспринимает одинаково, поэтому производителями железа было решено распределить яркость от 0 до 255 не линейно. То есть 127 — это не 50% яркости, как можно предположить, а 50% яркости приходится на 187.
2. Это уже давно работает в современном оборудовании (sRGB стандарт), то есть оборудование при показе рассчитывает, что 127 — это не середина градиента. От видеокарт до проекторов и принтеров, вся цепочка.
3. Формулы работы с цветами, которые мы используем, с этим нюансом не считаются, поэтому надо перед подсчетами конвертировать в линейную гамму, а после подсчета — обратно в нелинейную.
avatar
Так я написал же! Я просто не менял ту часть скрипта, где ты генерируешь цвет. Ща. (Заодно проверим, верно ли я понимаю теорию.)
avatar
Что-то я задумался, а не надо ли применять коррекцию гаммы к расчету гигаскрин-палитры? Переводим цвета из sRGB в RGB, считаем гигаскрин RGB, переводим результат обратно в sRGB. Может я сейчас глупость сморозил, но внезапно идея показалась правильной.
avatar
Вот я всегда считал что надо, но цвета пульсара у меня не вышли. С другой стороны, про пульсар последнее время вроде и дайвер высказывал какие-то сомнения. М.б. нужно пересчитать цвета с гаммой и сопоставить с пульсаром. Но это тема для отдельного поста…
avatar
Ммм, а ведь у тебя ошибка, мне кажется…

		if (paper === ink) return paper
		return (paper > ink)
			? 160
			: 96

Это не учитывает яркость, если я верно всё понял.
avatar
Художники, проверяйте оттенки. Вроде на мой глаз всё правильно сейчас: вариант с цветами посчитанными с учётом гаммы 2.3.
avatar
Прекрасно, я тоже не вижу никаких различий. В 53c.artfield.me та же проблема, кстати, тоже нужна гамма-коррекция.
avatar
великолепно.
разницы не видно
avatar
Круто, вот только значения 160 и 90 были выведены из процентовки 37.5% / 62.5%. Это же идея про определенный узор. Нужно вернуть узор, он сейчас не соответствует изначально предложеному. Поэтому да, цвета выглядят круто, но по-факту 127 цветов, хм? Там вероятно разница в один бит где-то из-за округлений всяческих.
avatar
Артём, кстати отличный вариант компактного представления палитры, я что-то с ходу не додумался, нарисовал страшную пирамиду))
avatar
Раз заговорили про гамму, то вброшу сюда же.

Ресайз в полтора раза без гамма-коррекции.


Ресайз в полтора раза с гамма-коррекцией.


Основное внимание не на облака, где использован любимый сомнительный прием, а на вполне «легальный» розовый градиент внизу, и на желто-голубые градиенты лучей света вверху.
Что из этого следует? хз. В идеальном мире надо учитывать этот эффект при показе работ на пати, а в реальном мире скорее всего упремся в то, что ресэмплинг делается в проекторе, он аппаратный, и внешним воздействиям не поддаётся.
avatar
А какой коэффициент гамма-коррекции? Я протестировал irfan view, его опция «try to improve gamma» корректирует гамму примерно на коэффициент 1,5.
avatar
Для каждой градации серого получается свой коэффициент.
nonlinear = ((linear / 255) ^ (1 / gamma)) * 255
linear = ((nonlinear / 255) ^ gamma) * 255

Я использовал стандартную GD2 функцию из PHP для конверсии, gamma ставил 2.2 и 1.0.
avatar
Я тоже экспериментировал с гамма-коррекцией, когда баловался с fakemode:
https://github.com/wbcbz7/watcom-stuff/blob/master/demos/volatile/15BPPTST/15BPPTST.CPP#L478
в принципе, экономия только на делении (которое в ряде случаев заменяется обычным сдвигом, а, у нас же кроссплатформенность :), но как рабочий концепт тоже сойдет (правда тот режим в volatile так и не попал)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.