[bug] HD water: прозрачные объекты перед водой отключают её композит и попадают в преломление #36
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. Источник: патч 19,gfx/hd.rs:fs_light,WATER::fs_water,water_composite; также порядок проходов вgfx.rs.Два проявления одной проблемы: вода композится после прозрачностей, но не имеет чистого цвета сцены позади воды и согласованной с этим цветом глубины.
1. Прозрачный фрагмент переключает всю воду под ним на vanilla-путь
fs_lightставит маску воды, только еслиd - wd <= d * 0.002. Основная глубинаdуже содержит стекло и прозрачные частицы (соответствующие terrain/entity pipelines пишут глубину), даже когда их альфа мала.CPU-проверка условия:
Во втором случае
lit.a=1, аfs_waterнемедленно возвращаетbase.rgb. Под полупрозрачной частицей сохраняется vanilla-вода, тогда как вокруг неё идут HD-волны/отражения. Альфа частицы в выборе этой ветки вообще не участвует.2. Преломление проверяет непрозрачную глубину, а читает цвет с передними прозрачностями
В
fs_waterсмещённая выборка принимается поgbuffer_depth:z > 0 && z <= wd. Затем цвет берётся изlit_tex, где уже может быть объект перед водой.Пример валидных reversed-Z входов:
wd=0.005, глубина непрозрачного дна соседнего пикселяz=0.0016667, но итоговая глубина этого пикселяd=0.01из-за стекла/частицы. Проверка принимает соседний пиксель как «за водой», а цвет фактически содержит переднее стекло/частицу. Оно начинает растягиваться/преломляться в воде, хотя находится перед ней. При билинейной выборке нужно учитывать и соседние texels.Подтверждено анализом буферов и числовой проверкой веток; GPU-сцену здесь не запускали.
Что изменить
Согласовать порядок и данные: например, освещение непрозрачной сцены → вода с преломлением этого цвета → прозрачные объекты перед водой; для объектов под водой сохранить корректную глубину/композицию. Альтернатива — отдельный background color/depth для воды и явные маски прозрачностей. Отбраковка по глубине должна проверять тот слой, откуда взят цвет.
Приёмка
На берегу, над водой: цветное стекло перед камерой и полупрозрачные частицы, затем те же объекты под водой. Передние объекты должны накладываться поверх одинаковой HD-воды без прямоугольных участков vanilla-воды и без затягивания в преломление. Проверить также scale=0.67 и кромку стекла/берега.
🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/e3148bf (запушено в main).