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

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

https://gostrobrod.dev
Download Telegram
Лимон-мутант
5👻1
Вообще я в афиге конечно со своего лимона. Он цвести собрался, хотя все дерево в плодах. И дома все ими завалено.

Может кто знает, что можно делать из лимонов? Мне их девать некуда
4
Внезапно обнаружил, что youtube не только субтитры сам генерит и переводит, но он еще и озвучку делает.
Решил на досуге сунуться в тему реймаршинга. Жалею, что не сунулся раньше.

В принципе все так-то довольно просто и при этом весьма красиво + можно артефактов наделать странных
10🔥1
Media is too big
VIEW IN TELEGRAM
пожалуй, хватит на сегодня
7😍1
Переходим к искажениям на пленке. Тут много чего есть, но все оно крутится вокруг физики (химии) экспонирования пленки, ее проявки и механики камеры.

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

С механикой камеры все просто: пленка протягивается с определенной скоростью так, чтобы на время открытия затвора картинка спроецировалась на соответствующий участок пленки.
4
Итак. При попадании фотонов достаточной интенсивности, они выбивают из соли электрон, который, однако, остается в кристалле и восстанавливает ион серебра до металлического - и таких несколько на кристалл.

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

Далее закрепитель вымывает все невосстановившиеся соли, оставляя только зерна, ставшие серебром. Таким образом картинка на пленке на самом деле черно-белая, но за счет «дизеринга» кажется, что есть градации серого.

Но у нас получился негатив. Позитив получается путем переноса изображения на другую пленку (позитивную). Процесс повторяется, но изображение инвертируется.

Также есть обратимые пленки, которые после проявки отбеливают и засвечивают остатки соли.

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

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

Кроме того, кадр может быть
- пере/недосвечен как в процессе съемки, так и в процессе печати (переносе с негативной на позитивную пленку).
- иметь измененный контраст и гамму в зависимости от свойств пленки и химии
2
Алгоритм

Тут все максимально просто:
1. Переводим RGB -> YUV (используем только Y - яркость)
2. Применяем яркость, контраст, потом гамму - сначала линейные, потом нелинейные, чтобы первые не ломались
3. Используем яркость как коэффициент для градиента между цветами пигмента и подложки

Не забываем, что все операции с цветами должны проходить в линейном RGB, иначе будет некорректно


float brightness(float x, float v) {
return saturate(x + v);
}


float contrast(float x, float v) {
return exp(v) * (x - 0.5) + 0.5;
}


float gamma(float x, float v) {
return pow(x, exp(-v));
}


float3 tint(float x, float3 from, float3 to) {
return mix(from, to, x);
}
👍2
Примечание про цветные пленки:

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

Так как тут черт ногу сломит, что может происходить с цветом, то решается это через 3D-LUT - то есть просто таблицей; весь диапазон не надо, 64х64х64 хватает с головой

Хотя иногда можно решить и через YUV-манипуляции
👍2
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