Просмотр полной версии : Программная реализация noflic для gigascreen
Всем приветы. Я делаю свой эмулятор и задумал реализовать такую классную штуку как gigascreen (тот, который не моргает). В unreal есть опция, которая этот режим включает, а вот в исходниках я ничего не смог найти, хотя всё перерыл.
Насколько я понял, эта опция выводит для пикселей "средний" цвет, полученный из пикселей 5го и 7го экранов в случае их частой смены, так? Вот только каким-то хитрым образом этот режим не включается, если смена 5го и 7го экранов используется для других эффектов - например, для эффекта "шторы".
Помогите найти истину.
Пример покажи.
самый лучший:) нофлик в z80stealth, причем два режима - ручной и авто. посмотри..
Ммм.. я не имел ввиду, что он не включается у меня, а то, что где-то он включается сам, а где-то нет. Логику этого я и хотел понять. Но вроде бы понял - если в порт EFF7.4 записать единичку, то по идее он должен включиться, так? Это понятно.
Теперь нужно понять как именно объединяются экраны и какой результирующий цвет палитры должен получиться.
P.S. z80stealth у меня, к сожалению, не запускается. Видимо, несовместим с win64.
Что такое нофлик? Мне часов видео присылают с ютуб пишут нофлик, что это значит?
Переключение между 5 и 7 экраном не мерцает на мониторе
Переключение между 5 и 7 экраном не мерцает на мониторе
Ой, да что вы говорите) :v2_dizzy_snowball:
ну как минимум в Унриле это так.
---------- Post added at 01:16 ---------- Previous post was at 01:15 ----------
Прошу заметить, что ААА спрашивал в отношении видеофайлов на ютубе.
Теперь понятно.
Вообще noflic ~ "no flicker", то есть "не мерцает". Относительно к эффекту gigascreen это означает, что "мультиколор" достигается не кажущимся наложением быстромерцающих атрибутов, а некоторой программно-аппаратной отработкой эффекта, выводящей сразу смешанный цвет, но постоянный по яркости (то есть, не мерцающий).
Собственно, этот алгоритм я и ищу :(
В любом случае мультиколор это наложение цветов друг на друга. Иначе ни как. Возможно из за скорости наложения разные эффекты, но суть то одна.
shurik-ua
22.10.2014, 13:55
Я думаю нужно преобразовать 4-х битное значение каждого пикселя (по 2 бита в каждом экране) в 3-хбитное.
А никто не изучал вопрос цветовой коррекции для noflick фильтра, чтобы цвет соответствовал тому что при мерцании получается? На pc можно получить реальную картинку, если сихронизировать эмуляцию не по 50 герцам, а по частоте дисплея, т.е. 60 или 75 герц. Пробовал подбирать формулы для цвета чтобы в noflick такие-же цвета получались, но простые варианты с коэффициентами не сработали, тут видимо нужно каждый компонент rgb расчитывать как функцию от всех компонентов обоих rgb значений на входе...
Реализация в Unreal уже есть, она вполне корректная и цвета получаются естественные. Осталось только найти это место в исходниках или ещё где-то отковырять.
// 2x 32bit
void render_2x(u8 *dst, u32 pitch)
{
if (!conf.noflic)
{
u32 *src = (u32*)vbuf[vid.buf];
src += conf.framex * 2;
src += conf.framey * VID_WIDTH * 2;
for (u32 i=0; i<conf.frameysize; i++)
{
memcpy (dst, src, pitch); dst += pitch;
memcpy (dst, src, pitch); dst += pitch;
src += VID_WIDTH * 2;
}
}
else // noflic
{
RGB32 *src1 = (RGB32*)vbuf[vid.buf];
src1 += conf.framex * 2;
src1 += conf.framey * VID_WIDTH * 2;
RGB32 *src2 = (RGB32*)vbuf[vid.buf^1];
src2 += conf.framex * 2;
src2 += conf.framey * VID_WIDTH * 2;
for (u32 i=0; i<conf.frameysize; i++)
{
RGB32 *src11 = src1;
RGB32 *src22 = src2;
u8 *dst1 = dst;
for (u32 j=0; j<(pitch/4); j++)
{
RGB32 p1 = *src11++; RGB32 p2 = *src22++;
*dst++ = (p1.b + p2.b) >> 1;
*dst++ = (p1.g + p2.g) >> 1;
*dst++ = (p1.r + p2.r) >> 1;
dst++;
}
memcpy (dst, dst1, pitch); dst += pitch;
src1 += VID_WIDTH * 2;
src2 += VID_WIDTH * 2;
}
}
}
Обычный motion blur, в общем.
Реализация в Unreal уже есть, она вполне корректная и цвета получаются естественные. Осталось только найти это место в исходниках или ещё где-то отковырять.
Да она во всех эмуляторах есть, что там смотреть - просто среднее значение пикселов от последних двух кадров, для каждого компонента цвета y=(y¹+y²)/2
просто среднее значение пикселов от последних двух кадров
Exactly! :)
Kakos_nonos
26.10.2014, 17:05
Да, надо брать среднее от двух показанных кадров, а не 5-ую и 7-ую страницу.
Так как там что-то рисуется в процессе, и мы будем это видеть, а видеть не должны.
Только всё же надо делать гамма-коррекцию. Простое усреднение даёт заметно более тёмные цвета. Я только что соорудил у себя в эмуляторе БК антифликер -- и могу сказать, что без гамма-коррекции цвета заметно не те, какие должны быть. Это заметили все, кому показывал версию с простым усреднением.
Только всё же надо делать гамма-коррекцию. Простое усреднение даёт заметно более тёмные цвета. Я только что соорудил у себя в эмуляторе БК антифликер -- и могу сказать, что без гамма-коррекции цвета заметно не те, какие должны быть. Это заметили все, кому показывал версию с простым усреднением.
Было бы интересно как-то сравнить изображение с ТВ и с монитора...
Было бы интересно как-то сравнить изображение с ТВ и с монитора
Весь прикол в том, что на разных мониках/телеках вывод с реала "моргает" по-разному.
Обусловлено это, в том числе, и отличающимися уровнями RGB-сигналов на выходах с реала.
Где-то одна схема, где-то другая, где-то резисторы не такие... в итоге моргает не совсем одинаково.
А при выводе черно-белого сигнала эти псевдоцвета вообще до эпилепсии могут довести =)
Весь прикол в том, что на разных мониках/телеках вывод с реала "моргает" по-разному.
Обусловлено это, в том числе, и отличающимися уровнями RGB-сигналов на выходах с реала.
Где-то одна схема, где-то другая, где-то резисторы не такие... в итоге моргает не совсем одинаково.
А при выводе черно-белого сигнала эти псевдоцвета вообще до эпилепсии могут довести =)
Тогда непонятно какую роль играет во всём этом гамма-коррекция, если невозможно сравнить требуемое и полученное. Да, возможно, что с гамма-коррекцией цвета светлее, но не факт, что правильнее.
По логике гамма-коррекции не должно быть, ведь мы миксуем уже откорректированные цвета.
По логике гамма-коррекции не должно быть, ведь мы миксуем уже откорректированные цвета.
Так это и есть гамма-коррекция. Как же её не должно быть?
Напоминаю, монитор нелинеен. Если складывать цвета без гамма-коррекции, то картинка выходит темнее, причём в некоторых парах цветов -- в полтора раза! Это уже не у кого там какие резисторы стоят, это очень сильно бросается в глаза.
Так это и есть гамма-коррекция. Как же её не должно быть?
Напоминаю, монитор нелинеен. Если складывать цвета без гамма-коррекции, то картинка выходит темнее, причём в некоторых парах цветов -- в полтора раза! Это уже не у кого там какие резисторы стоят, это очень сильно бросается в глаза.
Темнее чем что? Должна ли она быть такой тёмной или должна быть светлее? Если все ЭЛТ и ТВ отображают разное, то с чем ты сравниваешь?
Ещё раз. Есть разница между разбросом параметров мониторов, а есть -- между корректной математикой и некорректной. Вторая искажает изображение куда сильнее, чем любой разброс параметров.
Ещё раз. Есть разница между разбросом параметров мониторов, а есть -- между корректной математикой и некорректной. Вторая искажает изображение куда сильнее, чем любой разброс параметров.
Математику в студию :)
Если у меня отображается, например, синий цвет, который уже гамма-скорректирован (то есть добавлена поправка на то, что цвет перенесён с ЭЛТ на нормальный монитор), а поверх него жёлтый, который тоже гамма-скорректирован. Если я теперь смешиваю эти два цвета, применяя формулу к финальным цифрам, зачем мне дополнительно ещё раз вводить гамма-коррекцию и самое главное - как именно?
Если речь про гамма-коррекцию при интерполяции на экранах ПК, то очевидно нужно делать двойную конвертацию: srgb->linear->interpolate->srgb.
Но насколько я понимаю на самом деле речь про CRT, и тут простое sRGB уже не катит, там еще задействована инертность (послесвечение) люминофора.
Лучший критерий в данном случае - субъективные ощущения. Или в лучшем случае видео запись с экрана ТВ с выдержкой не меньше 1/25. Предлагаю подбирать формулы интерполяции опытным путем. Но очевидно что должна быть не линейная интерполяция.
насколько я понимаю на самом деле речь про CRT
Да, это тоже важно. Моргание (даже в эмуляторе) на CRT и на ЖК - две разные вещи.
Если речь про гамма-коррекцию при интерполяции на экранах ПК, то очевидно нужно делать двойную конвертацию: srgb->linear->interpolate->srgb.
Я так и сделал.
Но насколько я понимаю на самом деле речь про CRT, и тут простое sRGB уже не катит, там еще задействована инертность (послесвечение) люминофора.
Реальное послесвечение люминофора мало (единицы процентов), и его можно не учитывать. В этом можно легко убедиться, посмотрев на скоростную съёмку работы ЭЛТ:
https://youtu.be/3BJU2drrtCM?t=96
- - - Добавлено - - -
Если у меня отображается, например, синий цвет, который уже гамма-скорректирован (то есть добавлена поправка на то, что цвет перенесён с ЭЛТ на нормальный монитор), а поверх него жёлтый, который тоже гамма-скорректирован. Если я теперь смешиваю эти два цвета, применяя формулу к финальным цифрам, зачем мне дополнительно ещё раз вводить гамма-коррекцию и самое главное - как именно?
У тебя нет "нормального монитора, который гамма-скорректирован". У тебя есть либо труба с гаммой около 2,2, для которой надо делать гамма-коррекцию, либо ЖК-монитор, который эмулирует трубу с гаммой 2,2. И ему тоже надо делать гамма коррекцию.
Поэтому: отменяем гамму, переходя в линейное пространство, усредняем, а потом обратно делаем гамма-коррекцию. Иначе усреднённый цвет будет слишком тёмным.
Реальное послесвечение люминофора мало (единицы процентов), и его можно не учитывать. В этом можно легко убедиться, посмотрев на скоростную съёмку работы ЭЛТ:
https://youtu.be/3BJU2drrtCM?t=96
Как оценивалось-то? На скоростном видео контрастность конская.
Судя по этому кадру - процентов 15-20 яркости от предыдущего кадра остается.
https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/CRTslowmotion_PetesDragon.jpg/440px-CRTslowmotion_PetesDragon.jpg
Я прекрасно помню как играл в пинг-понг на ЭЛТ, и какой был шлейф от двигающегося белого квадрата "мяча" на абсолютно черном фоне.
И не учитывать этого - неправильно. Именно этот эффект при отсутствии какого-либо еще сглаживания между кадрами давал на старых ЭЛТ телевизорах более-менее не выжигающий глаз гигаскрин.
Т.е. он не "усреднял" а именно подтягивал темные оттенки так что контраст при мерцании с черным становился существенно меньше. До черного он не успевает погаснуть за 1 фрейм. И за 10 фреймов остается немного.
Видеодемонстрация: https://www.youtube.com/watch?v=lGUtcf06BSc&t=1565s
HardWareMan
02.06.2022, 20:14
Я прекрасно помню как играл в пинг-понг на ЭЛТ, и какой был шлейф от двигающегося белого квадрата "мяча" на абсолютно черном фоне.
И не учитывать этого - неправильно. Именно этот эффект при отсутствии какого-либо еще сглаживания между кадрами давал на старых ЭЛТ телевизорах более-менее не выжигающий глаз гигаскрин.
Т.е. он не "усреднял" а именно подтягивал темные оттенки так что контраст при мерцании с черным становился существенно меньше. До черного он не успевает погаснуть за 1 фрейм. И за 10 фреймов остается немного.
Это немного другое. Это был глоуинг (от английского to glow - светиться). Засветка ближних люминофоров за счёт отраженного света в толстом экранном стекле кинескопа. Из-за него яркая точка превращается прямо в пятно с размытым краем. Это даже стали добавлять в шейдеры эмуляторов...
Это немного другое. Это был глоуинг (от английского to glow - светиться). Засветка ближних люминофоров за счёт отраженного света в толстом экранном стекле кинескопа. Из-за него яркая точка превращается прямо в пятно с размытым краем. Это даже стали добавлять в шейдеры эмуляторов...
Я именно не про глоу, а про шлейф как от кометы, остававшийся за квадратным "шариком" в игре Pong. На видео можно увидеть до 5ти предыдущих кадров (хотя там качество записи так себе).
яркая точка превращается прямо в пятно с размытым краем
На цветных телевизорах - да, размытие (нечеткость) есть ввиду неидеального сведения пушек. На черно-белых ситуация заметно лучше.
давал на старых ЭЛТ телевизорах более-менее не выжигающий глаз гигаскрин
Точнее, гигаскрин сглаживался "аппаратным размытием" телевизора, благодаря ему соседние строки по минимуму, но смешиваются.
А вообще, именно инерционность затухания люминофора и дает возможность не плакать кровью при просмотре 50Гц развертки.
Хотя, когда забросил Спектрум и засел на PC + CRT-монитор со 120Гц кадровой, стал сразу видеть это жуткое 50Гц моргание. Раньше как-то не мешало =)
Сейчас пользуюсь RGB-VGA кодером и теми же 50Гц, но на ЖК оно, понятно, проблем не создает. Но фликер совершенно иной, чем на CRT.
И тут даже не в гигаскрине дело. Полно старого софта, просто моргающего экранами с разными атрибутами для расширения палитры.
Про шлейф от ярких движущихся объектов - да, это особенность CRT, придающая особый шарм, если так можно выразиться.
Скажем, те же плавающие по синусу вверх-вниз 50Гц менюшки в интрах-демках на ЖК выглядят очень мерзко, а вот на CRT замечательно.
HardWareMan
02.06.2022, 21:37
На цветных телевизорах - да, размытие (нечеткость) есть ввиду неидеального сведения пушек. На черно-белых ситуация заметно лучше.
Нет. Речь не о плохом сведении и не о плохом фокусе. А эффект заметен больше в тёмном окружении. Цветные чаще потому что у них больше диагональ. А чем больше диагональ, тем толще экранное стекло. И там формируются переотражения.
Я именно не про глоу, а про шлейф как от кометы, остававшийся за квадратным "шариком" в игре Pong. На видео можно увидеть до 5ти предыдущих кадров (хотя там качество записи так себе).
Я знаю, что ты имел в виду. И это глоуинг. И выглядит он как уменьшающийся хвост именно потому, что граница уменьшается градиентом от края реальной экспозиции люминофора лучом. И чем толще экранное стекло, тем больше этого послесвечения. Поэтому, оно больше заметно на больших диагоналях (у нас это 51 см или 61 см), а на 31см почти не заметно - там стекло тоньше.
И это глоуинг.
В таком случае хвост должен сужаться, а он идет идеально ровно той же толщины что и текущий светящийся квадрат. Это именно инерция гашения люминофора от максимальной яркости. Называется phosphor decay (https://int10h.org/blog/2021/01/simulating-crt-monitors-ffmpeg-pt-1-color/). А глоу - это расширение зоны свечения на соседей. Не шлейф при движении, а некое фиксированное гало.
И каким образом толщина стекла вообще на это влияет? Какова физика этого?
Сравнил изображение, записанное с Тауона с изображением с эмулятора Viva Games
https://e-wm.org/i/E20220603-013152-001.png
На тауоне вроде как немного ярче цвета, поэтому и смешанный полутон синего тоже чуть ярче.
Было бы интересно сравнить с записью изображения с ТВ. Хотя бы с одного.
Было бы интересно сравнить с записью изображения с ТВ. Хотя бы с одного
С этим есть определенные проблемы. Типовым смартфоном снять не получится из-за дикого моргания на выходе...
Нужна съемка именно 25Гц камерой, как писали выше. Желательно синхронизированной с ТВ (в идеале), но пойдет и без.
HardWareMan
03.06.2022, 08:00
И каким образом толщина стекла вообще на это влияет? Какова физика этого?
Я не нашёл готовой картинки, хотя вроде как встречал такую. Попробую объяснить своими словами. Точка излучает не линейно вперёд, а сферой, как в самом известном опыте с двумя щелями. И это излучение попадает в толщину стекла экрана. Там происходит преломление а потом ещё и переотражение, которое начинает возбуждать соседние люминофоры. Естественно, чем дальше люминофор от точки, подсвеченной лучом, тем меньше энергии переотражения и соответственно меньше свечение. Яркий фонарик так же засвечивает люминофор - я в детстве так игрался тоже. Схема примерно такая, нарисовал культяпкой в ножницах:
https://i.ibb.co/Qc5NSSp/image.png
Кстати, на счёт преломления. Давным давно, когда я писал визуальный плагин к AIMPу, мне прилетела жалоба, что у меня смещены красные элементы относительно зелёных. В ходе обсуждения выяснилось, что у человека ЭЛТ динафлэт монитор и плеер он загонял в угол. Прикол этих "динафлэт"ов в том, что они плоские только снаружи, а внутри маска пузатая, в отличии от настоящих плоских, вроде тринитрона. Поэтому, толщина стекла по углам была больше, чем в центре. И уже на них преломление видно было вообще сильно.
HardWareMan, ну это плюс-минус механизм образования ореолов (glow). Обратное отражение электронного луча и диффузия. Но это практически ничего общего с after-glow, phosphor decay не имеет. Судя по конфигам эмуляции этих эффектов after-glow где-то 95% за кадр рассеивается. Но на абсолютно черном экране, в темном помещении, и 5% от 5% видны, потому такие шлейфы за двигающемся белым квадратом (и поэтому gigascreen на CRT происходит с максимальной контрастностью черный-белый в 1:20).
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot