fix(render): preserve native world viewport depth range
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:
3 files changed
+88
-18
No files matched your search
@@ -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-команд
|
||||
|
||||
|
||||
Reference in new issue
Block a user