Как видите - это немного отличается от попсовой реализации, когда просто сдвигаем каналы друг относительно друга, забивая на оптику
👏3
Адаптировал вводные статьи по Металу для сайта: https://latooksoftware.com/article.html?article=metal/mtl_s01e00.md
🔥8
Media is too big
VIEW IN TELEGRAM
Небольшой оффтопик (?) про Террарию: добавил в мод режим генерации мира, когда весь мир - сплошной лабиринт.
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Сделал чуть интереснее. Голый лабиринт - скучно.
Гештальт закрыт - завтра вернусь к искажениям.
Гештальт закрыт - завтра вернусь к искажениям.
❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Естественная виньетка,
Принцип:
При отклонении луча от оптической оси освещенность падает. Это будет даже на пинхоле, если же говорить про реальную оптику, то сюда добавятся отражения и прочие проблемы.
Принцип:
При отклонении луча от оптической оси освещенность падает. Это будет даже на пинхоле, если же говорить про реальную оптику, то сюда добавятся отражения и прочие проблемы.
❤5
Математика:
Описывается законом cos^4 и зависит исключительно от угла между осью и лучом. Удобно считать в координатах/расстояниях, нормированных к половине меньшего размера кадра (хотя математически - без разницы - можно и в абсолютных, только не забудьте про соотношение сторон)
Вот вам дезмос для наглдядности
https://www.desmos.com/calculator/nlvg9l3nlx
Описывается законом 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.
Алгоритм:
Тут особо нечего сказать, потому вот функция, которая возвращает интенсивность
Тут добавлены минимальное значение и усиление в параметрах, чтобы "можно было выбирать" (с).
Тут особо нечего сказать, потому вот функция, которая возвращает интенсивность
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;
}
Тут добавлены минимальное значение и усиление в параметрах, чтобы "можно было выбирать" (с).
Дальше пойдут искажения на свертках: расфокусы, повороты линз, боке, продольные абберации и прочее. И это мы еще не довели наше изображение до сенсора.
Вообще, заметьте, что понимая принцип работы эффекта, нам не нужно воспроизводить физически верную симуляцию и персчитывать рейтрейсинг, а достаточно упрощенной модели, которая позволит достичь довольно близкого результата.
Вообще, заметьте, что понимая принцип работы эффекта, нам не нужно воспроизводить физически верную симуляцию и персчитывать рейтрейсинг, а достаточно упрощенной модели, которая позволит достичь довольно близкого результата.
❤5
Записали с товарищем вчера подкаст на тему книг и программирования
https://www.youtube.com/watch?v=2YRuBd02Hzg
https://www.youtube.com/watch?v=2YRuBd02Hzg
YouTube
Стоит ли читать книги программисту? Говорим о литературе, развитии, коде и опыте
В этом выпуске мы с Данилом обсуждаем книги для программистов: с чего начинать, какие стоит читать, а какие могут только запутать. Говорим о первых шагах с ZX Spectrum и «C++ для чайников», делимся опытом чтения Таненбаума, SICP, Мартина, Фаулера и др.
Затрагиваем…
Затрагиваем…
👍1
https://www.makingsoftware.com/chapters/color-spaces-models-and-gamuts
Нашел классную статью про цвета. Ну и в принципе, судя по сайту, у автора большие планы
Нашел классную статью про цвета. Ну и в принципе, судя по сайту, у автора большие планы
🔥4❤3
Так, от краски уже болит голова, да и кончилась она, возвращаюсь к искажениям.
Как я уже говорил, следующим этапом за геометрией идет PSF (Point Spread Function), который, хоть и отражает несколько разных искажений
- дефокус,
- продольная цветовая абберация,
- скос линзы,
- размытие к краю,
- кома,
- астигматизм,
- жировые полосы/царапины,
сводится к свертке с ядром, отражающим все перечисленные эффекты - разбить на части не получится правильным образом.
Тем не менее, я буду рассказывать про каждый по отдельности, а в конце соберу в один эффект.
Как я уже говорил, следующим этапом за геометрией идет PSF (Point Spread Function), который, хоть и отражает несколько разных искажений
- дефокус,
- продольная цветовая абберация,
- скос линзы,
- размытие к краю,
- кома,
- астигматизм,
- жировые полосы/царапины,
сводится к свертке с ядром, отражающим все перечисленные эффекты - разбить на части не получится правильным образом.
Тем не менее, я буду рассказывать про каждый по отдельности, а в конце соберу в один эффект.
❤4
Небольшое отступление:
Есть два эффекта, которые применить к обычному видео проблематично (возможно, нейронка поможет):
1 - Глубина резкости (если есть карта глубин для каждого кадра, то, в принципе, возможно)
2 - Искажения проекции на разных фокусных расстояния
Так как их нормальным путем реализовать не получится, то и рассказывать я о них не буду, но если интересна физика/геометрия процесса - напишите - распишу на пальцах
Есть два эффекта, которые применить к обычному видео проблематично (возможно, нейронка поможет):
1 - Глубина резкости (если есть карта глубин для каждого кадра, то, в принципе, возможно)
2 - Искажения проекции на разных фокусных расстояния
Так как их нормальным путем реализовать не получится, то и рассказывать я о них не буду, но если интересна физика/геометрия процесса - напишите - распишу на пальцах
❤5
Media is too big
VIEW IN TELEGRAM
Дефокус
Размытие объекта на картинке из-за непопадания его проекции в фокус.
В идеале - именно объекта, а не всей картинке - так будет физически вернее. Но для этого нам нужна карта глубин, коей как правило, нет, поэтому будем делать просто размытие всей картинки.
Размытие объекта на картинке из-за непопадания его проекции в фокус.
В идеале - именно объекта, а не всей картинке - так будет физически вернее. Но для этого нам нужна карта глубин, коей как правило, нет, поэтому будем делать просто размытие всей картинки.
❤3🔥1
Media is too big
VIEW IN TELEGRAM
Принцип:
Когда объект уходит из фокуса, то лучи от него не сходятся в точку на плоскости сенсора, где они должны быть, а в круг, что приводит к размытию картинки.
Причем в зависимости от расстояния до плоскости резкости размытие должно быть больше (но мы упростим и будем делать везде одинаковое).
То есть радиус диска ядра свертки зависит от диафрагмы, расстояния до плоскости резкости и от шага пикселя/зерна на сенсоре
Когда объект уходит из фокуса, то лучи от него не сходятся в точку на плоскости сенсора, где они должны быть, а в круг, что приводит к размытию картинки.
Причем в зависимости от расстояния до плоскости резкости размытие должно быть больше (но мы упростим и будем делать везде одинаковое).
То есть радиус диска ядра свертки зависит от диафрагмы, расстояния до плоскости резкости и от шага пикселя/зерна на сенсоре
❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Алгоритм:
1. Можно пойти простым путем и взять MPSImageGaussianBlur - это даже будет выглядеть правдоподобно на малых значениях размытия, но неестественно на больших. Зато будет очень быстро
2. Можно пойти сложным путем и гонять свертку диском. Честно это делать супер дорого, поэтому вместо этого ограничиваются псевдослучайными равномерными сэмплами по нему (иначе вам придется гонять террабайты в секунду - видюха будет не рада такому). Зато у вас будет +/- красивое боке, кастомные формы диафрагмы. Ну и остальные эффекты требуют кастомной свертки
На видео сравнение, как выглядит гаусс и диск (разница, думаю, очевидна)
1. Можно пойти простым путем и взять MPSImageGaussianBlur - это даже будет выглядеть правдоподобно на малых значениях размытия, но неестественно на больших. Зато будет очень быстро
2. Можно пойти сложным путем и гонять свертку диском. Честно это делать супер дорого, поэтому вместо этого ограничиваются псевдослучайными равномерными сэмплами по нему (иначе вам придется гонять террабайты в секунду - видюха будет не рада такому). Зато у вас будет +/- красивое боке, кастомные формы диафрагмы. Ну и остальные эффекты требуют кастомной свертки
На видео сравнение, как выглядит гаусс и диск (разница, думаю, очевидна)
🔥4❤1
Media is too big
VIEW IN TELEGRAM
Сечение пучка - боке принимает форму диафргамы.
Принцип
По сути ядро свертки - это проекция формы диафрагмы, соответственно, в зависимотсти от числа и формы лепестков вы будете получать разные фигуры на боке. Плюс чем сильнее закрыта диафргма, тем четче эта форма будет. Правда при этом у вас вырастет глубина резкости, но мы ее не имитируем.
Принцип
По сути ядро свертки - это проекция формы диафрагмы, соответственно, в зависимотсти от числа и формы лепестков вы будете получать разные фигуры на боке. Плюс чем сильнее закрыта диафргма, тем четче эта форма будет. Правда при этом у вас вырастет глубина резкости, но мы ее не имитируем.
❤3
Алгоритм
Тут по сути мы модифицируем форму ядра свретки, отбрасывая точки за пределами формы чем-нибудь типа
Что можно еще "поломать":
- сделать скругление маски через SDF например
- сделать искажение формы, например неоднородным масштабом и поворотом
- исказить один из секторов лепестков
- сделать любую форму в принципе
Тут по сути мы модифицируем форму ядра свретки, отбрасывая точки за пределами формы чем-нибудь типа
// Regular n-gon aperture test (inscribed in unit circle). blades<3 → circle (always inside).
inline bool insideAperture(float2 d, int blades) {
if (blades < 3) return true; // circle
float N = float(blades);
// polar angle
float a = atan2(d.y, d.x);
// sector size and half-sector
float sector = 2.0f * M_PI_F / N;
float halfSec = 0.5f * sector;
// wrap angle to [0, sector)
float m = fmod(a + M_PI_F, sector);
if (m < 0.0f) m += sector;
// offset to nearest edge normal (in [-half, half])
float delta = m - halfSec;
// allowed radius along this direction for polygon with circumradius=1
float rAllowed = cos(M_PI_F / N) / max(cos(delta), 1e-4f);
float r = length(d);
return r <= rAllowed;
}
Что можно еще "поломать":
- сделать скругление маски через SDF например
- сделать искажение формы, например неоднородным масштабом и поворотом
- исказить один из секторов лепестков
- сделать любую форму в принципе
🔥3
Media is too big
VIEW IN TELEGRAM
Вот эти вот звездочки - это дифракция
Принцип:
Возникает она тем сильнее, чем сильнее у нас закрыта диафрагма. Число лучей зависит от числа лепестков, а вид - от их формы.
Как видно из названия, основано искажение на дифракции: в нашем случае - огибании грани лепестка, что даёт вдоль её нормали усиления, формируя направленные лучи.
Для круга симметрия полная - направленных пиков нет, только свечение или кольца (их в примере нет, но, думаю, вы их видели на фото и глазами: когда на фонари таращились).
Принцип:
Возникает она тем сильнее, чем сильнее у нас закрыта диафрагма. Число лучей зависит от числа лепестков, а вид - от их формы.
Как видно из названия, основано искажение на дифракции: в нашем случае - огибании грани лепестка, что даёт вдоль её нормали усиления, формируя направленные лучи.
Для круга симметрия полная - направленных пиков нет, только свечение или кольца (их в примере нет, но, думаю, вы их видели на фото и глазами: когда на фонари таращились).
❤5