[bug] Перекрывающиеся огонь и дым композятся в порядке создания вместо глубины #16

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

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

В shader_params() blasts передаются через iter().rev() — новые первыми. В effects.wgsl переменная trans общая для всех объёмов; каждый объём целиком композится перед следующим, что предполагает front-to-back порядок. Хронология взрывов не совпадает с глубиной вдоль view ray.

Следствие: дальний новый огонь может подавить ближний старый дым, а результат зависит от времени создания даже при одинаковой геометрии. Алгебра alpha compositing: ближний дым color=.1/alpha=.8 перед дальним огнём color=3/alpha=.8 даёт .56; обратный порядок даёт 2.416. Это анализ формулы, не снятый GPU-кадр.

Предложение: обеспечить корректный порядок по входам луча в непересекающиеся объёмы. Для пересекающихся объёмов сортировка только по центрам недостаточна: нужна согласованная интеграция/обработка перекрытия. Избежать дорогой сортировки всех 48 объёмов для каждого пикселя; использовать короткие tile candidate lists и сравнить стоимость. Минимальное исправление отдельно покрыть сценой двух разнесённых по глубине сфер.

Критерий: перестановка порядка создания двух статичных объёмов не меняет итог; камера может обходить их без неверной смены переднего/заднего; сравнить GPU time.

Код:

let blasts: Vec<&sim::Blast> = self.sim.blasts.iter().rev().take(48).collect();
,
var trans = 1.0;
.

Проверка исходников на `90379f6`. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS. В `shader_params()` blasts передаются через `iter().rev()` — новые первыми. В `effects.wgsl` переменная `trans` общая для всех объёмов; каждый объём целиком композится перед следующим, что предполагает front-to-back порядок. Хронология взрывов не совпадает с глубиной вдоль view ray. Следствие: дальний новый огонь может подавить ближний старый дым, а результат зависит от времени создания даже при одинаковой геометрии. Алгебра alpha compositing: ближний дым color=.1/alpha=.8 перед дальним огнём color=3/alpha=.8 даёт .56; обратный порядок даёт 2.416. Это анализ формулы, не снятый GPU-кадр. Предложение: обеспечить корректный порядок по входам луча в непересекающиеся объёмы. Для пересекающихся объёмов сортировка только по центрам недостаточна: нужна согласованная интеграция/обработка перекрытия. Избежать дорогой сортировки всех 48 объёмов для каждого пикселя; использовать короткие tile candidate lists и сравнить стоимость. Минимальное исправление отдельно покрыть сценой двух разнесённых по глубине сфер. Критерий: перестановка порядка создания двух статичных объёмов не меняет итог; камера может обходить их без неверной смены переднего/заднего; сравнить GPU time. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L355, https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/shaders/effects.wgsl#L143.
chexit added the area:renderingpriority:P2type:bug labels 2026-10-29 13:09:55 +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#16