fix(render): draw translucent water into planar reflections
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
This commit is contained in:
7 files changed
+112
-9
No files matched your search
@@ -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`; сама семантика оставшихся специальных проходов ещё не установлена.
|
||||
|
||||
@@ -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; категория их не меняет.
|
||||
@@ -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`. Сторона квадратной
|
||||
|
||||
Reference in new issue
Block a user