diff options
| author | Valentin Popov <valentin@popov.link> | 2026-11-01 13:39:37 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-11-01 13:39:37 +0300 |
| commit | 55e98d7ff6224aa3bf4b5d4260a594705ee2133f (patch) | |
| tree | 828a6ea2ad0ebf7cc127e20fb8a0a03673636a35 /docs | |
| parent | bbd31fc25336d6a2e6c5927ad4d7101696f8bd78 (diff) | |
| download | fparkan-55e98d7ff6224aa3bf4b5d4260a594705ee2133f.tar.xz fparkan-55e98d7ff6224aa3bf4b5d4260a594705ee2133f.zip | |
fix(render): draw translucent water into planar reflectionstrunk
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 1 | ||||
| -rw-r--r-- | docs/reference/render-frame.md | 17 | ||||
| -rw-r--r-- | docs/tomes/05-render.md | 15 |
3 files changed, 33 insertions, 0 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index ed821e4..f0c0b0c 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -78,6 +78,7 @@ MSH-запрос со свободной preview-камерой; это не пÐ log на минимальных сценах с одним типом материала. Горизонтальные грани Land.msh с флагом `0x20000` используют исходную карту Du/Dv, окно shifted-камеры и квадратный размер текстуры, проверенные исполнением DLL. Диапазон глубины, небо/туман/FX основного вида и соответствие размеров при обрезанном capture остаются приближениями: `planar_reflection_render_context_approx`; неперспективная камера API использует обычное зеркало. +Обычный полупрозрачный слой воды внутри отражения восстановлен по живым пакетам и таблицам Ngi32. Ближняя вода в согласованных кадрах ещё отличается по яркости; полный контекст отражённого вида остаётся открытым. Raw queue clock задаёт фазу волн отдельно от времени суток и sky elapsed; старые захваты без него считаются в `captured_water_phase_unverified`. Один target отражает ближайшую активную высоту воды; остальные высоты и неплоские грани считаются в `planar_reflection_other_planes_unsupported` и `planar_reflection_nonplanar_unsupported` и сохраняют обычный terrain shader. `terrain_face8_pipeline_unverified` теперь считает только исходные грани с `0x8` без `0x20000`; сама семантика оставшихся специальных проходов ещё не установлена. diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index b3c0be5..4ee0cc3 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -404,3 +404,20 @@ D3D7 в `fparkan-render`, а затем один раз меняет знак в GPU может содержать результат смешивания поверхностей; повторное применение его к готовому цвету затемнило бы кадр ещё раз. Поэтому конвертер и сборщик сравнительных пар игнорируют эту альфу, а raw-файл сохраняют без изменений. + +### Вода внутри отражённого вида + +В эталонных DLL из [таблицы сборки](original-binaries.md) Terrain RVA +`0x28A50` задаёт водному пакету material alpha `0,1` и packet category `4`, +когда уже строится отражение. Живой CShade-захват подтверждает одинаковые +водные вершины при `eye_z=115` и `185`, высоте воды `150`: отражённые пакеты +имеют alpha `0,1`, основные — `1`. Это общий проход водных граней, +а не поправка цвета карты. + +Ngi32 mode 7, descriptors RVA `0x36C14` / `0x36C40`, содержит одну текстурную +стадию: `COLOR = TEXTURE × DIFFUSE`, `ALPHA = DIFFUSE`. Packet category 4 +в таблице RVA `0x346E0 + category × 40` включает SRCALPHA / INVSRCALPHA +и альфа-тест GREATEREQUAL. Это отдельная таблица от MAT0 categories. +Depth enable/write передаются из байтов пакета `+0x12C/+0x12D` отдельно; +в захваченном водном проходе оба равны `1`. Начальные ZFUNC=LESSEQUAL, +ALPHAREF=1 задаются конструктором Ngi32; категория их не меняет. diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 8c059f2..387db11 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -1197,6 +1197,21 @@ Rust-тест отдельно проверяет углы водоёма и гÑ водоёма с добавленным смещением волн. Для неперспективной камеры API остаётся обычное зеркало с экранными координатами. +В отражённом виде видна и сама вода. После остального мира оригинал рисует +её обычной текстурой с непрозрачностью `0,1`; этот слой приглушает отражение +и сохраняет оттенок поверхности. Подготовка ландшафта задаёт такую альфу +и отдельную категорию пакета, когда уже строится отражение. Живой захват +подтверждает те же водные вершины у зеркальной камеры и у основной камеры: +в первом случае альфа равна `0,1`, во втором — `1`. + +Внутренний водный слой использует texture mode 7: цвет текстуры умножается +на diffuse, а альфа берётся только из diffuse. Затем обычное смешивание +`src × alpha + dst × (1 − alpha)` соединяет его с отражённым миром. +Проверка и запись глубины сохраняются, альфа-тест пропускает значения +не меньше `1/255`. FParkan воспроизводит этот проход после отражённой сцены +и читает исходную текстуру материала, поэтому изображение отражения +можно закончить до его чтения основной камерой. + Размер изображения отражения выбирается отдельно от размера основного кадра. Terrain.dll в конструкторе CShade (RVA `0x278E0`, цикл с `0x27FC7`) берёт ширину и высоту renderer через Ngi32.dll RVA `0x7FB0`. Сторона квадратной |
