fix(render): fade MSH portals with camera distance
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s

This commit is contained in:
Valentin Popov committed 2026-10-31 18:01:35 +04:00
1 parent 09fcd35023
commit c31e5b7342
7 files changed
+382 -44

No files matched your search

+6 -19
View File
@@ -45,26 +45,13 @@ MSH-запрос со свободной preview-камерой; это не п
стратегической и следящей камерами не подтверждено
([MSH](../reference/msh.md)).
Для MSH без потока цветов type 16 подтверждён только один постоянный alpha
override для диапазонов с CPU-цветом и raw-флагом `Batch20` `0x0008`: GOG
`Terrain.dll`, SHA-256
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`, RVA
`0x1B0F0`, задаёт alpha `0`, если установлен bit `0x0040` и сброшен `0x0010`.
Это покрывает `0x0148`; `0x0108`, `0x0118` и `0x0058` сохраняют alpha MAT0,
причём в `0x0058` bit `0x0010` имеет приоритет. Поток type 16 или отсутствие
`0x0008` исключают override. Проверка заводской сцены с фиксированной нативной
камерой подтвердила на одном кадре входа восстановление X-образного рисунка
двери, который виден и в оригинале; прежний Vulkan-readback показывал на этом
месте сплошной чёрный прямоугольник. Сравнение выполнено при времени сцены
2000 мс и трёх кадрах, запуск с Vulkan validation завершился без предупреждений
и ошибок. Это подтверждает только структуру проёма в этой сцене: правильность
освещения и полный попиксельный паритет не установлены.
Кривые alpha и метрика расстояния порталов реализованы для MSH без type 16
([описание кадра](../reference/render-frame.md#прозрачность-порталов-msh)). Native CPU clipping может выбрать другую первую вершину;
это приближение явно считается как `portal_fade_packet_selection_approx`.
Общее fade-поведение по расстоянию в preview не реализовано. Открыты точная
метрика расстояния, выбор первого CPU-принятого треугольника диапазона и
эквивалентность frustum/culling-отбора оригинала; эти вопросы нельзя вывести из
захвата заводской двери. Данные потока type 16 ещё не декодированы, поэтому
правило выше относится только к MSH-диапазонам без этого потока цветов.
Данные type 16 ещё не декодированы. Внутренний ракурс «Конструктора» после
настоящего входа игрока подтверждает исчезновение чёрной поверхности в проходе;
для всей приёмки R2 ещё нужны пары обеих миссий на трёх дистанциях.
Закрывающий эксперимент: запустить оригинал в совместимой Windows/DirectX
среде, перехватить DirectDraw/Direct3D calls и surface flips, сохранить state
+30
View File
@@ -41,6 +41,36 @@ geometry и projected shadows пересобираются для нового
выбирается после успешного представления кадра; пауза нулевого drawable не
добавляет время.
## Прозрачность порталов MSH
GOG `Terrain.dll` (SHA-256
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`),
RVA `0x1B0F0`, заменяет diffuse alpha пакета без type 16 с batch bit `0x0008`.
При `0x0010` аргумент кривой — `sqrt(distance)`, границы — `2.6 / fov` и
`7.7999997 / fov`, наклон — `fov / (7.7999997 - 2.6)`. Без этого бита
`0x0040` задаёт ноль; иначе границы — `75 * 1.3 / fov`, `95 * 1.3 / fov`,
наклон — `fov / (95 * 1.3 - 75 * 1.3)`. До ближней границы alpha равна нулю,
после дальней — единице. Внутри перехода alpha равна произведению смещения от
ближней границы на наклон. Это замена alpha MAT0, а не дополнительный множитель.
Метод расстояния `0x246A0` через `0x247B0` читает первую индексированную
вершину пакета, преобразует её в мир и вычисляет квадрат расстояния до камеры.
Текущий Ngi32 dispatch `FastProc+0x2C` указывает на RVA `0x1D6D0`:
`RSQRTSS` возвращает приближение обратного корня, которое умножается на квадрат
расстояния. Получается приближённое евклидово расстояние; дополнительный `FSQRT`
ветви `0x0010` выполняется уже над ним. Хеш Ngi32 —
`bab9840d94f4e4e74ffc26677724fa896cf4823845504d09a9e025f80016edf5`.
Скаляр камеры в шестом float getter `0x4F5F0` и поле CShade `+0xBB4`
проверены в работающем оригинале: оба содержат текущий горизонтальный FOV.
`legacy_msh_portal_alpha` хранит кривую в `fparkan-render`. Приложение пока
берёт первую индексированную вершину своего диапазона и обычный `sqrt`,
поэтому выбор вершины после native CPU clipping и точность `RSQRTSS` не
воспроизводятся. Счётчик `render_coverage portal_fade_packet_selection_approx`
показывает число таких диапазонов. Поток type 16 сохраняет прежний отдельный
путь и ещё не декодирован. Это ограничивает приёмку на частично отсечённых
порталах и не позволяет считать интерьер принятой эталонной сценой.
## Элемент отрисовки
Подготовленный элемент отрисовки содержит:
+25
View File
@@ -499,6 +499,31 @@ Material manager кэширует разобранный MAT0 и texture handles
лучше вычислять на экземпляр материала, если random offset или локальное время
различаются между объектами; immutable phase data остаются общими.
### Почему проём становится прозрачным вблизи
Портал здания — поверхность, которая закрывает интерьер издалека и постепенно
исчезает при приближении камеры. Если оставить ей постоянную непрозрачность,
вместо окна или перехода получится тёмный прямоугольник. Прозрачность материала
здесь заменяется значением, вычисленным для всего пакета треугольников; alpha
текстуры продолжает участвовать в смешивании.
Для MSH без потока цветов type 16 правило включает флаг batch `0x0008`.
В обычной ветви при горизонтальном FOV `1.3` поверхность прозрачна до расстояния
75 и непрозрачна после 95; между ними alpha растёт линейно. При другом FOV обе
границы умножаются на `1.3 / FOV`. Расстояние берётся до первой вершины первого
принятого треугольника, а не до центра здания.
Флаг `0x0010` выбирает другую кривую: сравнивается квадратный корень уже
вычисленного расстояния, границы равны `2.6 / FOV` и `7.7999997 / FOV`.
Например, при FOV `1.04` поверхность на расстоянии 25 имеет alpha примерно
`0.5`, а на расстоянии 5 полностью исчезает. Флаг `0x0040` без `0x0010`
сразу задаёт нулевую alpha; при наличии обоих побеждает `0x0010`.
FParkan пересчитывает эту alpha при каждом обновлении камеры, после анимации
модели. Нулевое значение временно выключает диапазон индексов; при удалении
камеры диапазон восстанавливается. Подробности оригинального вычисления и
пока приближённого выбора вершины приведены в [описании кадра](../reference/render-frame.md#прозрачность-порталов-msh).
## Texm: текстуры, mip-уровни и атласы
`Texm` -- основной формат изображений. Он хранится в `Textures.lib`,