From 923ef2aad6b7284d745756d938b90965bb92a110 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sun, 1 Nov 2026 12:30:17 +0400 Subject: fix(render): match native packet distance approximation --- docs/appendices/knowledge-boundaries.md | 7 ++++--- docs/reference/render-frame.md | 30 ++++++++++++++++++++---------- docs/tomes/05-render.md | 12 ++++++++---- 3 files changed, 32 insertions(+), 17 deletions(-) (limited to 'docs') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index a60fa68..04dc822 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -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 загрузок моделей) этот поток отсутствует. diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index 7adc4e6..ebe3971 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -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 обновляется с камерой каждый кадр и сохраняет исходную опорную вершину +диапазона, в том числе когда часть окна выходит за границу экрана. В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 4aba919..266cb47 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -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-уровни и атласы -- cgit v1.2.3