Прогаем с кенгурой
229 subscribers
188 photos
187 videos
17 files
155 links
Сидим с кенгурой под горой, запекаем текстуры...

{ программирование, процедурная генерация, графика, аудио, образование и немного про специфичные игры }

https://gostrobrod.dev
Download Telegram
Самое красивое и интересное тут (ИМХО) это передающие телевизионные трубки:
1 - иконоскоп
2 - супериконоскоп
3 - ортикон
4 - суперортикон
5 - видикон
6 - много их разных еще есть

Вообще там еще катушки должны быть фокусирующие и отклоняющие, но на картинке их нет.

Принцип их +/- похожий:
- свет с объектива заряжает мишень
- при сканировании мишени лучом тот дозаряжает каждый участок, при этом если он уже был заряжен, но этот заряд идет в сигнал

Вариации идут в основном во взаимном расположении мишени, входа и источника сканирующего луча. И в том, фотоэффект напрямую из источника изображения или через внутренние элементы для усиления (как в радиолампе)

Из-за того, что у нас мишень, а не матрица, то в зависимости от устройства у нас либо не будет пикселей вообще, либо будет зерно, либо какая-то маска.
2👀2
Кстати за вот это вот все и дальше скажите спасибо Эйнштейну, который открыл фотоэффект и получил за это нобелевку более ста лет назад.
🔥53
Зачем-то решил в ходе прокрастинации смоделировать звук инструмента по его геометрии. Так как есть куча параметров кроме геометрии, а физический мир на практике чуть сложнее трех формул из теории для разных видов вибраторов, пришлось эту кучу параметров подбирать торчом. Результат синтеза все равно - говно. Завтра (уже 2 часа как сегодня) буду искать пакеты для физического моделирования акустических систем.
😁3
я зачем-то заболел, потому посты пока на паузе
😢2🙏21
Media is too big
VIEW IN TELEGRAM
Псевдо-жидкость


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);
🔥6👍1
математически обоснованный костыль не является костылем
🔥3💘21😁1
Media is too big
VIEW IN TELEGRAM
Мягкость картинки
На аналоговой камере картинка получается достаточно мягкой - без резких границ (хотя это зависит от трубки)

Принцип
Из-за того, что у нас нет как таковых зерен/пикселей, а только уровень сигнала в момент времени + сканирующий луч имеет толщину и размытие, у нас будут подблюрены строки

Алгоритм
1. Правильный: блюрим строки по горизонтали (луч идет по строкам, соответственно и блюрится будет внутри строки в основном)
2. Простой: просто слегка подблюриваем гауссом весь кадр - эффект будет не такой классный, но мы потом попячим дополнимтельно
2👀2
Media is too big
VIEW IN TELEGRAM
Шум в тени
Во всех сенсорах, основанных на электрических процессах, присутствует шум на малоосвещенных участках картинки.

Принцип
Даже при отсутсвии засвета в системе протекают слабые токи, к которым добавлются тепловые флуктуации.

Алгоритм
Добавляем шум с коэффициентом (1-яркость), чтобы зашумить именно темные участки (светлые на самом деле тоже зашумляются, но не так заметно)
👍3
Media is too big
VIEW IN TELEGRAM
Bloom
Светлые области "засвечивают", растекаются на близлежащие темные.

Принцип
Из-за того, что луч имеет размер, он задевает яркие участки и засвечивает темные.

Алгоритм
Смешиваем картинку с блюренной по яркости блюренной (чем ярче, тем больше намешиваем. Есть два пути:
1. Правильный - по строкам
2. Простой - просто блюрим и мешаем
👍1
Media is too big
VIEW IN TELEGRAM
Шлейф
Светлые области оставляют шлейф/след на следующих кадрах

Принцип
Мишень не успевает восстановиться (разрядиться) и остаточный заряд переходит на следующий кадр, добавляя яркости

Алгоритм
Храним предыдущий кадр после смешения и по его яркости мешаем с ним текущий
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Затемнение на краях
На краях экрана (слева и справа яркость падает) (это не виньетка!)

Принцип
Из-за большего отклонения на краях строки луч обладает меньшей энергией из-за более длинной траектории и расфокусировки. Как результат, ток падает и визуально края кажутся темнее.

Алгоритм
По гладкой кривой занижаем яркость по x, например:

float k = 1.0 - 5 * U.amount * pow(in.uv.x - 0.5, 4);
src.rgb *= k;
👍3
Media is too big
VIEW IN TELEGRAM
Нестабильность горизонтальной развёртки
Дрожание строк (смещение/гребенка и тд)

Принцип
Тут уже вопрос не только к самой трубке, но и к системе развертки/синхронизации. Из-за сбоя/реальности мира/плохой настройки строки не синхронизированы с лучом и строки съезжают

Алгоритм
Смещаем 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);
3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Цвета
Контраст (и насыщенность на цветном) немного понижены

Принцип
Видикон по своей физике — инерционный, нелинейный, малоконтрастный фотопроводник, а не мгновенный фотоэмиттер, в итоге получаем переходы смягчаются, но при этом срезаются крайние значения.

Алгоритм
Ну тут очевидно - слегка понижаем контраст и насыщенность. Если кто забыл как это делать:

// 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;
👍3