fix(render): fade MSH portals with camera distance
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
7 files changed
+382
-44
No files matched your search
@@ -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
|
||||
|
||||
@@ -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 сохраняет прежний отдельный
|
||||
путь и ещё не декодирован. Это ограничивает приёмку на частично отсечённых
|
||||
порталах и не позволяет считать интерьер принятой эталонной сценой.
|
||||
|
||||
## Элемент отрисовки
|
||||
|
||||
Подготовленный элемент отрисовки содержит:
|
||||
|
||||
@@ -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`,
|
||||
|
||||
Reference in new issue
Block a user