[bug] Occlusion свечения сравнивает осевую глубину с расстоянием вдоль луча #14

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

Проверка исходников на 90379f6. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS.

В prelude gfx/mod_post.rs: project(world).z возвращает clip c.w (осевую глубину для perspective projection). scene_distance(uv) возвращает length(view_ray_point(...)) — расстояние вдоль луча. effects.wgsl сравнивает эти разные величины для visibility вспышек и отсечения glow.

Математический контрпример, без запуска GPU: точка в координатах камеры (10, 0, -10) имеет осевую глубину 10 и расстояние sqrt(200)≈14.142. Стена на том же луче на расстоянии 12 закрывает точку, но сравнение 12 < 10 ложно. Чем дальше от центра экрана, тем сильнее расхождение. Для фактических sphere radii выбрать радиус существенно меньше этой разницы.

Предложение: сохранить c.w для определения знака/положения относительно камеры, а при occlusion использовать одну метрику на обеих сторонах (radial distance либо обе axial depths) и согласованные радиусные допуски. Не менять project API молча, если есть другие consumers.

Критерий: тест с источником за стеной в центре и у края экрана; корректная видимость при повороте камеры и изменении FOV, без просвечивания glow через препятствие. Нужен GPU image regression для окончательной визуальной проверки.

Код:

(prelude),
let visible = select(0.25, 1.0, scene_distance(p.xy) > p.z - a.w);
,
if scene_distance(p.xy) < p.z - a.w * 1.5 { continue; }
.

Проверка исходников на `90379f6`. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS. В prelude `gfx/mod_post.rs`: `project(world).z` возвращает clip `c.w` (осевую глубину для perspective projection). `scene_distance(uv)` возвращает `length(view_ray_point(...))` — расстояние вдоль луча. `effects.wgsl` сравнивает эти разные величины для visibility вспышек и отсечения glow. Математический контрпример, без запуска GPU: точка в координатах камеры (10, 0, -10) имеет осевую глубину 10 и расстояние sqrt(200)≈14.142. Стена на том же луче на расстоянии 12 закрывает точку, но сравнение `12 < 10` ложно. Чем дальше от центра экрана, тем сильнее расхождение. Для фактических sphere radii выбрать радиус существенно меньше этой разницы. Предложение: сохранить c.w для определения знака/положения относительно камеры, а при occlusion использовать одну метрику на обеих сторонах (radial distance либо обе axial depths) и согласованные радиусные допуски. Не менять project API молча, если есть другие consumers. Критерий: тест с источником за стеной в центре и у края экрана; корректная видимость при повороте камеры и изменении FOV, без просвечивания glow через препятствие. Нужен GPU image regression для окончательной визуальной проверки. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/horizon-patches/0003-Mod-API-AirDef-fork-full-screen-post-pass-for-mods.patch#L262 (prelude), https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/shaders/effects.wgsl#L200, https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/shaders/effects.wgsl#L214.
chexit added the area:renderingpriority:P2type:bug labels 2026-10-29 13:09:47 +00:00
Author
Owner

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

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

No dependencies set.

Reference: chexit/airdef#14