diff options
Diffstat (limited to 'docs/reference/render-frame.md')
| -rw-r--r-- | docs/reference/render-frame.md | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index df3f248..ebe3971 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -6,6 +6,11 @@ ## Порядок кадра +Сам рельеф образует полноценную графическую сцену: список размещённых объектов +может быть пустым. Наличие MSH-компонентов объектов не является условием +отрисовки карты. Проверочные TMA без объектов позволяют отдельно загружать +карты ресурсов, для которых в установленной игре нет штатной миссии. + ```text системные сообщения и ввод -> расчёт симуляции @@ -63,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 ещё не декодирован. Проверка краевого окна не закрывает остальные +внутренние ракурсы завода. ## Дистанционная кривая тумана @@ -146,9 +162,8 @@ raw-флаге `Batch20` `0x0008` получает переопределениÐ материал; alpha `0` временно задаёт число индексов `0`, а при очистке переопределения исходное число индексов восстанавливается. -Fade обновляется с камерой каждый кадр. Открыт выбор первой принятой вершины -после native CPU clipping: приложение пока берёт первую индексированную -вершину диапазона и считает это приближение в `render_coverage`. +Fade обновляется с камерой каждый кадр и сохраняет исходную опорную вершину +диапазона, в том числе когда часть окна выходит за границу экрана. В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на @@ -213,6 +228,22 @@ RVA `0x4EBE0` использует соглашение о вызовах `__std `REFLECTION_SHIFTED`. Это свидетельство ABI фабрики, а не восстановленный контракт матрицы вида или проекции. +## Представление готового кадра + +Vulkan сохраняет явно выбранный режим, если поверхность его поддерживает. +Приложение предпочитает MAILBOX: готовый новый кадр заменяет ожидающий, +а показ остаётся привязан к развёртке. При отсутствии MAILBOX выбирается +IMMEDIATE, затем FIFO. IMMEDIATE допускает разрывы изображения, зато не +навязывает ожидание вертикальной развёртки; FIFO остаётся запасным режимом. +Семантика режимов описана в [спецификации Vulkan](https://docs.vulkan.org/refpages/latest/refpages/source/VkPresentModeKHR.html). + +Оконная ветка GOG Ngi32.dll (SHA-256 из [таблицы модулей](original-binaries.md)) +по RVA `0x6E1B` вызывает `IDirectDrawSurface7::Blt` с `DDBLT_WAIT`. +Эта ветка наблюдалась при нативных захватах. Флаг ждёт готовности блиттера, +а не задаёт интервал развёртки — см. [описание Microsoft](https://learn.microsoft.com/en-us/windows/win32/api/ddraw/nf-ddraw-idirectdrawsurface7-blt). +Современный композитор и драйвер всё равно могут влиять на фактический показ; +это правило выбора API, а не гарантия одинаковой задержки двух движков. + ## Предпросмотр по захвату камеры D3D7 `fparkan-game --legacy-camera-capture <json>` принимает матрицу камеры @@ -348,3 +379,9 @@ D3D7 в `fparkan-render`, а затем один раз меняет знак в каналов не определяет. Последовательность не содержит структурированных ID видимых объектов, списка элементов отрисовки, ключей конвейера, матриц или хэшей промежуточных буферов. + +При преобразовании кадра в PNG сохраняется исходный RGB, а прозрачность +выключается: окно показывает готовое непрозрачное изображение. Альфа-канал +GPU может содержать результат смешивания поверхностей; повторное применение +его к готовому цвету затемнило бы кадр ещё раз. Поэтому конвертер и сборщик +сравнительных пар игнорируют эту альфу, а raw-файл сохраняют без изменений. |
