diff --git a/v2/CLAUDE.md b/v2/CLAUDE.md index ee9548e..6a6a93e 100644 --- a/v2/CLAUDE.md +++ b/v2/CLAUDE.md @@ -1580,9 +1580,10 @@ smoothstep ±FOG_BAND_SOFT (0.22): дальняя земля под всей стопкой закрывается до ~0.75 (FOG_BAND_ALPHA 0.28 × 6), ближняя — первым слоем. Клубы каждого слоя — свой fbm-шум по мировым XZ с дрейфом ветра - (глубокие слои медленнее — параллакс объёма); высотное затухание - (FOG_FADE_Y0/Y1 = 1/8) собирает туман в низинах, вершины торчат. - Цвет — env-свет сцены: `fogColor(amb, sun)` = (ambient + солнце· + (глубокие слои медленнее — параллакс объёма). Высотного затухания НЕТ + (фидбек скрином): затухание выше y≈8 выводило из тумана кроны деревьев + (17–38) и героя (~14) — туман «строго у земли»; на плоском рельефе + «низины» ничего не добавляют. Цвет — env-свет сцены: `fogColor(amb, sun)` = (ambient + солнце· FOG_ENV_SUN 0.45)·FOG_BRIGHT 0.75 — туман освещается вместе с миром (день светло-серый, ночь тёмный). Юниформа uFogColor — общий IUniform рендера и композита (как свет частиц), обновляется в конце setSun. diff --git a/v2/packages/engine/src/render/fog.ts b/v2/packages/engine/src/render/fog.ts index 3ecc3ba..f8c55be 100644 --- a/v2/packages/engine/src/render/fog.ts +++ b/v2/packages/engine/src/render/fog.ts @@ -8,7 +8,10 @@ * своей глубине и дальше накапливается — * дальняя земля перекрыта всеми слоями, ближняя — первыми. Клубы каждого * слоя — свой fbm-шум по мировым XZ со своим дрейфом (глубокие слои медленнее - * — параллакс объёма); высотное затухание собирает туман в низинах. + * — параллакс объёма). Высотного затухания НЕТ (фидбек скрином): затухание + * выше y≈8 выводило из тумана кроны деревьев (17–38) и героя (~14) — туман + * «строго у земли»; на плоском рельефе «низины» ничего не добавляют, объём + * читается стопкой слоёв по глубине. * Полоты-квады ⟂ оси взгляда НЕ работают в изометрии: взгляд смотрит вниз * под ~63°, плоскость от линии пересечения с рельефом уходит под землю, и * стопка вырождается в пятна у камеры (грабля изолята dbg-fogiso). @@ -48,14 +51,14 @@ // ---- Разметка слоёв по глубине (в долях viewSize камеры) ---- // Рамка кадра по глубине: камера стоит viewSize·4 от цели, полукадр по // вертикали уходит вдоль взгляда на viewSize/sin(elev) ≈ 1.12·viewSize — -// ближний край кадра на глубине ~2.9·viewSize от ЦЕЛИ, дальний ~5.1. +// ближний край кадра на глубине ~2.9·viewSize ОТ КАМЕРЫ, дальний ~5.1. // Слои размечены в этой полосе: первый чуть перед ближним краем (задел на // подъём тумана), последний внутри дальнего края. /** Число слоёв тумана. */ export const FOG_BANDS = 6; -/** Глубина старта первого слоя от цели (в viewSize). */ +/** Глубина старта первого слоя от камеры (в viewSize). */ export const FOG_BAND_START = 2.7; /** Шаг глубины между слоями (в viewSize). */ @@ -68,18 +71,13 @@ * стопкой закрывается ~0.75 — густо, но силуэты читаются. */ export const FOG_BAND_ALPHA = 0.28; -/** Высотное затухание тумана: полно ниже y0, ноль выше y1 (юниты мира) — - * туман собирается в низинах, вершины торчат. */ -export const FOG_FADE_Y0 = 1.0; -export const FOG_FADE_Y1 = 8.0; - /** Глубина старта слоя k от камеры вдоль взгляда (юниты). Чистая функция. */ export function fogBandStart(k: number, viewSize: number): number { return viewSize * (FOG_BAND_START + k * FOG_BAND_STEP); } /** Композитный шейдер тумана: сэмпл сцены + глубина → мировая точка → - * стопка слоёв по дистанции от цели. SRGB_OUT 1 — квад рисуется прямо + * стопка слоёв по дистанции от камеры. SRGB_OUT 1 — квад рисуется прямо * на канвас (нет пост-прохода игры): нужна конверсия линейного RT. */ export const FOG_FRAG = ` varying vec2 vUv; @@ -135,8 +133,7 @@ float n = 0.6 * afbm(p + drift) + 0.4 * afbm(p * 1.7 + drift * 0.6 + (fk + 1.0) * uTime * vec2(0.021, -0.017)); float billow = clamp(0.5 + (n - 0.5) * 1.9, 0.0, 1.2); - float h = 1.0 - smoothstep(${FOG_FADE_Y0.toFixed(1)}, ${FOG_FADE_Y1.toFixed(1)}, wp.y); - fog += band * billow * h; + fog += band * billow; } float a = clamp(fog * uStrength * ${FOG_BAND_ALPHA.toFixed(2)}, 0.0, 1.0); vec3 c = mix(scene, uFogColor, a);