Info Guide
#13
01 апреля 2021 |
|
GFX - Фотореализм: способы передать ненасыщенные цвета, присущие реальным фотографиям
Фотореализм Alone Coder На обычном атрибутном экране довольно непросто передать ненасыщенные цвета, при─ сущие реальным фотографиям. В середине 90-х многие пытались исполь─ зовать для этого мерцание трёх экранов (R, G,B),но выглядело это неприятно для глаза. Был также вариант с мерцанием двумя экра─ нами (2-color, если предыдущий вариант на─ зывать 3-color, а всю идею - X-color). В том числе его разновидности с чередованием экранов чересстрочно ("gigascreen" по наз─ ванию устройства SchemeMan'а ) или волнами (демонстрировалось на демопати Forever ). Отдельно можно рассматривать мерцание двумя экранами с мультиколором (например,в Eye Ache 2, с понтами названное 2048-цвет─ ным). Был и вариант от Volga Soft (демо Free Art ),где картинка строилась чередующимися строками трёх цветов. В 8 color editor был компромиссный ва─ риант - чересстрочное мерцание трёх экра─ нов, то есть из трёх цветовых составляющих каждый раз не видна только одна. На это можно было хотя бы смотреть без боли, но картинка получалась слишком тёмная,а зани─ мало это почти всё время процессора. Каждый может себе представить, сколько различных комбинаций могут породить разные комбинации числа экранов, размеров пиксе─ ля, шага мультиколора и конкретных ограни─ чений на атрибуты. Например, в ZX-Guide #2 я их насчитал 44, и это были не все вариа─ нты. Но какая из этих комбинаций наиболее эффективно передаёт реальный цвет? 1. Набор оттенков Мерцание тремя экранами даёт в среднем, безусловно, все цвета, но каждый пиксель может быть окрашен только одним из станда─ ртных восьми. Возможность генерировать от─ дельные атрибуты для каждого знакоместа каждого из кадров рассматривалась, в част─ ности, на коммодоровской сцене, но вряд ли кто-то видел практические результаты. В итоге gigascreen может дать более ре─ альные цвета,несмотря на все его ограниче─ ния. Но проблема gigascreen'а и прочих способов мигания двумя экранами - невозмо─ жность стандартизировать результат смеше─ ния цветов. Дело в том, что на Pentagon яркости BRIGHT=0 и 1 отличаются примерно вдвое, а на фирменных машинах - весьма незначитель─ но.А соответствие комбинации чёрный+цвет - конкретной яркости немигающей сетки этого цвета - зависит не только от гамма-харак─ теристики и времени послесвечения, но даже от текущих настроек монитора. Долгое время использовался согласован─ ный с Diver'ом (он использовал на своём "Скорпионе" соотношение неяркий = 50% сет─ ка яркого, что особенно видно на картинке "Alone" )стандарт,что чёрный+яркий равняе─ тся неяркому цвету.Этот стандарт,тоже наз─ ванный Alone, даёт минимум цветов - всего 83, зато предсказуемых, если пользователь настроит свой экран с его учётом (обычно хватало ручек яркости и контраста). Журнал Info Guide для фотографий всегда использу─ ет именно этот стандарт, ещё с тех времён, когда редактировался на реальном "Пентаго─ не". Проблема в том, что позже сам Diver отказался от этого стандарта в пользу па─ литры Pulsar. Под неё сейчас рисуются кар─ тинки на демопати,показываемые в эмуляторе без мерцания и также (исторически некорре─ ктно) называемые "gigascreen". Разумеется, эта палитра не соответствует фирменному железу, причём неизвестен даже разброс его характеристик. То есть, как ни крути, но используя 2- color общего вида, вы не можете рассчиты─ вать,что зарубежные пользователи (основной потребитель продуктов "48K only" и "128K only" ) увидят вашу картинку правильно. Можно ли как-то ограничить 2-color для большей совместимости? Безусловно. Простейший выход - отказ от использова─ ния яркости и разделение картинки на два слоя с известными характеристиками. Допус─ тим,слой цвета и слой ч/б.Перспективно для цветных чанков, но бесперспективно для фо─ тографий - именно из-за проблемы в заголо─ вке: мы ограничены всего шестью плоскостя─ ми в цветовом кубе, в которые даже не впи─ сывается телесный цветопереход. Другой вариант использовался в Crazy Love - выбираем конкретные два цвета на чёрном фоне и конвертируем в них. Но это опять ограничивает число оттенков. Даже не получится классическая комбинация цианотип + сепия (именно это называлось в истории кинематографа термином "мультиколор"), ра─ зве что заменить оранжевый на красный или, допустим, желтый - но во втором случае вы останетесь без белого. Можно использовать три цвета с мульти─ колором,как упомянутые Volga Soft. Или че─ тыре, как у нас на кубике в интро (оно, кстати, работает и на фирменном 48K ). Но надо учесть, что отдельные цветовые линии могут фильтроваться кодировкой. В том ку─ бике цвета были еле видны после проектора, когда мы его тестировали на "Дне космонав─ та" в 2019 году. Интерес представляет R-Mode (под 128K ) - вариация 4 цветовых слоёв, где атрибуты не фиксированы, но нет яркости и допустимо только несколько цветовых комбинаций (один слой использует только атрибуты 0B и 0Y, другой только 0R и 0C, третий 0G и 0M, четвёртый всегда 0W, атрибуты выводятся push'ем в верхнем бордере). Этот режим я пытался пробивать ещё во времена ACNews #59, но до сих пор не вышло ни одного ре─ лиза с его использованием.Возможно,потому, что gfx maker'ы,специализирующиеся на кон─ версиях в 6912, беспомощны в других видео─ режимах, а художники, которые рисуют сами, пасуют начинать без специализированного удобного инструмента. 2. Видимые дефекты В случае фотографий замазать границы знакомест планированием рисунка не получи─ тся. Поэтому все дефекты выбранного метода в плане использования квадратов будут вид─ ны. В частности, конвертированный 2-color всегда содержит видимые квадраты,а мульти─ колор или MCX (мультиколор на 2 экранах) - видимые полоски. Причём полоски эти - ран─ домные, так что вопреки интуиции R-Mode выглядит лучше, чем MCX, несмотря на огро─ мные ограничения и огромную же экономию процессорного времени! Можете легко срав─ нить MCX и R-Mode в конверторе Con18 - не знаю других конверторов с этими режимами, так что ссылаюсь на свой. Видимые дефекты бывают и из-за упомяну─ той проблемы несоответствия палитры (соот─ ношение яркостей, гамма-характеристика, кривая послесвечения) у автора картинки и у пользователя. Бывают и другие проблемы, связанные с границами знакомест.Известна,например,беда "Пентагона" с показом последовательности знакомест ink N (paper не важен), paper N (ink не важен), где соседствуют пиксели, казалось бы, одного цвета, но в реальности между ними палка. Известны также нелинейные искажения на границах цветов. Например, первое время у нас в журнале картинки мерцали через атри─ бутную сетку 8x8, и это выглядело на реа─ льном "Пентагоне" лучше, чем мигание спло─ шными атрибутами - из-за того, что кадры меньше отличались друг от друга на глаз и не приводили к разному масштабированию строки на CRT из-за разной яркости. Но по─ том выяснилось, что у некоторых пользова─ телей сетка только ухудшает вид, так что от неё пришлось отказаться. Конечно, сейчас уже не принято ставить себе мониторы с искажениями на границах цветов и масштабированием и сдвигом строк в зависимости от их окраски,но не зная ре─ ального железа и рисуя или конвертируя под эмулятор с аккуратными квадратными пиксе─ лями, gfx maker рискует скатиться в фейк─ бит и хипстерство. 3. Динамический диапазон Одно из простейших решений в случае ча─ нков 4x4 - наложить один яркий цвет на другой яркий цвет.Это проверенный временем метод.Его можно отрисовывать чересстрочно, как в Eye Ache 2, Anamnesis или Stellar Contour, таким образом исключить адское мигание за счёт потери тактов. Можно даже чередовать яркие и неяркие строчки - нес─ мотря на несовместимость уровней, в данном случае никто почти не заметит разницы. По─ чему? Потому что цветов будет всего 64, все они "значимые", без каких-либо штрихо─ вок и прочих цветопереходов. Но попробуйте сконвертировать фотогра─ фию в 64 стандартных цвета (такая опция есть в Photoshop'е) без штриховки.Годится? Никуда не годится!Даже упомянутый вариант, когда второй слой - ч/б, выглядит лучше. Потому что там есть хоть какая-то регули─ ровка яркости. Даже чёрно-белая фотография со штриховкой и то красивее! Так мы постепенно подходим к выводу,что живость фотографии обеспечивается динами─ ческим диапазоном, или, во всяком случае, он сильно влияет на результат. В одной клетке 4x4 помещается всего 16 пикселей - это 17 уровней яркости. И это большая клетка, на ней мы теряем детали. Если использовать сетку 4x4 на клетках меньшего размера, мы всё равно будем те─ рять детали. Если использовать распростра─ нение шума типа Floyd-Steinberg, мы всё равно будем терять детали, хоть и меньше. А теперь скажите - вы видели ZX-Stag? 4. Нет, мы приличные мальчики Так вот - когда чередуется несколько картинок с разными фазами штриховки, недо─ статки этих штриховок компенсируют друг друга. Глаза,мозги и прочая требуха каким- то образом вычисляют среднюю яркость. При─ чём вычисляют её на протяжении целой секу─ нды или около того,судя по моим экспериме─ нтам.И ещё несколько результатов этих экс─ периментов. Чем чаще меняются картинки, тем лучше результат. Чем менее заметно ци─ клы, тем лучше результат. Чем картинки бо─ лее похожи, тем лучше результат. Чем лучше выглядит каждая картинка в отдельности - тем лучше результат. Сразу отметаем хранение 16 независимых картинок для каждой фазы штриховки 4x4. На 128K буржуйского ОЗУ каждый килобайт на счету.(Хочешь Спектрум без проблем - поку─ паешь АТМ. ) Поэтому будем штриховать про─ граммно. Чтобы штриховать программно, нам нужен образ картинки с глубиной цвета 4 бита на пиксель и в удобном формате. Формула штрихования: pixel = pixture[y][x] > chunkpixelnumber [(y+yshift)&3, (x+xshift)&3]; Где: int chunkpixelnumber[4][4] = { {0x0, 0xc, 0x2, 0xe}, {0x8, 0x4, 0xa, 0x6}, {0x3, 0xf, 0x1, 0xd}, {0xb, 0x7, 0x9, 0x5} }; x, y = 0..3; xshift, yshift зависят от номера кадра. Допустим, скачут ходом коня. Но если мы будем возиться с каждым пик─ селем, то картинка будет обновляться слиш─ ком медленно. Поэтому найдём самые популя─ рные группы по 4 пикселя (если отличие в 1 уровень яркости - считаем, что совпало) и выводим так: pop bc ;4pix + 4pix ld l,c ld a,(hl) ;%abcd0000 inc h ld l,b or (hl) ;%0000efgh ld (de),a inc e pop bc ;4pix + 4pix ld l,b ld a,(hl) ;%0000efgh dec h ld l,c or (hl) ;%abcd0000 ld (de),a inc e ;47 t/b (чуть больше 4 фреймов весь экран) ;Таблицы = 16*2*256 = 8K. ;Образ картинки = 12K. Так что эта программа вместе с данными помещается даже в 48K. Даже в Timex с ап─ паратным мультиколором при разлиновке ме─ тодом Volga Soft. Но практика показала,что разлиновка по три строки сильно портит де─ тали, да и Таймексы нынче непопулярны. (Можно ли вывести эти атрибутные полоски на оригинальном 48K? Можно, я писал такой код, но он очень жирный, да и времени под эффект не остаётся) 5. Как же мы раскрасим картинку? Понятно,что видеорежимы,пожирающие про─ цессорное время, не годятся для такого ин─ теллектуального вывода. Так что в качестве видеорежима возьмём R-Mode. Con18 умеет выгружать не только сам R-Mode (пиксели с атрибутами), но и 8-битные модели его сло─ ёв, а мы выбросим пиксели и воспользуемся только атрибутами и этими моделями слоёв. Разрешение каждого слоя - 96x256, всего 4 слоя, так что образ картинки займёт 24K. Это всё ещё в допустимых пределах размера нижней памяти и огрызка 7-й страницы, где лежит один из используемых экранов. Надо только покрасивее уместить отрисо─ вщик в 224 такта, выделенных на одну стро─ ку, ведь каждую строку надо переключать номер экрана. Пишем так: mcpush1q if PENT ds 1 else ds 11 ;10=глюк справа вверху на +3 endif mcnoisepicH=$+2 ld sp,repic mcnoisescraddrH=$+2 ld de,0x4000 curchunkH=$+1 ld h,rebyte1/256 mcloop0 ;max +122 (119-1,120-1 или 126-1 (ld h,N)) exx out (c),d ;screen change at +138 exx ;+142 pop bc ;4pix + 4pix ld l,c ld a,(hl) ;%abcd0000 ;slowmem inc h ld l,b or (hl) ;%0000efgh ;slowmem ld (de),a ;slowmem ;+185 pop bc ;4pix + 4pix ld l,b ld a,(hl) ;%0000efgh ;slowmem ld l,c ;+210 pop bc ;4pix + 4pix ;!!!!!!!!! inc e dec h or (hl) ;%abcd0000 ;slowmem ;+235 = +7 ld (de),a ;slowmem (write at +16) ;+16 inc e ld l,c ld a,(hl) ;%abcd0000 ;slowmem inc h ld l,b or (hl) ;%0000efgh ;slowmem ;+48 ld (de),a ;slowmem (write at +55) ;+56 pop bc ;4pix + 4pix ;+66 inc e nop ;!!!!!!!!!!!!!!! ld l,b ld a,(hl) ;%0000efgh ;slowmem dec h ld l,c or (hl) ;%abcd0000 ;slowmem ;+104 ld (de),a ;slowmem (write at +111) ;+112 ;----------------- inc e exx out (c),e ;screen change at +132 ;(nowait),нельзя сдвинуть назад exx ;+136 pop bc ;4pix + 4pix ld l,c ld a,(hl) ;%abcd0000 ;slowmem inc h ld l,b or (hl) ;%0000efgh ;slowmem ld (de),a ;slowmem inc e ;47 ;+183 pop bc ;4pix + 4pix ld l,b ld a,(hl) ;%0000efgh ;slowmem ld l,c ;+208 pop bc ;4pix + 4pix dec h or (hl) ;%abcd0000 ;slowmem ;+229 = +1 ld (de),a ;slowmem (write at +8) ;+8 inc e ld l,c ld a,(hl) ;%abcd0000 ;slowmem inc h ld l,b or (hl) ;%0000efgh ;slowmem ;+40 ld (de),a ;slowmem (write at +47) ;+48 pop bc ;4pix + 4pix ;+58 inc e nop ;!!!!!!!!!!!!!!! ld l,b ld a,(hl) ;%0000efgh ;slowmem dec h ld l,c or (hl) ;%abcd0000 ;slowmem ;+96 ld (de),a ;slowmem (write at +103) ;+104 if PENT ds 3 endif inc e jr nz,mcloop0 ;+120 ;+115 inc d ;+119 И аналогично ещё 3 строки.Дальше повто─ ряется. Разные задержки - для разных машин (+2/ +3/Pentagon) . ATM считаем Пентагоном. Как и ожидалось, на некоторых картинках это выглядит лучше голого R-Mode. Во вся─ ком случае, более живо. И всё ещё остаётся возможность выводить чёрно-белые спрайты поверх картинки. Кому как, а мне кажется,что хоть в паре дем это надо использовать хотя бы для ути─ рания носа коммодорщикам, которым даже па─ мяти не хватит на такой фокус :) Примеры в приложении,конвертор тоже,ис─ ходники тоже, а я это написал и перешёл к другим проектам!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября