Прогаем с кенгурой
228 subscribers
190 photos
189 videos
17 files
156 links
Сидим с кенгурой под горой, запекаем текстуры...

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

https://gostrobrod.dev
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Сразу добавлю короткий топик, касающийся непосредственно химии пленки - зерно

Принцип я думаю понятен: изображение на пленке таки дискретное и состоит из зерен - я про это рассказывал парой постов выше. Таким образом, если пленка крупнозернистая (по разным причинам) это зерно может быть заметно.

Алгоритм
Тут все еще проще: считаем шум и с коэффициентом добавляем к нашей яркости. Если шум сделать цветным, а не чисто яркостным, то результат будет выглядеть не как пленочное зерно, а как шум на цифровой матрице (но об этом в другой ветке).


float rand(float2 uv){
return fract(sin(dot(uv, float2(12.9898, 78.233))) * 43758.5453);
}
//...
l += 0.1 * rand(In.v_texcoord * (1 + fract(U.time)));
//...


В примере я использую стандартный шейдерный шум от позиции точки, анимирую его по времени, но использую fract, чтобы при больших значениях рандом не стал выглядеть как полосы
1
Media is too big
VIEW IN TELEGRAM
Ореол вокруг пересвеченных участков

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

Алгоритм
Тут делается в два этапа
1. Блюрим копию кадра (например через MPS)
2. Накладываем яркости max-ом перед всеми остальными цветокоррекциями

В идеале, нужно ореол подкрашивать в цвет подложки, если мы имитируем именно эту причину, но заморачиваться не будем
👍21👀1
Media is too big
VIEW IN TELEGRAM
Пятна (химические)
вот эти вот мелькающие штуки гладкие


Принцип
Тут речь про мягкие черные или белые гладкие пятна. Есть еще от мусора и царапин - их позже на уровне камеры разберем - плюс они как правило жесткие.

Возникают эти пятна от
- повреждения эмульсии,
- пузырей в ней или на ней в ходе проявки или закрепления,
- некачественной промывки, в результате чего какие-то реагенты остаются на пленке и продолжают реакцию
- опять таки умножаем на два для переноса - то есть могут быть одновременно и белые, и черные пятны (на примере только черные)

Алгоритм
1. Генерим в точке 3Д Перлин нойз (xy + t время)
2. делаем коррекцию значения, чтобы получить нужное пятнышко, например:

float v = perlinNoise(uvt, 1, 3, 0.5, 2.0, 0);
v = v * 0.5 + 0.5;
v *= v;
v = 1.0 - smoothstep(0.01, 0.02, v);

3. После всех коррекций яркости добавляем к ней это значение

Кстати нашел у себя баг в шейдере, кто найдет по картинке - тому + в карму.
Media is too big
VIEW IN TELEGRAM
Вот как-то так должно быть: не забывайте сатурировать/клампать значения, чтобы они были в одном диапазоне.

Хотя! Некоторые коррекции этого не требуют и клампать лучше уже по завершению группы.

На этом про химию все - дальше будет про механику и камеру
🔥2
Я планирую скоро начать второй сезон статей про Метал: в этом году на тему инструментов. Вот примерный план (если что-то еще или конкретно интересует - пишите, учту)
👍10❤‍🔥1
Продолжим ломать и портить видео. Дальше на очереди - механикой камеры. По традиции начнем с ее устройства.

Я нашел такую схему работы камеры на вики. Она с зеркальным обтюратором, но нам тоже пойдет - абстрагируемся от его зеркальности.

Итак у нас есть изображение, которое приходит с объектива (1) и, отсекаясь обтюратором (2) (такой вращающийся затвор с вырезанным сектором для пропускания света), попадает на кадровое окно (9). За окном находится фильмовый (пленочный) канал (10), через который протягивается собственно пленка из одной катушки (6) на другую (14) с помощью грейфера (11) (собственно он и протаскивает пленку по кадрам).

Сейчас еще скину гифку как обтюратор с грейфером работают
2
This media is not supported in your browser
VIEW IN TELEGRAM
а это грейфер - зацените, какой красавец
2👀2
This media is not supported in your browser
VIEW IN TELEGRAM
uConsole, TIC-80, SDF+raycast, рендерю по строчке за кадр с поворотом камеры вокруг центра
6
Media is too big
VIEW IN TELEGRAM
Фреймрейт

На пленочных камерах/проекторах фреймрейт конечно может быть до 60, но чаще всего это стандартные 24, 18 (для любительской) и 16 для немого кино

Принцип
У нас есть время на экспозицию кадра пока обтюратортор крутится, картинка мутится, а грейфер тащит пленку. То есть время на один кадр достаточно велико.

Это вызвано ограничениями механики, прочности пленки ну и физикой/химией экспозиции картинки.

Алгоритм:
Два варианта:
1. Сохраняем копию кадра и отсчета и обновляем только когда время увеличилось больше чем на время кадра
2. То же самое, но кадры дополнительно накладываем друг на друга для эффекта смазанности

