TGViewer
Channel Public Channel
Прогаем с кенгурой

Прогаем с кенгурой

@coding_with_kangaroo

Сидим с кенгурой под горой, запекаем текстуры...

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

https://gostrobrod.dev

https://boosty.to/gostrobrod
Subscribers
236
Photos
225
Videos
203
Links
184

Showing posts older than #233 · Back to latest

Older Posts 19 shown
Post #231 121
Небольшое отступление:

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

Так как их нормальным путем реализовать не получится, то и рассказывать я о них не буду, но если интересна физика/геометрия процесса - напишите - распишу на пальцах
  • ❤ 5
Post #230 131
Так, от краски уже болит голова, да и кончилась она, возвращаюсь к искажениям.

Как я уже говорил, следующим этапом за геометрией идет PSF (Point Spread Function), который, хоть и отражает несколько разных искажений

- дефокус,
- продольная цветовая абберация,
- скос линзы,
- размытие к краю,
- кома,
- астигматизм,
- жировые полосы/царапины,

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

Тем не менее, я буду рассказывать про каждый по отдельности, а в конце соберу в один эффект.
  • ❤ 4
Post #228 149
Post #227 137
Дальше пойдут искажения на свертках: расфокусы, повороты линз, боке, продольные абберации и прочее. И это мы еще не довели наше изображение до сенсора.

Вообще, заметьте, что понимая принцип работы эффекта, нам не нужно воспроизводить физически верную симуляцию и персчитывать рейтрейсинг, а достаточно упрощенной модели, которая позволит достичь довольно близкого результата.
  • ❤ 5
Post #225 138
Алгоритм:

Тут особо нечего сказать, потому вот функция, которая возвращает интенсивность

static inline float vignette_cos4(float2 uv, constant Parameters& params) {
float2 d = uv - params.center;
float2 xy = float2(d.x * params.aspect.x, d.y) * 2.0;
float f2 = params.fRel * params.fRel;
float r2 = dot(xy, xy);
float cos2 = f2 / (f2 + r2);
float V = cos2 * cos2;
return mix(params.minV, 1.0, V) * params.gain;
}


Тут добавлены минимальное значение и усиление в параметрах, чтобы "можно было выбирать" (с).
Post #224 143
Математика:
Описывается законом cos^4 и зависит исключительно от угла между осью и лучом. Удобно считать в координатах/расстояниях, нормированных к половине меньшего размера кадра (хотя математически - без разницы - можно и в абсолютных, только не забудьте про соотношение сторон)

Вот вам дезмос для наглдядности
https://www.desmos.com/calculator/nlvg9l3nlx
Desmos cos4 vignette Explore math with our beautiful, free online graphing calculator. Graph functions, plot points, visualize algebraic equations, add sliders, animate graphs, and more.
Post #223 139
Естественная виньетка,

Принцип:
При отклонении луча от оптической оси освещенность падает. Это будет даже на пинхоле, если же говорить про реальную оптику, то сюда добавятся отражения и прочие проблемы.
  • ❤ 5
Post #222 142
У чибисов птенцы вылупились
  • ❤ 2
  • ⚡ 2
Post #221 144
Сделал чуть интереснее. Голый лабиринт - скучно.

Гештальт закрыт - завтра вернусь к искажениям.
  • ❤ 5
Post #220 132
Небольшой оффтопик (?) про Террарию: добавил в мод режим генерации мира, когда весь мир - сплошной лабиринт.
  • 👍 4
Post #219 141
Post #217 140
Как видите - это немного отличается от попсовой реализации, когда просто сдвигаем каналы друг относительно друга, забивая на оптику
  • 👏 3
Post #215 142
Алгоритм:
1. Переходим в осесимметричное пространство,
2. Считаем сдвиг для каждого канала отдельно
3. Переходим обратно
4. Сэмплим каждый канал отдельно

Чтобы было физично, у красного k1 должен быть положительный, у синего - отрцательный, у зеленого - ноль



static inline float2 distortion(float2 uv, float2 C, float2 aspect, float2 k) {
float2 d = uv - C;
float2 diso = d * aspect;
float r2 = dot(diso, diso);
float r4 = r2 * r2;
float s = 1.0 + k.x * r2 + k.y * r4; // 1 + k1 r^2 + k2 r^4
float2 xu_iso = diso / max(s, 1e-6);
return C + xu_iso / aspect;
}

потом

//...
float2 uvR = distortion(in.uv, U.center, U.aspect, U.kR);
float2 uvG = distortion(in.uv, U.center, U.aspect, U.kG);
float2 uvB = distortion(in.uv, U.center, U.aspect, U.kB);

float r = src.sample(S, uvR).r;
float g = src.sample(S, uvG).g;
float b = src.sample(S, uvB).b;
Post #214 124
Принцип:
По закону Снеллиуса имеем n1*sinΘ1 = n2*sinΘ2. Соль в том, что разные длины волн имеют разные показатели преломления и, как результат, - разные углы преломеления, из-за чего возникает/усиливается дисперсия по мере удаления от оптической оси (где грани линзы менее параллельны). То есть искажение будет тоже радиальное.
  • 👀 1
Post #213 128
И последнее искажение из геометрических - поперечная цветовая абберация (продольная будет позже)
  • 🔥 2
  • ❤ 1
  • 👍 1
Post #212 148
Прогаем с кенгурой Нашел интересный канал про музыку и математику https://www.youtube.com/@mathemusique
У него еще ссылка на сайт есть:
https://rhythm-circle.com
  • 🔥 4
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →