aboutsummaryrefslogtreecommitdiff
path: root/docs/reference/environment-effects.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/environment-effects.md')
-rw-r--r--docs/reference/environment-effects.md32
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-команд