fix(render): match native packet distance approximation
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m15s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m15s
This commit is contained in:
7 files changed
+188
-40
No files matched your search
@@ -50,9 +50,10 @@ MSH-запрос со свободной preview-камерой; это не п
|
||||
стратегической и следящей камерами не подтверждено
|
||||
([MSH](../reference/msh.md)).
|
||||
|
||||
Кривые alpha и метрика расстояния порталов реализованы для MSH без type 16
|
||||
([описание кадра](../reference/render-frame.md#прозрачность-порталов-msh)). Native CPU clipping может выбрать другую первую вершину;
|
||||
это приближение явно считается как `portal_fade_packet_selection_approx`.
|
||||
Кривые alpha и опорная вершина порталов сверены для MSH без type 16
|
||||
([описание кадра](../reference/render-frame.md#прозрачность-порталов-msh)). Native `RSQRTSS`
|
||||
воспроизводится на x86-64; другие архитектуры и нулевая дистанция используют
|
||||
явные `packet_distance_native_rsqrt_unsupported` / `packet_zero_distance_fallback`.
|
||||
|
||||
Данные type 16 ещё не декодированы и считаются в `msh_type16_colors_unsupported`;
|
||||
в статических сценах 29 миссий GOG (1736 загрузок моделей) этот поток отсутствует.
|
||||
|
||||
@@ -68,13 +68,24 @@ RVA `0x1B0F0`, заменяет diffuse alpha пакета без type 16 с bat
|
||||
Скаляр камеры в шестом 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 сохраняет прежний отдельный
|
||||
путь и ещё не декодирован. Это ограничивает приёмку на частично отсечённых
|
||||
порталах и не позволяет считать интерьер принятой эталонной сценой.
|
||||
`legacy_msh_portal_alpha` хранит кривую в `fparkan-render`. Её опорная вершина
|
||||
принадлежит входному пакету: выбирать вместо неё первую видимую точку нельзя.
|
||||
В живом краевом ракурсе AutoDemo первая вершина окна находится за правой
|
||||
границей viewport (`NDC x ≈ 1,048`), а следующая — внутри (`x ≈ 0,815`).
|
||||
Оригинал всё равно использует первую: расстояние `106,74783` даёт alpha
|
||||
`0,51991343`. Выбор следующей изменил бы alpha примерно на `0,026`.
|
||||
Передача пакета renderer-у происходит после записи этой alpha.
|
||||
|
||||
Адаптер изолирует инструкцию `RSQRTSS`; на x86-64 расстояние и alpha этого
|
||||
ракурса совпадают с оригиналом побитно. Обычный `sqrt` давал alpha
|
||||
`0,5196797`: при упаковке прозрачности этого достаточно для отличия отдельных
|
||||
пикселей. Прежнее предположение о выборе вершины после clipping и связанный
|
||||
счётчик `portal_fade_packet_selection_approx` удалены. На других архитектурах
|
||||
сохраняется переносимый корень с явным `packet_distance_native_rsqrt_unsupported`;
|
||||
совпадение камеры с вершиной использует нулевую дистанцию и
|
||||
`packet_zero_distance_fallback` вместо native `0 × infinity`.
|
||||
Поток type 16 ещё не декодирован. Проверка краевого окна не закрывает остальные
|
||||
внутренние ракурсы завода.
|
||||
|
||||
## Дистанционная кривая тумана
|
||||
|
||||
@@ -151,9 +162,8 @@ raw-флаге `Batch20` `0x0008` получает переопределени
|
||||
материал; alpha `0` временно задаёт число индексов `0`, а при очистке
|
||||
переопределения исходное число индексов восстанавливается.
|
||||
|
||||
Fade обновляется с камерой каждый кадр. Открыт выбор первой принятой вершины
|
||||
после native CPU clipping: приложение пока берёт первую индексированную
|
||||
вершину диапазона и считает это приближение в `render_coverage`.
|
||||
Fade обновляется с камерой каждый кадр и сохраняет исходную опорную вершину
|
||||
диапазона, в том числе когда часть окна выходит за границу экрана.
|
||||
|
||||
В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков
|
||||
явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на
|
||||
|
||||
@@ -510,8 +510,11 @@ Material manager кэширует разобранный MAT0 и texture handles
|
||||
Для MSH без потока цветов type 16 правило включает флаг batch `0x0008`.
|
||||
В обычной ветви при горизонтальном FOV `1.3` поверхность прозрачна до расстояния
|
||||
75 и непрозрачна после 95; между ними alpha растёт линейно. При другом FOV обе
|
||||
границы умножаются на `1.3 / FOV`. Расстояние берётся до первой вершины первого
|
||||
принятого треугольника, а не до центра здания.
|
||||
границы умножаются на `1.3 / FOV`. Расстояние берётся до первой индексированной
|
||||
вершины входного пакета, а не до центра здания. Эта точка может находиться за
|
||||
экраном: видимая часть окна всё равно сохраняет её прозрачность. Если при повороте
|
||||
камеры выбирать новую видимую точку, окно начнёт менять прозрачность без движения
|
||||
игрока.
|
||||
|
||||
Флаг `0x0010` выбирает другую кривую: сравнивается квадратный корень уже
|
||||
вычисленного расстояния, границы равны `2.6 / FOV` и `7.7999997 / FOV`.
|
||||
@@ -521,8 +524,9 @@ Material manager кэширует разобранный MAT0 и texture handles
|
||||
|
||||
FParkan пересчитывает эту alpha при каждом обновлении камеры, после анимации
|
||||
модели. Нулевое значение временно выключает диапазон индексов; при удалении
|
||||
камеры диапазон восстанавливается. Подробности оригинального вычисления и
|
||||
пока приближённого выбора вершины приведены в [описании кадра](../reference/render-frame.md#прозрачность-порталов-msh).
|
||||
камеры диапазон восстанавливается. Расстояние использует тот же приближённый
|
||||
обратный корень, что и оригинал: округление влияет на записанную alpha.
|
||||
Подробности вычисления приведены в [описании кадра](../reference/render-frame.md#прозрачность-порталов-msh).
|
||||
|
||||
## Texm: текстуры, mip-уровни и атласы
|
||||
|
||||
|
||||
Reference in new issue
Block a user