9.46.6: ФИКСЫ. (1) Облака больше не получают TORCH_AO/TORCH_SHADOWS: gbuffers_clouds.fsh писал lmcoord.x в colortex3.r, composite принимал это за блочный свет -> теперь 0 (3 папки). (2) Молния ванильная была чёрной: gbuffers_entities.fsh умножал цвет на getLight(), а у молнии нет текстуры/лайтмапы. Добавлена ветка в начале main: entityId 7000 (entity.7000=minecraft:lightning_bolt в entity.properties корня и world1) или запасной признак по цвету вершин (0.45,0.45,0.5, a<0.45) -> самосветящийся бело-голубой цвет, свечение в colortex1. (3) CONNECTED_TEXTURES: убран радиус CTM_DISTANCE (из composite x3, shaders.properties, lang en_us/ru_ru). Гашение теперь по размеру пикселя в текселях (ctmPx), вблизи рваный край по хэшу, вдали мягкое усреднение (ctmSoft), допуски проверки позиции в ctmTry растут с размером пикселя. Проверено только препроцессором cpp (скобки), в игре не проверено. (4) Эффект «Свечение» (Glowing, контур мобов): добавлен gbuffers_entities_glowing.fsh/.vsh в 3 папки -- простой проход (цвет команды + альфа текстуры, без света/тумана, DRAWBUFFERS:0); vsh = копия gbuffers_entities.vsh своей папки. Версия 1 (заливка цветом команды) делала моба целиком белым -- игра рисует в этом проходе сам силуэт. Версия 2: внутри текстура*лайтмапа, цвет команды только по краю (fresnel по shPos/shNormal). В игре не проверено. НЕ решено: искажение/мерцание руд от эффектов воды -- причина не найдена.
9.46.5: ЧАСТИЦЫ ШЕЙДЕРА (composite15.fsh, apKind, во всех трёх папках): вместо круглых точек у каждого вида свой спрайт в плоскости, перпендикулярной лучу: лист (заострённый овал, черешок, средняя и боковые жилки, кувыркание вокруг оси, рубашка темнее, 4 осенних цвета), снежинка (6 лучей с веточками), пузырь (кольцо + блик), светлячок (светящееся брюшко + ореол + мигание), пепел (рваные хлопья, угольки тлеют с ореолом), пыльца (пушистый шарик с ореолом), пылинка (изредка вспыхивает крестиком), песок (чёрточки вдоль ветра), взвесь под водой (вытянутая крупинка). Издалека (спрайт < ~2 клеток) остаётся прежняя точка, форма проступает плавно (big). Размеры: лист 0.12, снежинка 0.055, пепел 0.04, пыльца 0.026, взвесь 0.02 (радиус, блоков; множится на «Размер частиц»). Пиксельный стиль: жёсткий край, спрайт лежит на крупной сетке клеток. Проверено glslangValidator (все частицы вкл/выкл, PIXEL_STYLE 0/1, 3 папки) и CPU-превью форм листа/снежинки. В игре не проверено, возможно придётся подкрутить размеры.
9.46.4: ЛОКАЛИЗАЦИЯ (en_us.lang, ru_ru.lang): у 16 уже РАБОТАЮЩИХ настроек Weather (RAIN_FOG, RAIN_DARKENING, SNOW_ACCUMULATION, SNOW_PARTICLES, STORM_WIND, STORM_CLOUDS, THUNDER_FLASH_COLOR, WEATHER_TRANSITION, WIND_STRENGTH, WIND_DIRECTION, WIND_GUSTS, FOG_WEATHER_BLEND, DUST_STORM, HEATWAVE_DISTORT, AURORA_EFFECT) убрано «Placeholder / Zagotovka», написаны честные описания по коду и правильные подписи значений (раньше везде стояло Off/On, хотя это ползунки 0-100% / списки). Реально НЕ реализовано только SNOW_FOOTPRINTS (так и написано), PARTICLE_SHADOWS/PARTICLE_COLLISION (невозможно в шейдере). Описания папок Weather и Particles переписаны. Остальные 6 lang-файлов (uk_ua, be_by, en_au/ca/gb/pt) этих ключей не содержат, берут текст из en_us.
9.46.3: ФИКС «сломанных композитов». OptiFine запускает ТОЛЬКО composite..composite15 -- проходы composite16..composite27 (12 фильтров: OUTLINE, SOBEL, CONVOLVE, BITS, GREEN, CREEPER, PINCUSHION, NTSC, PHOSPHOR, WOBBLE, SPIDER, PENCIL) не выполнялись никогда. Все 24 фильтра Super Secret теперь уложены ПАРАМИ в composite3..composite14 (порядок фильтров сохранён: 3=FLIP+DECONVERGE, 4=INVERT+DESATURATE, 5=BLUR+NOTCH, 6=FXAA+ANTIALIAS, 7=ART+BLOBS2, 8=BLOBS+BUMPY, 9=OUTLINE+SOBEL, 10=CONVOLVE+BITS, 11=GREEN+CREEPER, 12=PINCUSHION+NTSC, 13=PHOSPHOR+WOBBLE, 14=SPIDER+PENCIL); второй фильтр пары читает результат первого через макрос SRC. Все проходы теперь читают И пишут colortex5 (раньше чередовались 5/6, а при program.enabled=false пропущенный проход ломал чётность -- итог оставался в colortex6, final читает colortex5). Файлы composite16..27 удалены во всех трёх папках, program.*.enabled обновлены (A>0||B>0). SELFCHECK: ожидаемый счётчик цепочки 25 -> 1 (метку 4/255 ставит composite2, фильтры её не трогают). Проверено glslangValidator: все .fsh/.vsh в трёх папках без ошибок, все 4 комбинации on/off каждого из 12 проходов. Версия 3: при Свечении игра рисует в этом проходе и тело самого игрока (при взгляде вниз -- огромный силуэт), а DRAWBUFFERS:0 не писал colortex3.w -> SELFCHECK «TERRAIN OR WATER NOT RUNNING». Теперь DRAWBUFFERS:013 (colortex3 = 0,0,0,1) и discard, если length(shPos) < 2.0. Версия 4: fresnel-кайма была почти невидима (плоские грани), поэтому теперь gbuffers_entities_glowing только помечает силуэт (colortex3.z = 0.095, моб внутри как обычно), а composite.fsh (3 папки, перед записью gl_FragData[0]) рисует белую обводку ~2 px вокруг метки (8 проб). Цвет команды не передаётся (всегда белый). В игре не проверено.
9.45.62: PERFORMANCE: меню «Производительность» -- реализованы 10 из 20 кнопок. Общий блок PERF_* (опции + производные макросы) вставлен после #version в gbuffers_* (terrain/block/entities/hand/textured_lit/water), composite, deferred, gbuffers_entities.vsh и заменяет заглушки в composite2/final во всех трёх мирах. SHADOW_QUALITY (радиус PCF 0/1/2 во всех gbuffers), REFLECTION_QUALITY (шаги/рост шага/уточнение луча: composite.fsh вода, deferred.fsh металл), CLOUD_QUALITY (слои шума / мягкие края облачных теней), TEXTURE_FILTERING (perfTex в terrain: анизотропия 4 тапа), MIPMAP_MODE (смещение LOD в perfTex), LOD_DISTANCE (96/48/24: отражения лучом, тени факелов, карты нормалей/бликов), ENTITY_CULLING (gbuffers_entities.vsh, по центру сущности; в Энде выключено), LOW_POWER_MODE и BATTERY_SAVER (PERF_LVL 1/2: RAY_SAMPLES_E/RAY_R_STEPS_E/TORCH_SHADOWS_STEPS_E делятся на PERF_DIV, параллакс, тени, отражения, облака, LOD, сущности), NOISE_REDUCTION (двусторонний фильтр по цвету в final.fsh сразу после чтения colortex5). УДАЛЕНЫ из меню и из кода (шейдер физически не может): RENDER_SCALE, DYNAMIC_RESOLUTION, TEMPORAL_UPSCALE (нет рендера в другом разрешении), VSYNC_HINT, MULTI_THREAD_HINT, ASYNC_COMPUTE (не управляются из шейдера), OCCLUSION_CULLING (делает движок), CACHE_SHADOWS (карта теней очищается каждый кадр), FRAME_SMOOTHING (нужен буфер истории -- свободного нет), PRECISION_MODE (в GLSL 1.20 нет precision). Ограничения: ENTITY_CULLING не убирает тени отсечённых мобов из карты теней. Проверка: препроцессор cpp по 6 комбинациям настроек для всех файлов (скобки, нераскрытые макросы), GLSL-валидатора в среде нет -- проверить запуском в OptiFine. Новые uniform не добавлялись.
9.45.61: ФИКС Invalid program (gbuffers_*) при реальных тенях без теней от облаков (cameraPosition), final.fsh thunderStrength без интро, composite.fsh ripHash при блике воды без ряби. Плюс тест: postFX в слоте composite15.
TEST: postFX (бывший composite27) перенесён в слот composite15; PENCIL_FILTER теперь composite27. Проверка лимита проходов OptiFine.
AlphaLook-Shader 9.45.59 -- Particles: проверка биома (temperature/rainfall) больше не гасит светлячков, если OptiFine не прислал значения; лунный свет для пыли/пепла ночью; светлячки видны при меньшем небесном свете.
  Предыдущее состояние (9.45.58): AlphaLook-Shader 9.45.58 -- Particles: сделаны 18 из 20 пунктов раздела.
  Игровые частицы (gbuffers_textured_lit.fsh/.vsh): GLOW, SOFT_EDGES, LIGHTING, SPARKLE, FADE_DISTANCE, WIND_AFFECT, SMOKE_CURL (дым узнаётся по серому цвету вершины).
  Воздушные частицы шейдера (composite27.fsh, apKind): DUST, FIREFLIES, POLLEN, ASH, LEAVES_FALL, BUBBLES, UNDERWATER; PARTICLE_DENSITY/SIZE_SCALE/TRAILS/MOTION_BLUR действуют только на них.
  PART_DIM в composite27 (0 мир, 1 Незер, 2 Энд). НЕ сделаны (невозможно в шейдере): PARTICLE_SHADOWS и PARTICLE_COLLISION -- остались серыми заглушками в final.fsh/composite2.fsh.
  Предыдущее состояние (9.45.57): AlphaLook-Shader 9.45.57 -- Post: сделаны оставшиеся 6 пунктов (все в composite27.fsh, во всех трёх измерениях):
  LENS_DISTORTION (бочка/подушка, края закрыты зумом), LIGHT_SHAFTS_POST (экранные лучи от солнца), TONEMAP_MODE (ACES / Hable / Reinhard),
  SCREEN_SHAKE (урон, быстрое падение, очень быстрое движение), LOW_HEALTH_PULSE (оценка по woundLevel -- здоровья в OptiFine нет), SCREENSHOT_MODE (прячет интро/инфопанель/статистику/биом-отладку, больше проб).
  Заглушки убраны из final.fsh и composite2.fsh; новые custom uniform: woundLevel (shaders.properties).
  Предыдущее состояние (9.45.56): AlphaLook-Shader 9.45.56 (Post: UNDERWATER_BLUR (мозаика/плавно) и LENS_FLARE (пиксельная звезда + 4 призрака, видимость по глубине) в postFX composite27, ползунки 0-100) / 9.45.55 (БАГФИКС: узоры воды под водой были 16x16 — terrain теперь пишет разрешение текстуры (colortex7.r) при PIXEL_STYLE всегда, вода тоже, а composite.pdResAt при отсутствии кода ищет соседний пиксель; пиксельные: рябь под водой (клетки экрана, сдвиг ступенями), преломление льда, преломление и отражение воды (узор по пикселям мира)) / 9.45.54 (ПИКСЕЛЬНЫЙ СТИЛЬ с нуля: общий переключатель PIXEL_STYLE (по умолчанию 1, меню верхнего уровня; 0 = прежний плавный вид; Силли не трогает). Под ним: пиксельные тени (sunVisible: привязка к сетке пикселей текстуры, shPxRes) в terrain/water/block/textured_lit; блики на воде (ступени + мерцающие искорки, composite.fsh); каустика и пятна воды; экранные виньетки (scrSnap/scrQ) и Damage Vignette; падающие звёзды (клетки неба, ступени); пятна крови (клетки текстуры + ступенчатая пульсация)) / 9.45.53 (пиксельный проход 1: Water Caustics и Surface Noise на сетку 1/PD_RES + ступени яркости (composite.fsh, WPX_CAUSTIC_STEPS/WPX_NOISE_DIV, PD_WAUTO расширен), экранные виньетки YT_FOCUS_RING/YT_VIGNETTE/YT_HEARTBEAT/DANGER_VIGNETTE/YT_SPEED_LINES/DAMAGE_VIGNETTE на сетку инея 32 клетки по высоте (scrSnap/scrQ); отчёт AlphaLook_pixel_audit.md) / 9.45.52 (DAMAGE_VIGNETTE: добавлен uniform dmgHurt = smooth(is_hurt) из shaders.properties, срабатывает на любой урон; крен камеры остался запасным способом) / 9.45.51 (DAMAGE_VIGNETTE: красная виньетка при ударе по крену камеры (gbufferModelViewInverse[0].y, DMGV_ROLL_MIN/MAX), в postFX composite27) / 9.45.50 (Post: новые SHARPEN/CONTRAST_CURVE/BLACK_POINT/WHITE_BALANCE (ползунки) внутри postFX() в composite27; дубликаты уже существующих YT_*/CHROMA/EDGE_FRINGE убраны из меню Post: VIGNETTE, FILM_GRAIN, LETTERBOX_BARS, CHROMATIC_ABERRATION, COLOR_GRADING) / 9.45.49 (DOF и Motion Blur встроены в composite27 (панели) как postFX() вместо отдельных проходов 27/28: при OFF кода и проходов нет; 10+7 проб, резкая зона/стоящая камера не считаются; панели рисуются поверх, не размываются; program.enabled для 27/28 убраны) / 9.45.48 (оптимизация terrain в дождь: рельеф текстуры только для por < RPD_RELIEF_MAXPOR (раньше ~28 чтений текстуры на КАЖДЫЙ пиксель), средняя яркость плитки 3x3 вместо 5x5, цикл соседей обводки только у границы) / 9.45.47 (выключенный эффект = проход не запускается: program.*.enabled для composite3..28 (24 фильтра + DOF + Motion Blur) в shaders.properties для корня/world-1/world1; WATER_WAVE_HEIGHT=0 и SHOOTING_STAR_CHANCE=0 выключают код полностью) / 9.45.46 (DOF мягче и дешевле: радиус 0.010, K 3.0 без умножения на фокус, фокус до 24 блоков, при взгляде в небо эффект x0.25 (DOF_SKYAMT), 16 проб вместо 32) / 9.45.45 (Depth Of Field = composite27.fsh (автофокус по центру экрана, кружок рассеяния), Motion Blur = composite28.fsh (репроекция по глубине); панели переехали composite27 -> composite29 во всех папках; заглушки разблокированы в world1/final.fsh) / 9.45.44 (обводка луж больше не чёрная: мокрая земля + множитель RPD_RIMDARK 0.70, обводит границу «вода+пятно» (max(лужа, пятно)), поэтому живёт дольше воды и пропадает вместе с пятном; RPD_RIMWET) / 9.45.43 (радиус пиксельной детали луж касался всего (мокрость/блеск/края), теперь вдали сетка укрупняется ячейками 2^k, pdResG/pdFine, по умолчанию 6400%) / 9.45.42 (тёмная обводка 1-2 пикселя вокруг воды больших луж: соседи считаются тем же шумом, обводка — отдельный слой, RPD_RIMPX/RPD_RIMDARK) / 9.45.41 (фикс: земля вокруг луж стала светлой — кайма теперь один слой мокрой тёмной земли RPD_RIMWET вместо обнуления мокрости) / 9.45.40 (слои луж не накладываются: приоритет вода > кайма > пятно > светлый след > ручеёк > мокрость, pdRimK в gbuffers_terrain.fsh) / 9.45.39 (щели луж вдали: ячейки 2^k текселей по сетке блока вместо мерцания, строго вкл/выкл без плавного затухания (pdFine/pdLodFade через step), ползунок PUDDLE_RELIEF_RANGE = макс. уровень ячеек, gbuffers_terrain.fsh) / 9.45.38 (сочетаемость кнопок: в composite.fsh все общие uniform-ы (rainStrength, isEyeInWater, depthtex0/1, colortex1/3, gbuffer-матрицы, skyColor, fogColor...) объявлены ВСЕГДА, а не под #if отдельных эффектов; так любое сочетание кнопок собирается. Это же чинит "Invalid program composite" при Reflections вкл + Specular/Ripples/Splash выкл. В gbuffers_terrain.vsh атрибуты mc_Entity/mc_midTexCoord тоже всегда. ПРАВИЛО ДЛЯ НОВЫХ ЭФФЕКТОВ: не объявлять uniform под своим #if — добавлять в общий блок в начале composite.fsh) / 9.45.37 (лампа и колокол без своих переключателей: включаются вместе со Specular Mapping) / 9.45.36 (золотой колокол — отражение как у лампы: тег 10811, тело через gbuffers_block по blockEntityId, ползунок TERRAIN_BELL_GLOSS) / 9.45.35 (редстоуновая лампа — отдельный сильно отражающий материал, тег 10810, ползунок TERRAIN_LAMP_GLOSS) / 9.45.34 (глянец камня/незерака стал виден: шире маска выпуклости, F0 бугорков до 0.24, ползунок до 300%) / 9.45.33 (лёгкий глянец досок/незерака/булыжника: теги 10807..10809 + ползунок TERRAIN_GLOSS) / 9.45.32 (Металл не белый + настоящие отражения SSR в новом проходе deferred.fsh: земля/мобы в металле; TERRAIN_SSR) / 9.45.31 (Specular Mapping: настоящие металлы + отражение окружения TERRAIN_REFLECTION, теги block.properties 10801..10806; нормали берут разрешение текстур из атласа) / 9.45.30 (Puddles под разрешение текстур АВТОМАТИЧЕСКИ: PUDDLE_RES 0=авто/16..512 в меню Weather рядом с Puddles; terrain.fsh + composite.fsh) / 9.45.29 - починена кнопка Инфопанели (в composite27.fsh был лишний #define INTRO_HUD, не совпадавший с final.fsh -> OptiFine блокировал настройку); добавлена независимая Панель статистики STATS_PANEL (день, FPS, фаза луны) в composite27.fsh; название биома пока не сделано (нужна таблица из BIOME_DEBUG)
(файл лежит рядом с папкой shaders, шейдеру не мешает)

РЕАЛИЗОВАНО (меню: Water)
  Reflections   — composite.fsh (луч по буферу глубины + небо), метка воды в gbuffers_water
  Water Tint    — gbuffers_water.fsh: ползунок-оттенок 0..8 (1 бирюзовый, 2 глубокий синий, 3 изумрудный, 4 болотный, 5 фиолетовый, 6 розовый, 7 красный, 8 золотой)
  Transparency  — gbuffers_water.fsh: ползунок 0..100% (только вода)

  + Underwater Tint (composite.fsh, ползунок 0-100%) — готово
  Underwater Distortion (composite.fsh, ползунок 0-100%) — готово
  Specular Highlight (composite.fsh, ползунок 0-100%; WS_* — тонкая настройка; реалистичная версия: Френель, дальность ряби, цвет у горизонта, дождь) — готово
  Depth Fog (composite.fsh, ползунок 0-100%; WDF_* — тонкая настройка) — готово
  Caustics (composite.fsh, ползунок 0-100%; WC_*; и изнутри воды, и сверху сквозь воду — узор привязан ко дну) — готово
  Refraction (composite.fsh, ползунок 0-100%; WRF_* — тонкая настройка) — готово
  Edge Fade (gbuffers_water.fsh, ползунок 0-100%; WEF_WIDTH) — готово; Foam: пробы берега в мировых координатах (без круга вокруг игрока)
  Foam (composite.fsh, пиксельная, по близости берега; ползунок 0-100%; WF_DEPTH) и Surface Noise (ползунок 0-100%; WSN_SIZE) — готово
  Splash Particles (composite.fsh, ползунок 0-100%; SPL_* — тонкая настройка; брызги-«крошки» 1/16 блока из тех же точек, что круги дождя; только дождь и открытое небо; метку воды в gbuffers_water пишет тоже) — готово
  Flow (gbuffers_water.vsh + .fsh, кнопка Вкл/Выкл; WFL_* — тонкая настройка): по всей воде бегут пиксельные полоски: на текущей (наклон из dFdx/dFdy позиции ДО волн) вниз по склону, на стоячей — слабый медленный дрейф (WFL_STILL*). Метка воды в composite не нужна, colortex3 не трогает — готово
  Surface Parallax (кнопка Вкл/Выкл; WPX_* — тонкая настройка): слои узоров на разной глубине, сдвиг по углу взгляда. Flow — второй глубокий слой полосок (gbuffers_water.fsh); Surface Noise — второй слой пятен, Foam — приподнята над водой (composite.fsh). Работает вместе с Flow / Surface Noise / Foam — готово
  ВАЖНО: метку воды в gbuffers_water теперь пишут и Specular/Caustics/Refraction (раньше блик без Reflections/Tint/Transparency не работал)

ФАЙЛЫ, КОТОРЫЕ ТРОГАЛИ (относительно оригинала 9.44)
  composite.fsh, gbuffers_water.fsh, gbuffers_water.vsh, block.properties (тег 10502 = вода),
  shaders.properties (sliders=), lang/en_us.lang, lang/ru_ru.lang,
  объявления настроек в composite2.fsh и final.fsh (корень, world1, world-1)

КАК РАЗБЛОКИРОВАТЬ СЛЕДУЮЩУЮ ЗАГЛУШКУ (важно!)
  Кнопка серая, пока #define настройки ОТЛИЧАЕТСЯ в разных файлах. В world1/final.fsh у всех заглушек
  стоит 1, в остальных файлах 0. Чтобы разблокировать — поставить 0 в world1/final.fsh
  (для WATER_REFLECTIONS, WATER_TINT, WATER_TRANSPARENCY уже сделано).

ТОНКАЯ НАСТРОЙКА (в меню не выводится, правится в коде)
  composite.fsh        : WR_STRENGTH, WR_SOFT, WR_SOFT_MAX, WR_STRETCH   (отражения)
  gbuffers_water.fsh   : WT_TINT_AMOUNT, WT_ALPHA_MIN; список оттенков — функция waterTintColor

ИЗВЕСТНЫЕ ОГРАНИЧЕНИЯ
  - Отражается только то, что попало в кадр (остальное — небо).
  - Поверхность воды считается плоской (для Waves нужно будет подключить нормаль).
  - world1 / world-1 (Энд, Незер): копии composite.fsh и gbuffers_water НЕ обновлялись.

ПЛАН ДАЛЬШЕ
  Specular Highlight (блик солнца), Underwater Tint, Underwater Distortion, затем Fresnel Effect / SSR как переключатели.

СЛАЙДЕРЫ (как оформляются): значение //[...] должно быть ОДИНАКОВЫМ во всех файлах, где объявлена настройка
  (gbuffers_water.*, composite2.fsh, final.fsh и их копии в world1/world-1), плюс имя в sliders= в shaders.properties
  и подписи value.НАСТРОЙКА.N в lang.

ПОГОДА (Weather):
  Puddles / RAIN_PUDDLES (кнопка Вкл/Выкл, gbuffers_terrain.fsh + .vsh): пиксельные лужи (клетки 1/16 блока) на верхних гранях обычных блоков под открытым небом; растут с uniform wetness, в снежном биоме нет. Цвет/прозрачность воды берут из WATER_TINT / WATER_TRANSPARENCY; пиксель лужи метится в colortex3.z как вода (0.41+0.08*небо), поэтому composite.fsh даёт лужам отражения/блик/пятна/круги (WATER_REFLECTIONS, WATER_SPECULAR, WATER_SURFACE_NOISE, WATER_RIPPLES). Брызги (WATER_SPLASH_PARTICLES): на самих лужах их НЕТ; на мокрой земле вне луж — мелкие (сетка 1/64, взлёт/разлёт вдвое меньше, тусклее). Метка мокрой земли — colortex3.w = 0.85 - 0.45*e, e = 0.3*wetK + 0.7*wetK*wetG (wetG = зеркальность пикселя). Отражения мокрой земли: при WATER_REFLECTIONS вкл composite.fsh отражает зеркальные пиксели (сила smoothstep(0.32,0.92,e), без волн, Френель мягче); при выкл terrain сам добавляет простой блеск неба. Раньше метка была (terrain пишет, composite читает; у остального w = 1.0; colortex3.y занят флагом опасного моба для final.fsh — не трогать). Пена (WATER_FOAM) на лужи не идёт (условие dF1 > dF0). Мокрая земля вне луж (та же кнопка): wetK по пикселям — темнее (RPD_DARK) + блеск отражения неба по Френелю (RPD_GLOSS), считается в gbuffers_terrain.fsh независимо от TERRAIN_SPECULAR_MAP. Блика солнца на мокрой земле нет. Разблокировано (world1/final.fsh: 0) — готово, в игре не проверено.
  Дальше по плану: Rain Ripples (пиксельные круги на лужах + мелкие брызги-капли на сухой земле + разная мокрость по пикселям).
  Мокрость теперь на ВСЁМ под открытым небом (земля, стены, трава, листва; низ сухой, бока слабее верха; лава исключена): gbuffers_terrain.fsh, pdCover. Отражения/брызги (w-метка) только у верхних граней обычных блоков; трава/листва/бока — только потемнение и лёгкий блеск. Лава под дождём (верхняя грань, небо) метится colortex3.w = 0.2 — на ней ЧЁРНЫЕ брызги (composite.fsh, isLavaP). Не исключены: огонь, факелы и т.п. (нет отдельного id).
  Время жизни (shaders.properties): uniform wetThin = smooth(2, дождь в биоме, 20, 240) — тонкая мокрость, сохнет ~8 мин; wetPuddle = smooth(3, ..., 120, 1700) — лужи наполняются ~2 мин, стоят ~30 мин. Дождь только там, где biome_precipitation == 1 (пустыня без луж). Рядом с лужей земля влажнее, пока лужа стоит. wetness (игровая) остаётся для снега. Идея на потом: быстрее сохнуть на солнце, медленнее в тени.
  Реалистичная вода (Puddles): (1) глубина лужи — середина глубже/темнее/плотнее, кромка мелкая и прозрачная (pdDepth, terrain); (2) стекание по стенам — анимированные ручейки-колонки на боковых гранях обычных блоков (rstreak, terrain, ползут вниз по клеткам 1/16); (3) край лужи у обрыва (composite.fsh, блок «КРАЙ ЛУЖИ», нужен RAIN_PUDDLES в гейтах рядом с WATER_FOAM): пробы в мире по 4 сторонам, если за пробой на экране поверхность заметно дальше/небо — у кромки мокрая полоса без воды + светлый валик. Не сделано: капли, падающие с края; перетекание воды между блоками разной высоты; лужи в самых низких местах (шейдер не знает рельеф).
  Лужи (обновление): wetPuddle = smooth(3, ..., 600, 5100) — наполняются медленно (~10 мин дождя), стоят ~90 мин после дождя (было 120/1700). Тонкая мокрость без изменений (20/240).
  Лужи (9.79 на базе 9.77; изменения 9.78 сюда НЕ переносились): (1) МАТЕРИАЛ решает, где лужи. Впитываемость pdPor 0..1 из тегов block.properties (gbuffers_terrain.vsh): трава 0.80, земля/подзол/мицелий 0.65, гравий 0.90, песок 1.00, тропинка 0.30, пашня/мох/сено 0.80 (тег 10701); всё без тега (камень, булыжник, доски, бетон, глина, грязь) = 0, там лужи самые большие. Теги 10601..10605 общие с CONNECTED_TEXTURES. В gbuffers_terrain.fsh: лужа на впитывающем материале появляется только после налива RPD_SOAK*pdPor; площадь луж меньше в (1 - RPD_PORCOVER*pdPor) раз; мокрая впитывающая земля темнее (RPD_PORDARK) и меньше блестит (RPD_PORGLOSS). Кнопок нет — работает при RAIN_PUDDLES вкл. В игре не проверено.
  План луж дальше (по порядку): 3 текстура как карта высот -> 4 лужи в низинах -> 6 цвет неба в дожде -> 7 огни ночью -> 8 ветер гонит рябь -> 9 высыхание с гистерезисом -> 11 грязь (отдельный ползунок/кнопка) -> 12 капли с листвы и краёв. Синий цвет воды в лужах НЕ менять. Пузырьки уже есть.
  Лужи (9.80): (3) РЕЛЬЕФ ТЕКСТУРЫ. gbuffers_terrain.fsh: pdH = (яркость пикселя - средняя яркость вокруг, мип +2) / средняя, -1..1; считается вне ветвлений по пикселю под uniform-условием wetPuddle > 0.001. Граница лужи сдвигается на RPD_CRACK*pdH (0.20): тёмные щели/швы булыжника заполняются первыми, светлые бугорки остаются сухими островками; глубина воды в щелях больше. RPD_RIDGE (0.35): светлые бугорки на верхних гранях меньше мокрые. Кнопок нет. В игре не проверено; если на очень мелких/высокого разрешения текстурах выглядит шумно — уменьшить RPD_CRACK.
  (9.81 «лужи и рельеф» — пробы высоты в composite — откатили по просьбе: плохая идея. Пункт 4 (лужи в низинах) снят.)
  Лужи (9.82, на базе 9.80; 9.81 откатили): (6) ПАСМУРНОЕ НЕБО В ОТРАЖЕНИЯХ. composite.fsh, блок отражения воды (WATER_REFLECTIONS; лужи и настоящая вода идут одним кодом, поэтому эффект и там и там): в дождь запасное небо (skyFb) и небо, прочитанное «в бесконечности» (skyRd = 1), переводятся в ровный серый той же яркости, чуть холодный, чуть тусклее; деревья/постройки в отражении остаются цветными. Сила ovK = rainStrength * WR_RAINSKY (0.85); WR_RAINSKY_TINT vec3(0.82,0.86,0.93), WR_RAINSKY_DIM 0.85 (в начале composite.fsh рядом с WR_*). Кнопок нет. В игре не проверено.
  Лужи (9.83): (7) ОГНИ НОЧЬЮ В ОТРАЖЕНИИ. composite.fsh, блок отражения воды (лужи и настоящая вода): вокруг точки, куда попал отражённый луч, по вертикали (12 проб, ±WR_LIGHT_LEN=0.035 высоты экрана, случайный сдвиг на пиксель) собираются светящиеся пиксели из colortex1 (буфер свечения BLOOM/лавы/руды) и добавляются к отражению вытянутой дорожкой (WR_LIGHT_GAIN 3.5, потолок 1.5). Сила: WR_LIGHT (1.0, 0 = выкл) * ночь (1 - smoothstep(0.08,0.35, яркость skyColor)) * попадание луча. Нужен рабочий BLOOM (или LAVA_GLOW/ORE_BLOOM) — иначе colortex1 пуст. Кнопок нет. Направление дорожки симметрично вокруг отражённой точки (не проверено, куда «вытянутее»). В игре не проверено.
  Лужи (9.84, на базе 9.83): (9) ВЫСЫХАНИЕ С ГИСТЕРЕЗИСОМ. shaders.properties: новый uniform wetStain = smooth(4, ..., 600, 9000) (падает медленнее wetPuddle 5100). gbuffers_terrain.fsh: (а) лужа сжимается к самым глубоким местам, как и раньше (порог по шуму); (б) тёмное пятно на месте усохшей лужи: тот же шум pdN, порог pdStainThr = wetStain*RPD_COVER*(1-RPD_PORCOVER*pdPor), wetK >= RPD_STAIN (0.70), блеск вдвое меньше (пятно матовое); (в) светлый след кромки: полоса шириной RPD_RINGW (0.035) на границе пятна, видна только когда пятно заметно больше лужи (pdSep), только на твёрдых материалах, albedo * (1 + RPD_RING 0.22). pdN теперь считается вне `if (pdWet > 0.002)` (нужен пятну); pdH считается и при wetStain > 0.001. ИСПРАВЛЕНО: puddleK = step(pdN, pdThr) * step(0.001, pdThr) — в 9.80 из-за сдвига pdN на RPD_CRACK*pdH щели с pdN < 0 давали «воду» даже при почти нулевом пороге. Кнопок нет. Пункт 10 (сохнет быстрее на солнце) НЕ делали. В игре не проверено.
  9.85 = ИСПРАВЛЕНИЕ КОМПИЛЯЦИИ composite (в игре: «Invalid program composite», «program not linked»). Причина: огни ночью (9.83, WR_LIGHT) читали colortex1, а этот sampler объявлен в composite.fsh только под `#if BLOOM || NEON_MOBS > 0 || GLOW_EYES > 0 || LAVA_GLOW > 0 || ORE_BLOOM > 0`; при всех выключенных — необъявленное имя. Теперь блок «ОГНИ НОЧЬЮ» обёрнут в то же условие. Без BLOOM дорожек огней нет (как и было задумано). ВАЖНО на будущее: перед чтением любого sampler в composite/terrain смотреть, под каким #if он объявлен.

  Luzhi 9.91: fix merцания (mip-fade pdH, RPD_HOLLOWS/RPD_LODFADE_*, kray luzhi po vysote), mini-luzhi v vyemkakh teper na wetThin (RPD_HOLLOW_LIFE) - sokhnut pervymi.
  9.92: mini-luzhi tolko na blokakh s pdPor<=RPD_HOLLOW_MAXPOR (0.35), relef luzh otkliuchen na trave/pesке/gravii (RPD_RELIEF_MAXPOR 0.70).
  9.93: Weather: ubrany RAIN_SPLASH/RAIN_RIPPLES (voda v Water). Frost Overlay (final.fsh, uniform frostK v shaders.properties, FRO_* tonkaya nastroyka): piksel nyj izmoroz po krayam ekrana v snezhnom bione. World1/final.fsh: 0 (razblokirovano). V igre ne proverено.
  9.94: frost: predel glubiny FRO_REACH 0.50 (polovina puti k tsentru po kazhdoy osi, zhestkiy potolok), narastanie ~5 min (smooth 150), taet ~10 min (smooth 300).
  9.95: frost FRO_REACH 0.28 (bylo 0.50 - slishkom shiroko), bazovyy frostK 0.85+0.15*rain.
  9.96: (1) mokrost/luzhi ne ischezayut pri vkhode v snezhnyy biom (RPD_SNOWKILL 0.0, pdKeep), (2) opisaniya papok Water/Weather v lang pereпisany (byli zagotovki).
  9.97: luzhi/mokrost ne sozdayutsya na snezhnykh blokakh (teg 10702: snow, snow_block, powder_snow, packed/blue_ice) i na trave/listve s kholodnym ottenkom (pdCold). Ostalnye bloki v snezhnom biome bez snega - ne opredelyayutsya.
  9.98: Water: krugi (WATER_RIPPLES) i bryzgi (WATER_SPLASH_PARTICLES) v snezhnom biome ne otklyuchayutsya, a stanovyatsya spokoynymi (snowBiome, SNW_RIP_* / SNW_SPL_* v composite.fsh): rezhe, medlennee, tusklee, pufy vmesto kapel.
  9.45.30: PUDDLE_RES (кнопка-список 16/32/64/128/256/512, Weather). Все «пиксели» Puddles считаются по сетке 1/PUDDLE_RES блока: клетки луж/мокрости/пятен (gbuffers_terrain.fsh), ручейки на стенах (длина и скорость в пикселях масштабируются, в блоках прежние), круги дождя и радиус колец, брызги (сетка min(RES,256), на мокрой земле x4 до 256), блёстки кромки лужи (composite.fsh). Вдали, когда тексель мельче пикселя экрана, поклеточная случайность гаснет (pdFine в terrain, PD_FARK в composite) — иначе мерцание. Мини-лужи в выемках и рельеф и так брались из реальных пикселей текстуры. Не тронуты: пена и поток воды (Water), снег. PUDDLE_RES задаётся вручную (шейдер не знает размер плитки в composite). В игре не проверено.
  9.45.30 (авто): PUDDLE_RES по умолчанию 0 = АВТО. terrain: размер плитки блока = max(pdTile.zw*atlasSize)*2, округление до степени двойки (16..512; нет atlasSize -> 16), пишет log2(res)*0.1 в colortex7.r (DRAWBUFFERS 0137 при RAIN_PUDDLES>0 и PUDDLE_RES==0); gbuffers_water пишет то же (mc_midTexCoord -> wTileHalf, при WATER_RIPPLES/SPLASH; blend.gbuffers_water.colortex7=off); composite читает colortex7 (pdResAt, PD_AT) в трёх блоках: круги, брызги, кромка лужи. Нет кода (colortex7=0) -> 16. 16..512 в меню = ручное для всего. Зависит от uniform ivec2 atlasSize (OptiFine/Iris). Объявление PUDDLE_RES обязано совпадать в terrain.fsh, composite.fsh, gbuffers_water.vsh/.fsh. В игре не проверено.
  9.45.31: gbuffers_terrain.fsh/.vsh во всех трёх мирах (., world1, world-1). Внутри TERRAIN_SPECULAR_MAP новый ползунок TERRAIN_REFLECTION (0..100, по умолчанию 100). Теги block.properties 10801 железо (металл только у серых пикселей: sat-маска), 10802 золото, 10803 медь, 10804 окисленная медь (mk 0.45), 10805 незерит, 10806 самоцветы/обсидиан/кварц (глянец без металла) -> varying pbrMat (vsh). Нет _s.png: параметры из тега (pbrTagF0), есть: LabPBR (таблица металлов 230..237 в labMetalF0, 255 = цвет текстуры). Отражение: terrEnv() = небо (skyColor/fogColor/upPosition) -> земля ниже горизонта -> пещера + тёплый блочный свет, Френель Шлика с шероховатостью, обесцвечивание неба (иначе золото зеленеет), размытие по шероховатости; только у блоков с тегом или картой. diffK у металла 1-0.8*mk без distance-fade. Карта нормалей: шаг в тексел берёт разрешение из atlasSize (nmRes) и усиливает fallback-наклон на sqrt(res/16). atlasSize в основном террейне объявлен один раз в шапке (PD_NEEDATLAS-условие), в world1/world-1 — рядом с sampler normals. ПРОВЕРКА: glslang (apt download glslang-tools -> dpkg -x) компилирует terrain/composite/water во всех комбинациях опций без ошибок; в игре не проверено. Следующий шаг: SSR для металла в composite (colortex7.gb свободны).
  9.45.32: (1) железо не белое: небо в terrEnv серее и не ярче (mix 0.35, *0.95), диффуз металла 1-0.93*mk, узор текстуры в отражении (detail). Правка есть во всех трёх мирах. (2) TERRAIN_SSR (по умолчанию 1, только Верхний мир): terrain при SSR_ON = TERRAIN_SSR && SPECULAR && REFLECTION НЕ добавляет отражение в цвет, а пишет DRAWBUFFERS 01367: colortex6 = (вес Fr*envK*refl*detail * видимость сквозь туман, открытость небу), colortex7 = (код разрешения Puddles, нормаль xy, метка 0.05+0.95*гладкость; 0 = нет отражения). Новый deferred.fsh/.vsh (после непрозрачного, до воды): для пикселей с меткой луч по depthtex0 (40 шагов, как у воды) читает colortex0 -> земля, блоки, мобы, небо; промах -> terrEnv (копия функции из terrain); цвет += вес*отражение. colortex6 терраином перезаписывается раньше composite3, цепочка фильтров не страдает. Нормаль восстанавливается: xy из буфера, знак z — по лицу к камере. Известные ограничения: нет рекурсии (металл в металле отражает без отражения), отражение за камерой/краем экрана = запасное небо, облака не отражаются (рисуются после deferred). world1/world-1 без SSR (там отражение запечено в terrain как в 9.45.31).
  9.45.33: block.properties 10807 доски (+ступени/плиты, бамбуковая мозаика), 10808 незерак + адские кирпичи, 10809 булыжник (обычный/замшелый/глубинносланцевый). pbrTagF0 получил параметр cvx — относительная выпуклость пикселя (лум. минус 4 соседа / средняя, соседи зажаты внутри плитки): доски sm=0.64+0.16*cvx, незерак 0.12+0.58*cvx, булыжник 0.12+0.52*cvx, F0=0.05, без металла. Абсолютная яркость не годится (тёмный дуб 0.18, бледный дуб 0.86, незерак 0.2) — по текстурам из block.zip. Ползунок TERRAIN_GLOSS (по умолчанию 100) множит вес отражения этих материалов. SSR для слабых отражений не гоняем: ssrS=smoothstep(0.06,0.12,max(W)) — слабое запекается в terrain (spec += Wv*(1-ssrS)*envC), луч только для металла и скользящих углов. atlasSize теперь объявлен и при одном Specular Mapping (в терраине шапка, в world1/world-1 перенесён выше). Все три мира. glslang: ошибок нет; в игре не проверено.
  9.45.34: по скрину (дождь, взгляд сверху) незерак/булыжник были не видны: физический F0 0.05*envK sm^2 ~ 1% яркости. Теперь: cvx сравнивает с соседями на 1 И 2 тексела, smoothstep(0.01,0.08) -> ~40% пикселей камня/незерака (проверено на block.zip). F0: доски 0.07, незерак 0.04+0.20*cvx, булыжник 0.04+0.18*cvx. envK для тегов >=7 = sMooth (не sMooth^2). ssrS порог smoothstep(0.15,0.30) — бугорки запекаются, луч только металлу. TERRAIN_GLOSS: 0..300%. glslang ошибок нет.
  9.45.35: block.10810=redstone_lamp, mat 10 в pbrTagF0: lb=smoothstep(0.15,0.38,lum) (пороги по ванильным текстурам: выкл 0.12..0.46, вкл 0.14..0.87), F0=(0.04+0.42*lb)*оттенок, sm=0.10+0.82*lb, не металл. На светлых пикселях W>0.3 -> настоящий SSR (земля, мобы). glossK: лампа — TERRAIN_LAMP_GLOSS, доски/незерак/булыжник — TERRAIN_GLOSS (раздельно). cvx для лампы не считается. Все три мира. glslang без ошибок. Скрин пользователя: тёмный/бурый блок = редстоуновая лампа (выкл.).
  9.45.36: bell убран из block.10802, теперь block.10811. В терраине mat 11 = bellMatF0 (lb=smoothstep(0.5,0.85,lum)*smoothstep(0.33,0.50,sat): только светлые насыщенно-жёлтые пиксели (светлые дубовые доски не ловятся), деревянная рама остаётся деревом). Тело колокола — блок-сущность (BellRenderer), поэтому gbuffers_block.fsh/.vsh получили: BELL_ON, uniform int blockEntityId (==10811), varying bNrm/bPos (вид), копии bellMatF0 и terrEnv, диффуз *(1-0.93*mk), блик солнца по sunPosition, отражение; в Верхнем мире (SSR_B) пишет DRAWBUFFERS 01367: colortex6=вес*туман+открытость, colortex7=нормаль+метка (остальные блок-сущности пишут нули); blend.gbuffers_block.colortex6/7=off. В world1/world-1 — запеканное отражение без SSR. ПРОВЕРИТЬ В ИГРЕ: срабатывает ли blockEntityId (OptiFine 1.17+/Iris). Если тело колокола не блестит, а рама блестит — blockEntityId не пришёл.
  9.45.37: убраны опции TERRAIN_LAMP_GLOSS и TERRAIN_BELL_GLOSS (из defines, screen, sliders, lang). Лампа (mat 10) и колокол (mat 11) в terrain: glossK=1, reflK=1 -> не зависят ни от Wood&Stone Gloss, ни от Metal&Gloss Reflections (даже при 0). Условие блока отражения: TERRAIN_REFLECTION>0 || TERRAIN_SPECULAR_MAP>0; SSR_ON теперь = TERRAIN_SSR && TERRAIN_SPECULAR_MAP (без REFLECTION). gbuffers_block: BELL_ON = TERRAIN_SPECULAR_MAP>0, свои дефайны REFLECTION/BELL_GLOSS удалены. Для остальных блоков reflK=ползунок, при 0 Wv=0.
