Принцип:
Из-за смещениялинзы относительно оптической оси системы нарушается радиальная симметрия, и картинка как бы съезжает, а так как мы работаем с оптикой и преломлением хода лучей, то еще и искривляется
Алгоритм:
То же, что и в прошлый раз, но в (2) мы не умножаем на коэффициент, а добавляем вектор, который считаем из текущих координат, расстояния до центра и коэффициентов.
Для тангенциальной:
https://www.desmos.com/3d/urwkdxvkoi
Из-за смещениялинзы относительно оптической оси системы нарушается радиальная симметрия, и картинка как бы съезжает, а так как мы работаем с оптикой и преломлением хода лучей, то еще и искривляется
Алгоритм:
То же, что и в прошлый раз, но в (2) мы не умножаем на коэффициент, а добавляем вектор, который считаем из текущих координат, расстояния до центра и коэффициентов.
Для тангенциальной:
static inline float2 tangential_distort(float2 uv, constant Parameters& params) {
// Fixed-point: xu_{n+1} = xu_n + (xd - distort_forward(xu_n))
float2 d = uv - params.center;
float2 scale = float2(params.aspect.x, params.aspect.y);
float2 xd = d * scale;
float x = xd.x, y = xd.y;
float r2 = dot(xd, xd);
float x2 = x*x, y2 = y*y, xy = x*y;
float2 tang = float2(2.0 * params.p1 * xy + params.p2 * (r2 + 2.0 * x2),
params.p1 * (r2 + 2.0 * y2) + 2.0*params.p2 * xy);
float2 xu = xd - tang;
return params.center + xu / scale;
}
https://www.desmos.com/3d/urwkdxvkoi
Desmos
Brown-Conrady (tangential)
Explore math with our beautiful, free online graphing calculator. Graph functions, plot points, visualize algebraic equations, add sliders, animate graphs, and more.
✍4
Это упрощенный подход. Если хотите точности, плавности на всех занчениях и прочего - нужно реализовывать модель Брауна-Конрада итеративно проходов в 4-5, высчитывая куда прилетит луч, и после - откуда. Формулы будут +/- те же за исключением того, что нужно будет считать промежуточный вектор умножая на коэффициент (или прибавляя тангенциальное смещение), а потом приращивать результат. То есть что-то вроде такого:
static inline float2 distort(float2 uv, constant DecenteringUniforms& params) {
// Fixed-point: xu_{n+1} = xu_n + (xd - distort_forward(xu_n))
float2 d = uv - params.center;
float2 scale = float2(params.aspect.x, params.aspect.y);
float2 xd = d * scale;
float2 xu = xd;
for (int i=0; i<5; ++i) {
float2 xh = forward(xu, params);
xu += (xd - xh);
}
return params.center + xu / scale;
}
Я там некоторые посты выше обновил/подкорректировал - просмотрите на всякий случай еще раз
👍2👀2
Нашел интересный канал про музыку и математику
https://www.youtube.com/@mathemusique
https://www.youtube.com/@mathemusique
✍1
Прогаем с кенгурой
Нашел интересный канал про музыку и математику https://www.youtube.com/@mathemusique
У него еще ссылка на сайт есть:
https://rhythm-circle.com
https://rhythm-circle.com
🔥4
Media is too big
VIEW IN TELEGRAM
И последнее искажение из геометрических - поперечная цветовая абберация (продольная будет позже)
🔥2❤1👍1
Принцип:
По закону Снеллиуса имеем
По закону Снеллиуса имеем
n1*sinΘ1 = n2*sinΘ2. Соль в том, что разные длины волн имеют разные показатели преломления и, как результат, - разные углы преломеления, из-за чего возникает/усиливается дисперсия по мере удаления от оптической оси (где грани линзы менее параллельны). То есть искажение будет тоже радиальное.👀1
Алгоритм:
1. Переходим в осесимметричное пространство,
2. Считаем сдвиг для каждого канала отдельно
3. Переходим обратно
4. Сэмплим каждый канал отдельно
потом
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;
Как видите - это немного отличается от попсовой реализации, когда просто сдвигаем каналы друг относительно друга, забивая на оптику
👏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