Прогаем с кенгурой
Kanalga Telegram’da o‘tish
Сидим с кенгурой под горой, запекаем текстуры... { программирование, процедурная генерация, графика, аудио, образование и немного про специфичные игры } https://gostrobrod.dev https://boosty.to/gostrobrod
Ko'proq ko'rsatish236
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kun
+130 kun
Postlar arxiv
Вот как-то так должно быть: не забывайте сатурировать/клампать значения, чтобы они были в одном диапазоне.
Хотя! Некоторые коррекции этого не требуют и клампать лучше уже по завершению группы.
На этом про химию все - дальше будет про механику и камеру
Пятна (химические)
вот эти вот мелькающие штуки гладкие
Принцип
Тут речь про мягкие черные или белые гладкие пятна. Есть еще от мусора и царапин - их позже на уровне камеры разберем - плюс они как правило жесткие.
Возникают эти пятна от
- повреждения эмульсии,
- пузырей в ней или на ней в ходе проявки или закрепления,
- некачественной промывки, в результате чего какие-то реагенты остаются на пленке и продолжают реакцию
- опять таки умножаем на два для переноса - то есть могут быть одновременно и белые, и черные пятны (на примере только черные)
Алгоритм
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. После всех коррекций яркости добавляем к ней это значение
Кстати нашел у себя баг в шейдере, кто найдет по картинке - тому + в карму.Ореол вокруг пересвеченных участков
Принцип
Этот эффект может возникать по нескольким причинам:
- отражение от подложки (поэтому туда суют еще противоореольный слой)
- рассеяние от кристаллов серебра (чем больше их восстановилось от засвета, тем сильнее рассеяние)
- неоднородность/повреждение эмульсии
- распространение реакции восстановления при проявке
- пропуск света зерном негатива на позитив при переносе
Алгоритм
Тут делается в два этапа
1. Блюрим копию кадра (например через MPS)
2. Накладываем яркости max-ом перед всеми остальными цветокоррекциями
В идеале, нужно ореол подкрашивать в цвет подложки, если мы имитируем именно эту причину, но заморачиваться не будем
Сразу добавлю короткий топик, касающийся непосредственно химии пленки - зерно
Принцип я думаю понятен: изображение на пленке таки дискретное и состоит из зерен - я про это рассказывал парой постов выше. Таким образом, если пленка крупнозернистая (по разным причинам) это зерно может быть заметно.
Алгоритм
Тут все еще проще: считаем шум и с коэффициентом добавляем к нашей яркости. Если шум сделать цветным, а не чисто яркостным, то результат будет выглядеть не как пленочное зерно, а как шум на цифровой матрице (но об этом в другой ветке).
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 - недо/пересвет одного из слоев (или всех)
2 - неправильный краситель/реактив, причем на любом слое и этапе (негатив/позитив)
Так как тут черт ногу сломит, что может происходить с цветом, то решается это через 3D-LUT - то есть просто таблицей; весь диапазон не надо, 64х64х64 хватает с головой
Хотя иногда можно решить и через YUV-манипуляции
Алгоритм
Тут все максимально просто:
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);
}Начнем с простого - с базовой цветокоррекции.
Принцип
Так как пленка у нас чб, то цвета может быть максимум два (ну и градиент между ними):
1 - цвет подложки - да, пленка не всегда идеально прозрачная + есть защитные слои + может выгорать это все)
2 - пигмента - если мы используем серебро, то будет черный, нарушение фиксации может давать желтоватый оттенок, а старение сребера - коричнево-зеоеноватый; кроме того пленка может быть тонирована замещением серебра на
- сульфид серебра (сепия)
- железосодержащие соли (синий/фиолетовый)
- медь/золото/селен (красный, пурпуный)
Кроме того, кадр может быть
- пере/недосвечен как в процессе съемки, так и в процессе печати (переносе с негативной на позитивную пленку).
- иметь измененный контраст и гамму в зависимости от свойств пленки и химии
Играюсь тут с байтбитом - получилась телефонная тема
https://dollchan.net/bytebeat/#4AABELEbT0Cixs7PQVANRJpqaCmoKGiU2NsaaAA
Вот некорректную работу этих бесхитростных механизмов мы и будем имитировать далее
Итак. При попадании фотонов достаточной интенсивности, они выбивают из соли электрон, который, однако, остается в кристалле и восстанавливает ион серебра до металлического - и таких несколько на кристалл.
При проявке эти атомы металлического серебра служат катализатором для восстановления всего кристалла до металлического серебра. Если же там нет металлического серебра, то он и не восстанавливается.
Далее закрепитель вымывает все невосстановившиеся соли, оставляя только зерна, ставшие серебром. Таким образом картинка на пленке на самом деле черно-белая, но за счет «дизеринга» кажется, что есть градации серого.
Но у нас получился негатив. Позитив получается путем переноса изображения на другую пленку (позитивную). Процесс повторяется, но изображение инвертируется.
Также есть обратимые пленки, которые после проявки отбеливают и засвечивают остатки соли.
С цветной пленкой чуть сложнее: во-первых у нас там как минимум 3 слоя под каждый основной цвет. Во-вторых у нас добавляется процесс с окрашиванием. При этом негативная пленка окрашивается в дополнительные цвета (красный - циан, зеленый - пурпур, синий - желтый).
Переходим к искажениям на пленке. Тут много чего есть, но все оно крутится вокруг физики (химии) экспонирования пленки, ее проявки и механики камеры.
Самое интересное тут - физика (и химия), поэтому начнем с анатомии пленки. В простейшем случае это прозрачная полимерная пленка на которую нанесена эмульсия (желатин с кристаллами соли - галогенида серебра). В сложнейшем - несколько слоев эмульсии (на цветовые каналы), цветовые фильтры и защитные слои.
С механикой камеры все просто: пленка протягивается с определенной скоростью так, чтобы на время открытия затвора картинка спроецировалась на соответствующий участок пленки.
Решил на досуге сунуться в тему реймаршинга. Жалею, что не сунулся раньше.
В принципе все так-то довольно просто и при этом весьма красиво + можно артефактов наделать странных
Внезапно обнаружил, что youtube не только субтитры сам генерит и переводит, но он еще и озвучку делает.
Вообще я в афиге конечно со своего лимона. Он цвести собрался, хотя все дерево в плодах. И дома все ими завалено.
Может кто знает, что можно делать из лимонов? Мне их девать некуда
Собрал оптические эффекты в видео (там вышло меньше, чем было тут, но фокус больше на принципы)
https://www.youtube.com/watch?v=yMekRTKFlb8
По оптике осталась еще одна виньетка, которая возникает из-за того, что оптика у нас круглая, а сенсор прямоугольный. То есть если у нас проекция оптики вписана в кадр, то появится еще одна виньетка.
Отдельно расписывать я это не буду - посмотрите предыдущую и, если надо, наложите еще раз.
На этом часть про оптику объявляю закрытой. Дальше будем смотреть на пленку (она выиграла в опросе)
