[bug] Native TAA: история и перепроекция используют разные системы координат джиттера #38

Closed
opened 2026-10-29 16:21:59 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Проверено на f443f0a. Источник: патч 16, последующее состояние gfx.rs и gfx/hd.rs на f443f0a. Это относится к обычному fs_taa при масштабе 1, а не автоматически к fs_taau.

В gfx.rs текущая геометрия рисуется с view_proj = jitter_translation * unjittered, но в taa_prev сохраняется unjittered матрица предыдущего кадра.

В обычном fs_taa:

  • текущая позиция восстанавливается из in.uv через обратную jittered матрицу;
  • текущий цвет — centre из текущего jittered пикселя; компенсации/восстановления в сетку без джиттера здесь нет;
  • в историю пишется этот результат в том же пикселе;
  • история читается по prev_view_proj, которая unjittered.

На первом кадре, в который записана история, frame.taa.w=0, поэтому история точно равна текущему jittered изображению. Уже следующий кадр ищет ту же точку по матрице без прошлого джиттера — попадает в другое место.

Проверка матриц на CPU

Неподвижная камера, 1920×1080, та же RH reversed-Z перспектива, точка (0,0,-20). Позиции Halton взяты из функции jitter:

первый записанный кадр: jitter_px = (-0.25, -0.1666667)
следующий кадр:         jitter_px = ( 0.25,  0.3888889)
lookup истории по коду:       uv = (0.5, 0.5)
та же точка в прошлой истории: uv = (0.4998697917, 0.4998456790)
ошибка: (0.25, 0.1666667) пикселя

Это проверка координат матрицами, без запуска GPU. На гранях/тонких текстурах ожидается лишнее смягчение, дрожание или шлейф от накопления несовмещённых выборок. Конкретную выраженность нужно проверить в игре.

Исправление

Выбрать единую систему координат истории: либо история в сетке без джиттера с соответствующим восстановлением текущего цвета/позиции, либо история в jittered-сетке с использованием предыдущей jittered матрицы/смещения при перепроекции.

Не менять prev_view_proj вслепую для обоих путей: fs_taau уже отдельно учитывает текущий jitter и восстанавливает цвет в выходную сетку.

Приёмка

Добавить тест двух кадров статичной плоскости с известным цветовым градиентом: одна мировая точка должна попадать в ту же мировую точку истории при изменении Halton. Отдельно проверить scale=1 и 0.67, неподвижные тонкие линии и медленное вращение камеры; сравнить с TAA=0.

🤖 Filed by Codex, AI-агент Владимира (chexit). Проверено на `f443f0a`. Источник: [патч 16](https://gitea.maoniao.team/chexit/airdef/src/commit/f443f0a94a71eb2d446792f1829146f9563aaf5d/horizon-patches/0016-HD-shadows-draw-only-sun-facing-quads-and-skip-burie.patch), последующее состояние `gfx.rs` и `gfx/hd.rs` на `f443f0a`. Это относится к обычному `fs_taa` при масштабе 1, а не автоматически к `fs_taau`. В `gfx.rs` текущая геометрия рисуется с `view_proj = jitter_translation * unjittered`, но в `taa_prev` сохраняется **unjittered** матрица предыдущего кадра. В обычном `fs_taa`: - текущая позиция восстанавливается из `in.uv` через обратную **jittered** матрицу; - текущий цвет — `centre` из текущего jittered пикселя; компенсации/восстановления в сетку без джиттера здесь нет; - в историю пишется этот результат в том же пикселе; - история читается по `prev_view_proj`, которая **unjittered**. На первом кадре, в который записана история, `frame.taa.w=0`, поэтому история точно равна текущему jittered изображению. Уже следующий кадр ищет ту же точку по матрице без прошлого джиттера — попадает в другое место. ### Проверка матриц на CPU Неподвижная камера, 1920×1080, та же RH reversed-Z перспектива, точка `(0,0,-20)`. Позиции Halton взяты из функции `jitter`: ```text первый записанный кадр: jitter_px = (-0.25, -0.1666667) следующий кадр: jitter_px = ( 0.25, 0.3888889) lookup истории по коду: uv = (0.5, 0.5) та же точка в прошлой истории: uv = (0.4998697917, 0.4998456790) ошибка: (0.25, 0.1666667) пикселя ``` Это проверка координат матрицами, без запуска GPU. На гранях/тонких текстурах ожидается лишнее смягчение, дрожание или шлейф от накопления несовмещённых выборок. Конкретную выраженность нужно проверить в игре. ### Исправление Выбрать единую систему координат истории: либо история в сетке без джиттера с соответствующим восстановлением **текущего** цвета/позиции, либо история в jittered-сетке с использованием предыдущей jittered матрицы/смещения при перепроекции. Не менять `prev_view_proj` вслепую для обоих путей: `fs_taau` уже отдельно учитывает текущий jitter и восстанавливает цвет в выходную сетку. ### Приёмка Добавить тест двух кадров статичной плоскости с известным цветовым градиентом: одна мировая точка должна попадать в ту же мировую точку истории при изменении Halton. Отдельно проверить scale=1 и 0.67, неподвижные тонкие линии и медленное вращение камеры; сравнить с TAA=0.
chexit added the type:bugpriority:P2area:rendering labels 2026-10-29 16:21:59 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/e3148bf (запушено в main).

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/e3148bf (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#38