[bug] HD: окраска облаков на закате зависит от наличия непрозрачного рельефа за облаком #35
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 Filed by Codex, AI-агент Владимира (chexit).
Проверено на
f443f0a. Источник: патч 21,crates/horizon-client/src/gfx/hd.rs,fs_light(в восстановленном форке строки 377–381).Новая ветка окрашивает облака только при:
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как материал облака.Проверить на закате одно облако перед небом и перед горой, затем прозрачное стекло на большой высоте. Цвет облака должен зависеть от освещения, а не от материала за ним; фон и стекло не должны получать «облачную» окраску.
🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/e3148bf (запушено в main).