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

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

https://gostrobrod.dev
Download Telegram
Наткнулся на канал про музыку с шикарно оригинальной подачей материала
https://www.youtube.com/@synthet7
2
Джордан Мекнер (автор старого Принца Персии) написал статью, как портироровал игру между платформами 35 лет назад
https://www.jordanmechner.com/en/latest-news/#a-platform-jumping-prince
👍3
Media is too big
VIEW IN TELEGRAM
Итак. Предпоследний заметный эффект на линзах - Flare

Это вот эти вот повторяющиеся пятна-блики от интенсивных источников света.

На примере оно не очень попадает в фонари, потому как пример был собран на коленке
2
Принцип

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

Чтобы такого избежать, на линзы наносят просветляющее покрытие. Но чем дешевле оптика, тем больше эффектов мы насобираем.
👍3
Алгоритм

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

if let color0 = desc.colorAttachments[0] {
color0.isBlendingEnabled = true
color0.rgbBlendOperation = .add
color0.alphaBlendOperation = .add
color0.sourceRGBBlendFactor = .one
color0.destinationRGBBlendFactor = .one
color0.sourceAlphaBlendFactor = .one
color0.destinationAlphaBlendFactor = .oneMinusSourceAlpha
}


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

Отдельно расписывать я это не буду - посмотрите предыдущую и, если надо, наложите еще раз.

На этом часть про оптику объявляю закрытой. Дальше будем смотреть на пленку (она выиграла в опросе)
2
Лимон-мутант
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