Прогаем с кенгурой
前往频道在 Telegram
Сидим с кенгурой под горой, запекаем текстуры... { программирование, процедурная генерация, графика, аудио, образование и немного про специфичные игры } https://gostrobrod.dev https://boosty.to/gostrobrod
显示更多236
订阅者
无数据24 小时
无数据7 天
+130 天
帖子存档
Поставил на мак - 20 лет не играл. Буду учить английский мат и ностальгировать.
Пока писал, сам понял физику видикона🤠 зачем мне это - хз, но в универе зачем-то учили это все на телевидении и обработке видеосигналов
Как видите, тут два ключевых момента для корректной имитации:
1 - построение картинки идет по строкам
2 - система инертна, а значит и значения пикселей будут "инертны"
Цвета
Контраст (и насыщенность на цветном) немного понижены
Принцип
Видикон по своей физике — инерционный, нелинейный, малоконтрастный фотопроводник, а не мгновенный фотоэмиттер, в итоге получаем переходы смягчаются, но при этом срезаются крайние значения.
Алгоритм
Ну тут очевидно - слегка понижаем контраст и насыщенность. Если кто забыл как это делать:
// Saturation
float l = rgb2yuv(src.rgb).x;
src.rgb += (src.rgb - l) * U.saturation;
// Contrast
src.rgb = exp(U.contrast) * (src.rgb - 0.5) + 0.5;Нестабильность горизонтальной развёртки
Дрожание строк (смещение/гребенка и тд)
Принцип
Тут уже вопрос не только к самой трубке, но и к системе развертки/синхронизации. Из-за сбоя/реальности мира/плохой настройки строки не синхронизированы с лучом и строки съезжают
Алгоритм
Смещаем x по y и чему еще хотите перед чтением с текстуры. Я вот такого например наворотил:
uv.x += 0.01 * U.amplitude * (sin(U.frequency * uv.y * U.height + U.time) + rand(float2(uv.y, fract(U.time))) * 2 - 1);Затемнение на краях
На краях экрана (слева и справа яркость падает) (это не виньетка!)
Принцип
Из-за большего отклонения на краях строки луч обладает меньшей энергией из-за более длинной траектории и расфокусировки. Как результат, ток падает и визуально края кажутся темнее.
Алгоритм
По гладкой кривой занижаем яркость по
x, например:
float k = 1.0 - 5 * U.amount * pow(in.uv.x - 0.5, 4);
src.rgb *= k;Шлейф
Светлые области оставляют шлейф/след на следующих кадрах
Принцип
Мишень не успевает восстановиться (разрядиться) и остаточный заряд переходит на следующий кадр, добавляя яркости
Алгоритм
Храним предыдущий кадр после смешения и по его яркости мешаем с ним текущий
Bloom
Светлые области "засвечивают", растекаются на близлежащие темные.
Принцип
Из-за того, что луч имеет размер, он задевает яркие участки и засвечивает темные.
Алгоритм
Смешиваем картинку с блюренной по яркости блюренной (чем ярче, тем больше намешиваем. Есть два пути:
1. Правильный - по строкам
2. Простой - просто блюрим и мешаем
Шум в тени
Во всех сенсорах, основанных на электрических процессах, присутствует шум на малоосвещенных участках картинки.
Принцип
Даже при отсутсвии засвета в системе протекают слабые токи, к которым добавлются тепловые флуктуации.
Алгоритм
Добавляем шум с коэффициентом (1-яркость), чтобы зашумить именно темные участки (светлые на самом деле тоже зашумляются, но не так заметно)
Мягкость картинки
На аналоговой камере картинка получается достаточно мягкой - без резких границ (хотя это зависит от трубки)
Принцип
Из-за того, что у нас нет как таковых зерен/пикселей, а только уровень сигнала в момент времени + сканирующий луч имеет толщину и размытие, у нас будут подблюрены строки
Алгоритм
1. Правильный: блюрим строки по горизонтали (луч идет по строкам, соответственно и блюрится будет внутри строки в основном)
2. Простой: просто слегка подблюриваем гауссом весь кадр - эффект будет не такой классный, но мы потом попячим дополнимтельно
Псевдо-жидкость
float2 uv = -1. + 2. * In.v_texcoord;
for(int i = 0; i < 10; ++i) {
uv.y += sin(uv.x * i * 4 + 6 * sin(0.3 * U.time)) * 0.01 * i;
uv.x += sin(uv.y * i * 3 + 8 * cos(0.1 * U.time)) * 0.01 * i;
}
uv = uv * 0.5 + 0.5;
float4 a = mix(float4(1,0,0,1), float4(1,1,0,1), uv.x);
float4 b = mix(float4(0,0,1,1), float4(0,1,0,1), uv.x);
float4 c = mix(a, b, uv.y);
return pow(c,0.75);но если вам нечего делать, можете посмотреть как мы егэ по информатике смотрели https://youtu.be/Vtgy6b2S1rQ?si=8QCPSkQ-lE4K1onx
Так, и видос держите: https://youtu.be/J6t79BEIa9o
гештальт закрыт - можно возвращаться к видеоэффектам
Обернул модель вот этого безобразия в дезмос
https://www.desmos.com/calculator/foeis5maji
Зачем-то решил в ходе прокрастинации смоделировать звук инструмента по его геометрии. Так как есть куча параметров кроме геометрии, а физический мир на практике чуть сложнее трех формул из теории для разных видов вибраторов, пришлось эту кучу параметров подбирать торчом. Результат синтеза все равно - говно. Завтра (уже 2 часа как сегодня) буду искать пакеты для физического моделирования акустических систем.
Так, еще одна статья про базовую диагностику Метала в Хкоде
https://gostrobrod.medium.com/mtl-s02e02-basic-diagnostics-of-metal-in-xcode-a1b9d92875b6
