diff options
Diffstat (limited to 'docs/reference')
| -rw-r--r-- | docs/reference/environment-effects.md | 9 | ||||
| -rw-r--r-- | docs/reference/render-frame.md | 27 |
2 files changed, 36 insertions, 0 deletions
diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md index f3ecfb4..677c159 100644 --- a/docs/reference/environment-effects.md +++ b/docs/reference/environment-effects.md @@ -420,6 +420,15 @@ FX-команды используют общий preview clock и ограниÑ mode 0 оставляет фазу равной нулю, mode 1 вычисляет `elapsed / duration` без зажатия, mode 2 повторяет цикл. Header flags `0x200` и `0x20` преобразуют эту фазу; command path `0x8120` зажимает результат только после преобразований. +В [эталонной Effect.dll](original-binaries.md) RVA `0x5C60` режимы 4–17 +читают состояние владельца или провайдера; режим 14 тоже входит в эту группу. +Пропуски при расширении выбранных начальных Control-строк учитываются по +командам: `control_fx_requires_game_state` для этих режимов и +`control_fx_unsupported` для остальных непреобразованных команд. Диагностика +сохраняет причину, ресурс, объект, компонент, строку и номер команды. +`control_fx_invalid_documents` отдельно считает неразобранные FXID, где число +команд неизвестно. Счётчики суммируются по компонентам миссии; они не заменяют +учёт ещё не выбранных Control-групп и условных строк в фазе G. Effect renderer проверяет header bit `0x800` только при render selector 0; native AniMesh component path был захвачен с selector 1, поэтому preview использует selector 1 и не подавляет такие visual commands. diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index df3f248..7adc4e6 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -6,6 +6,11 @@ ## Порядок кадра +Сам рельеф образует полноценную графическую сцену: список размещённых объектов +может быть пустым. Наличие MSH-компонентов объектов не является условием +отрисовки карты. Проверочные TMA без объектов позволяют отдельно загружать +карты ресурсов, для которых в установленной игре нет штатной миссии. + ```text системные сообщения и ввод -> расчёт симуляции @@ -213,6 +218,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 +369,9 @@ D3D7 в `fparkan-render`, а затем один раз меняет знак в каналов не определяет. Последовательность не содержит структурированных ID видимых объектов, списка элементов отрисовки, ключей конвейера, матриц или хэшей промежуточных буферов. + +При преобразовании кадра в PNG сохраняется исходный RGB, а прозрачность +выключается: окно показывает готовое непрозрачное изображение. Альфа-канал +GPU может содержать результат смешивания поверхностей; повторное применение +его к готовому цвету затемнило бы кадр ещё раз. Поэтому конвертер и сборщик +сравнительных пар игнорируют эту альфу, а raw-файл сохраняют без изменений. |
