[bug] Плотность облаков зависит от высоты камеры, а туман скачет при пересечении x/z=0 #68

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

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

Ревью 6f3fc644bc5194311a86baba722bc340215306b7. Продолжение world-space контрактов #45 и патча 27. Два оставшихся нарушения привязки объёма к миру подтверждаются выражениями адресации noise.

1. Вертикальная детализация облаков привязана к камере

gfx/hd/cloud_common.wgsl::cloud_density: горизонтальный w=cloud_xz(pos) восстановлен в мире, но p3=vec3(w.x, pos.y, w.y) использует camera-relative Y. Из p3 читаются warp и Worley detail на масштабах 1024/512/64. При подъёме камеры на 16 блоков одна и та же точка мира берёт другой noise-срез: fine-noise Y сдвигается на 16/64=0.25. Высотный профиль h=(pos.y-frame.clouds.x)/thickness при этом остаётся тем же. Облако меняет внутреннюю форму от перемещения наблюдателя.

Исправить Y noise на абсолютную/корректно периодически обёрнутую мировую высоту; cloud-relative постоянная система также допустима, если база слоя привязана к миру. Не использовать текущую высоту камеры как начало координат плотности.

2. Туман сохранил непериодическую шкалу после фикса облаков

gfx/hd/fog.wgsl::fog_sigma восстанавливает XZ через frame.cloud_cam (camera modulo 65536), затем читает repeating noise по w / 170.0. 170 не делит 65536: скачок координаты равен 385.505882 периодам текстуры. При переходе камеры с -ε на +ε по X/Z остаток меняется примерно на половину texture period, вместо непрерывного мира. Патч 27 исправил scales облаков, но fog по-прежнему использует 170.

Проверка и приёмка

Зафиксировать время/ветер и мировую точку: при смене высоты камеры sampler coordinates облачной плотности должны совпадать modulo периода; при пересечении x=0/z=0 fog noise должен меняться непрерывно. Добавить CPU math tests на эти инварианты, затем снимки вертикального движения и перехода через оси. Это подтверждение математики координат, без заявления об измеренном FPS или снятом визуальном артефакте.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `6f3fc644bc5194311a86baba722bc340215306b7`. Продолжение world-space контрактов #45 и патча 27. Два оставшихся нарушения привязки объёма к миру подтверждаются выражениями адресации noise. ### 1. Вертикальная детализация облаков привязана к камере `gfx/hd/cloud_common.wgsl::cloud_density`: горизонтальный `w=cloud_xz(pos)` восстановлен в мире, но `p3=vec3(w.x, pos.y, w.y)` использует **camera-relative Y**. Из `p3` читаются warp и Worley detail на масштабах 1024/512/64. При подъёме камеры на 16 блоков одна и та же точка мира берёт другой noise-срез: fine-noise Y сдвигается на 16/64=0.25. Высотный профиль `h=(pos.y-frame.clouds.x)/thickness` при этом остаётся тем же. Облако меняет внутреннюю форму от перемещения наблюдателя. Исправить Y noise на абсолютную/корректно периодически обёрнутую мировую высоту; cloud-relative постоянная система также допустима, если база слоя привязана к миру. Не использовать текущую высоту камеры как начало координат плотности. ### 2. Туман сохранил непериодическую шкалу после фикса облаков `gfx/hd/fog.wgsl::fog_sigma` восстанавливает XZ через `frame.cloud_cam` (camera modulo 65536), затем читает repeating noise по `w / 170.0`. 170 **не делит** 65536: скачок координаты равен 385.505882 периодам текстуры. При переходе камеры с -ε на +ε по X/Z остаток меняется примерно на половину texture period, вместо непрерывного мира. Патч 27 исправил scales облаков, но fog по-прежнему использует 170. ### Проверка и приёмка Зафиксировать время/ветер и мировую точку: при смене высоты камеры sampler coordinates облачной плотности должны совпадать modulo периода; при пересечении x=0/z=0 fog noise должен меняться непрерывно. Добавить CPU math tests на эти инварианты, затем снимки вертикального движения и перехода через оси. Это подтверждение математики координат, без заявления об измеренном FPS или снятом визуальном артефакте.
chexit added the type:bugpriority:P2area:rendering labels 2026-10-29 21:12:14 +00:00
Author
Owner

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

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

No dependencies set.

Reference: chexit/airdef#68