fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید 👈

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

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

رفتن به کانال در Telegram

Сидим с кенгурой под горой, запекаем текстуры... { программирование, процедурная генерация, графика, аудио, образование и немного про специфичные игры } https://gostrobrod.dev https://boosty.to/gostrobrod

نمایش بیشتر
236
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
+130 روز
آرشیو پست ها
Так, от краски уже болит голова, да и кончилась она, возвращаюсь к искажениям. Как я уже говорил, следующим этапом за геометр
Так, от краски уже болит голова, да и кончилась она, возвращаюсь к искажениям. Как я уже говорил, следующим этапом за геометрией идет PSF (Point Spread Function), который, хоть и отражает несколько разных искажений - дефокус, - продольная цветовая абберация, - скос линзы, - размытие к краю, - кома, - астигматизм, - жировые полосы/царапины, сводится к свертке с ядром, отражающим все перечисленные эффекты - разбить на части не получится правильным образом. Тем не менее, я буду рассказывать про каждый по отдельности, а в конце соберу в один эффект.

https://www.makingsoftware.com/chapters/color-spaces-models-and-gamuts Нашел классную статью про цвета. Ну и в принципе, судя по сайту, у автора большие планы

Записали с товарищем вчера подкаст на тему книг и программирования https://www.youtube.com/watch?v=2YRuBd02Hzg

Дальше пойдут искажения на свертках: расфокусы, повороты линз, боке, продольные абберации и прочее. И это мы еще не довели наше изображение до сенсора. Вообще, заметьте, что понимая принцип работы эффекта, нам не нужно воспроизводить физически верную симуляцию и персчитывать рейтрейсинг, а достаточно упрощенной модели, которая позволит достичь довольно близкого результата.

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

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;
}
Тут добавлены минимальное значение и усиление в параметрах, чтобы "можно было выбирать" (с).

Математика: Описывается законом cos^4 и зависит исключительно от угла между осью и лучом. Удобно считать в координатах/расстояниях, нормированных к половине меньшего размера кадра (хотя математически - без разницы - можно и в абсолютных, только не забудьте про соотношение сторон) Вот вам дезмос для наглдядности https://www.desmos.com/calculator/nlvg9l3nlx

Естественная виньетка, Принцип: При отклонении луча от оптической оси освещенность падает. Это будет даже на пинхоле, если же говорить про реальную оптику, то сюда добавятся отражения и прочие проблемы.

У чибисов птенцы вылупились

Сделал чуть интереснее. Голый лабиринт - скучно. Гештальт закрыт - завтра вернусь к искажениям.

Небольшой оффтопик (?) про Террарию: добавил в мод режим генерации мира, когда весь мир - сплошной лабиринт.

Сделал видос про Дезмос: https://youtu.be/VghUBCmaZ-I

Адаптировал вводные статьи по Металу для сайта: https://latooksoftware.com/article.html?article=metal/mtl_s01e00.md

Как видите - это немного отличается от попсовой реализации, когда просто сдвигаем каналы друг относительно друга, забивая на оптику

sticker.webp0.21 KB

Алгоритм: 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;

Принцип: По закону Снеллиуса имеем n1*sinΘ1 = n2*sinΘ2. Соль в том, что разные длины волн имеют разные показатели преломления
Принцип: По закону Снеллиуса имеем n1*sinΘ1 = n2*sinΘ2. Соль в том, что разные длины волн имеют разные показатели преломления и, как результат, - разные углы преломеления, из-за чего возникает/усиливается дисперсия по мере удаления от оптической оси (где грани линзы менее параллельны). То есть искажение будет тоже радиальное.

И последнее искажение из геометрических - поперечная цветовая абберация (продольная будет позже)

У него еще ссылка на сайт есть: https://rhythm-circle.com

Нашел интересный канал про музыку и математику https://www.youtube.com/@mathemusique

Я там некоторые посты выше обновил/подкорректировал - просмотрите на всякий случай еще раз