ПрограммированиеФорумГрафика

SSR темпоральный денойзинг

#0
(Правка: 23:17) 22:31, 13 сен 2026

Привет.

Как известно фильтр миксует уже накопленную картинку
с текущей усредненной по 3*3 сетке

Пытаюсь отладить правильность в полном покое.

Я пока жестко блендфактор передаю с клавы.
Накоплю что-то на 0.95 и потом выставляю его на 0.99/1 - типа показывается только история.

Так вот - даже при 1 у меня шум, но несильный.
Непонятно что за косяк.

Я там в шадере все поотрубал. Картинка статичная. Скорости все нулевые
==========================


vec4 clip_aabb(vec3 aabb_min, vec3 aabb_max, vec4 p, vec4 q)
{
  const float FLT_EPS = 0.00000001f;
 
    vec3 p_clip = 0.5 * (aabb_max + aabb_min);
    vec3 e_clip = 0.5 * (aabb_max - aabb_min) + FLT_EPS;

    vec4 v_clip = q - vec4(p_clip, p.w);
    vec3 v_unit = v_clip.xyz / e_clip;
    vec3 a_unit = abs(v_unit);
    float ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z));

    if (ma_unit > 1.0)
        return vec4(p_clip, p.w) + v_clip / ma_unit;
    else
        return q; // point inside aabb
}

=====================================

current = textureLod(ScreenInput, uv, 0.0);  /// noisy  current ssr

vec2 prevUV = uv ;

vec4 previous = GetPrevT(prevUV); // sample from history

// calc box
vec4 m1 = vec4(0.0);
    vec4 m2 = vec4(0.0);
 
    for (int i = 0; i < 9; i++)
    {
        ivec2 iuv = ivec2(gl_LocalInvocationID.xy) + offset;
   
        vec4 val;
        Load1TPixel(uint(iuv.y * (KERNEL_SIZE + 2) + iuv.x), val);
   
        m1 += val;
        m2 += val * val;
    } 
 
    vec4 currentAverage = m1 / 9.0; 

    // noise power at this point
    vec4 stddev = sqrt(max(vec4(0.0), (m2 / 9.0) - (currentAverage * currentAverage)));

    float gamma = 2.0;
    vec4 currentMin = currentAverage - stddev * gamma;
    vec4 currentMax = currentAverage + stddev * gamma;
 
  previous = clip_aabb(currentMin.xyz, currentMax.xyz, clamp(currentAverage, currentMin, currentMax), previous);

float k_feedback = TResponseMax;

vec4 pout = mix(current, previous, k_feedback);
  imageStore(TemporalResult, uvInt, pout); 

==================

Кто что только не советует. И вместо среднего считать по гауссу с весами, и цветовое пространство
другое советуют. Запутался уже сам....

Если коментарю функцию с клипААББ то тогда не шумит даже на 0.99

Если ставлю гамму 5, то не шумит, но и при этом каша/гостинг при движении камеры (скорость по камере я добавляю, чтобы отражения соотвтетссовали действительности)

Если гамма большая, то в движении за объектами и отражениями тянутся жирные шлейфы (гостинг).
Если гамма маленькая, то в покое картинка и SSR начинают дико мерцать и «кипеть».

Неужели эту гамму надо подбирать динамически - для покоя и движений?

#1
10:45, 8 окт 2026

Не понял , а гамма тут как изначально ?

#2
15:10, 13 окт 2026

Можешь чекнуть здесь
https://github.com/DiligentGraphics/DiligentFX/blob/master/Shader… cumulation.fx
Здесь дополнение по тому как накпливаем сэмплы
https://github.com/DiligentGraphics/DiligentFX/tree/master/PostPr… -accumulation

ПрограммированиеФорумГрафика