fix(render): preserve native world viewport depth range
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s

This commit is contained in:
Valentin Popov committed 2026-10-30 18:28:45 +04:00
1 parent bce6e3b263
commit 2e5058078c
3 files changed
+88 -18

No files matched your search

+24 -8
View File
@@ -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-команд