diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-30 17:28:45 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-30 17:28:45 +0300 |
| commit | 2e5058078c586e2dd0dcf3bbcf149223e5f0daeb (patch) | |
| tree | 878cccd811aa54fa2046928b45e6cc9c435d13bc /docs/reference | |
| parent | bce6e3b2639d8771e50e2f907cdfa110671717b1 (diff) | |
| download | fparkan-2e5058078c586e2dd0dcf3bbcf149223e5f0daeb.tar.xz fparkan-2e5058078c586e2dd0dcf3bbcf149223e5f0daeb.zip | |
fix(render): preserve native world viewport depth range
Diffstat (limited to 'docs/reference')
| -rw-r--r-- | docs/reference/environment-effects.md | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md index 42e203c..46a456a 100644 --- a/docs/reference/environment-effects.md +++ b/docs/reference/environment-effects.md @@ -256,14 +256,30 @@ Vertex shader пропускает `clip_from_world` для строк солнÑ остаются отдельным путём. Материал экранного quad не освещается, vertex fog отключён, а sky far-depth bit к нему не применяется. -Native `z = 0.999` не означает, что спрайт гарантированно лежит за любой -поверхностью. Vulkan использует `LESS_OR_EQUAL` и не записывает depth для -прозрачного ряда. При near `0.5`, far `700` мировая поверхность на расстоянии -`320` получает depth -`700 / (700 - 0.5) * (1 - 0.5 / 320) ≈ 0.999151`; поэтому экранный `0.999` -чуть ближе этой поверхности и проходит depth test перед ней. Это фиксированное -native значение сохраняется для совместимости, но само по себе не обещает -окклюзию солнца всей геометрией местности. +Для мировой геометрии +оригинал задаёт viewport `MinZ = 0.1`, `MaxZ = 0.99`: после отсечения +проекционная глубина отображается в этот диапазон: + +```text +world_depth = 0.1 + (0.99 - 0.1) * (clip_z / clip_w) +``` + +Даже дальняя гора получает глубину не больше `0.99` и закрывает экранный +диск с `z = 0.999`. Если оставить мировой диапазон `0–1`, при near `0.5` +и far `700` поверхность дальше примерно `292` единиц окажется позади диска: +солнце начнёт просвечивать сквозь неё при движении камеры. Одного переноса +нативного `z` в экранные вершины недостаточно. + +В Vulkan диапазон задаётся динамическим viewport отдельно для мировых +пакетов; экранные TL и фоновые sky-пакеты сохраняют диапазон `0–1`. +Матрица проекции и плоскости отсечения при этом не меняются. Константы +мирового профиля записывает GOG `Terrain.dll` RVA `0x27422–0x27452` из таблицы +`0x65088/0x6508C/0x650A0/0x650A4` (near, far, MinZ, MaxZ). GOG `Ngi32.dll` +RVA `0x7170`, участок `0x71E7–0x723C`, копирует MinZ/MaxZ в renderer +`+0x30/+0x34` и передаёт их `IDirect3DDevice7::SetViewport`; сборки указаны в +[таблице бинарников](original-binaries.md). Нативные значения этих двух полей +имеют биты `0x3DCCCCCD` и `0x3F7D70A4`. + ## Геометрия визуальных FX-команд |
