[bug] HD: окраска облаков на закате зависит от наличия непрозрачного рельефа за облаком #35

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

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

Проверено на f443f0a. Источник: патч 21, crates/horizon-client/src/gfx/hd.rs, fs_light (в восстановленном форке строки 377–381).

Новая ветка окрашивает облака только при:

atmosphere && !water && d > 0.0 && g <= 0.0 && p.y > 8.0 && dot(p, p) > 2304.0

d — глубина итоговой сцены, g — глубина непрозрачного G-буфера. Облако пишет глубину в основную сцену (gfx.rs: cloud_pipeline, depth_write=true), но не в G-буфер. Наличие g > 0 говорит о непрозрачном объекте вдоль луча, в том числе позади облака, а не об отсутствии облака.

Проверка

CPU-проверка точного условия из шейдера: один и тот же видимый фрагмент облака (d=0.005, p.y=60, расстояние 200):

  • за облаком небо (g=0) → ветка окраски выполняется;
  • за облаком далёкая гора (g=0.001, глубже облака в reversed-Z) → ветка не выполняется.

Ожидаемое проявление в игре: при взгляде снизу на облако перед высокой горой закатный оттенок меняется по силуэту фонового рельефа. Также эвристика может принять за облако высоко расположенное прозрачное стекло/другую геометрию, которой нет в G-буфере.

Это проверка условий и порядка проходов; визуальный тест на GPU здесь не запускался.

Исправление и приёмка

Окрашивать облака в их собственном проходе либо передавать явную маску/данные облаков. Простая замена g <= 0 на другую эвристику не решает смешивание полупрозрачного облака с фоном: нельзя красить весь уже смешанный scene как материал облака.

Проверить на закате одно облако перед небом и перед горой, затем прозрачное стекло на большой высоте. Цвет облака должен зависеть от освещения, а не от материала за ним; фон и стекло не должны получать «облачную» окраску.

🤖 Filed by Codex, AI-агент Владимира (chexit). Проверено на `f443f0a`. Источник: [патч 21](https://gitea.maoniao.team/chexit/airdef/src/commit/f443f0a94a71eb2d446792f1829146f9563aaf5d/horizon-patches/0021-HD-sky-and-light-a-physical-atmosphere-Rayleigh-Mie-.patch), `crates/horizon-client/src/gfx/hd.rs`, `fs_light` (в восстановленном форке строки 377–381). Новая ветка окрашивает облака только при: ```wgsl atmosphere && !water && d > 0.0 && g <= 0.0 && p.y > 8.0 && dot(p, p) > 2304.0 ``` `d` — глубина итоговой сцены, `g` — глубина непрозрачного G-буфера. Облако пишет глубину в основную сцену (`gfx.rs`: `cloud_pipeline`, depth_write=true), но не в G-буфер. Наличие `g > 0` говорит о непрозрачном объекте вдоль луча, в том числе **позади облака**, а не об отсутствии облака. ### Проверка CPU-проверка точного условия из шейдера: один и тот же видимый фрагмент облака (`d=0.005`, `p.y=60`, расстояние 200): - за облаком небо (`g=0`) → ветка окраски выполняется; - за облаком далёкая гора (`g=0.001`, глубже облака в reversed-Z) → ветка не выполняется. Ожидаемое проявление в игре: при взгляде снизу на облако перед высокой горой закатный оттенок меняется по силуэту фонового рельефа. Также эвристика может принять за облако высоко расположенное прозрачное стекло/другую геометрию, которой нет в G-буфере. Это проверка условий и порядка проходов; визуальный тест на GPU здесь не запускался. ### Исправление и приёмка Окрашивать облака в их собственном проходе либо передавать явную маску/данные облаков. Простая замена `g <= 0` на другую эвристику не решает смешивание полупрозрачного облака с фоном: нельзя красить весь уже смешанный `scene` как материал облака. Проверить на закате одно облако перед небом и перед горой, затем прозрачное стекло на большой высоте. Цвет облака должен зависеть от освещения, а не от материала за ним; фон и стекло не должны получать «облачную» окраску.
chexit added the priority:P2area:renderingtype:bug labels 2026-10-29 16:21:40 +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#35