Если делать только 1, а видео изначально достаточно четкое, то результат будет выглядеть немного дерганно и стробоскопично. Такое тоже есть на пленочном кино и вызвано короткой выдержкой. То есть смазанность на низком фпс позволяет смазать не только картинку, но и фпс))))
2🔥1
Media is too big
VIEW IN TELEGRAM
Дрожание кадра

К счатью/сожалению мы живем не в идеальной математической абстракции, а в хаотичном физическом мире, а потому примитивная механика пленочной кинокамеры, как и сама пленка не идеальны. Это приводит к тому, что картинка может проецироваться не идеально в кадр, а с небольшими сдвигами. Причем по Y она будет дергаться сильнее, чем по X, так как движение пленки идет именно вдоль оси Y (так уж сложилось исторически).

Алгоритм
1. На CPU считаем случайный сдвиг по X и по Y от времени
2. На GPU в вертексном шейдере смещаем весь квад кадра на этот сдвиг
👍2🔥1
Прогаем с кенгурой
Фреймрейт На пленочных камерах/проекторах фреймрейт конечно может быть до 60, но чаще всего это стандартные 24, 18 (для любительской) и 16 для немого кино Принцип У нас есть время на экспозицию кадра пока обтюратортор крутится, картинка мутится, а грейфер…
⚠️ВАЖНО

После того, как вы понизили фпс, не забудьте передавать дальше новое - заторможенно - время, иначе у вас будет эффект не того, что фпс понизили в целом, а того, что показываете дерганные картинки на том же фреймрейте. Эффекты типа зерна (шума) и пятен должны быть одинаковы на одинаковом кадре.
1
Media is too big
VIEW IN TELEGRAM
Мерцание яркости

Я думаю, вы замечали, что яркость между кадрами на старых кинопленках может меняться от кадра к кадру.

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

Алгоритм
Рандомно поддергиваем вверх-вниз значение яркости.
2👀2👍1
Крышечки эвкалипта. Интересно, есть ли с другим числом секций
👍5🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Утечка света (Light Leak)

Как правило выглядит как засвет одной из половин пленки. На цветной пленке может иметь еще и цветной градиент - зависит от условий.

Принцип
Из-за щели в корпусе кассеты или камеры свет проникает внутрь и засвечивает кусок пленки.

Алгоритм
Можно делать как процедурно, так и просто наложить текстуру - зависит от задачи.
- процедурно можно менять засвет в зависимости от времени (например если пленка смоталась, то на нее уже падает меньше света, но на большую площадь и тд)
- текстурой можно сделать более дешево более сложные изображения
3
Я генерирую тут процедурно по вот этой функции https://www.desmos.com/calculator/v8m67hxwlw

float2 uv = in.uv * 2 - 1;
float2 leakSep = U.amount * U.pos * pow(3, -U.pos * (sign(U.pos) - uv)) * sin(3.14159 * uv);
src.rgb += leakSep.x + leakSep.y;
2
Media is too big
VIEW IN TELEGRAM
Тень от кадрового окна

Совсем забыл про нее - выглядит как достаточно четкая виньетка по самому краю кадра.

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

Алгоритм
В пассе про тряску (где у нас задействован только вертексный шейдер по сути) добавляем генерацию тени

float2 uv = -1. + 2. * in.uv;
float ratio = float(texture0.get_width()) / float(texture0.get_height());
uv.x *= ratio;
uv.x -= sign(uv.x) * fract(ratio);
float2 v2 = pow(abs(uv), 32 - 16 * U.vignette);
float v = U.vignette * (v2.x + v2.y);
src.rgb -= v;


Причем значение силы виньетки можно также потрясти от времени, чтобы имитировать разное прилегание пленки к окну.
2
Media is too big
VIEW IN TELEGRAM
Царапины

Вот эти вот продольные (вертикальные) белые полосы.

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

Если мы эту пленку переводим потом в позитив, то полосы будут не белые, а черные. А возможно и те, и те - смотря сколько у нас этапов поломанных - смотрите по обстоятельствам.

Алгоритм
Тут тоже можно либо процедурно, либо маской.

Процедурно я растягиваю перлина и подрезаю его:

float2 uv = in.uv;
uv.x *= 100;
uv.y *= 0.001;
float v = perlinNoise(float3(uv, U.time), 1, 8, 0.2, 200.0, 10);
float a = 1.0 - U.amount;
v = smoothstep(a-0.01, a, v);
src.rgb += v;
3
Media is too big
VIEW IN TELEGRAM
Пыль и грязь

Это вот эти черные (белые если есть перенос с негатива на позитив, или оба если все поломано) мелкие четкие пятна.

Принцип
Грязь может не только царапать, но и оставлять тень, если лежит прямо на пленке (или очень близко к ней) во время экспозиции.

Алгоритм
Тоже либо процедурно, либо маской.

Процедурно тоже перлином (или каким вам больше нравится) генерируем шум и подрезаем:

float2 uv = in.uv;
uv *= 10;
float v = perlinNoise(float3(uv, U.time), 6, 3, 0.0125, 0.0, 0);
float a = 1 - U.dust * 0.2;
v = smoothstep(a-0.1, a,v);
src.rgb -= v;
5