aboutsummaryrefslogtreecommitdiff
path: root/docs/reference/render-frame.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/render-frame.md')
-rw-r--r--docs/reference/render-frame.md41
1 files changed, 26 insertions, 15 deletions
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md
index b2a6a93..df3f248 100644
--- a/docs/reference/render-frame.md
+++ b/docs/reference/render-frame.md
@@ -85,9 +85,13 @@ RVA `0x1B0F0`, заменяет diffuse alpha пакета без type 16 с bat
квадраты границ по этому наблюдению. GLSL вычисляет квадрат расстояния вершины,
после чего растеризатор интерполирует коэффициент по треугольнику.
`native_fog.effective.sink_rgb` совпадает с `sky.packed[1]`, нижней границей
-освещения CShade. Это не подтверждает значение GPU fog color. Приложение пока
-сохраняет цвет экранного горизонта; выбор цвета и проходов требует отдельной
-проверки GPU-состояния.
+освещения CShade. Обычный GPU fog color подтверждён отдельно: `CSky::Render`
+по RVA `0x48341` задаёт renderer default из цвета горизонта. В живом замере
+`0xFF404064` дошёл до `IDirect3DDevice7::SetRenderState(34)` в том же игровом
+тике. В другом ракурсе палитра `[0xFFA8A5CE, 0xFFABA9D5, 0xFFBAA9D5,
+0xFFABA9D5]` дала default `0xFFA9A7D1`. Это не покрывает временные изменения
+цвета отдельных проходов: например, native render path устанавливает чёрный
+цвет и затем восстанавливает сохранённый.
Выбор проходов по native shade-state пока приближён общим туманом мира и
считается как `render_coverage fog_pass_eligibility_approx`.
@@ -134,21 +138,17 @@ RVA `0xF6E0`, преобразует направление текущей маÑ
глубину. За фиксированными диапазонами окружения сохраняются их явные состояния.
Для MSH без потока цветов type 16 диапазон, цвет которого вычисляет CPU, при
-raw-флаге `Batch20` `0x0008` получает переопределение alpha только в одном
-подтверждённом случае. В GOG `Terrain.dll` с SHA-256
-`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` проверка
-по RVA `0x1B0F0` задаёт alpha `0`, когда установлен bit `0x0040` и сброшен
-`0x0010`; поэтому для `0x0148` alpha равна нулю. Для `0x0108` и `0x0118`
-превью сохраняет alpha MAT0; для `0x0058` действует приоритет bit `0x0010`,
-также оставляя alpha MAT0. При наличии type 16 или отсутствии `0x0008`
-переопределения нет. Оно относится к одному draw range и не меняет общий
+raw-флаге `Batch20` `0x0008` получает переопределение alpha по
+[дистанционной кривой портала](#прозрачность-порталов-msh). Bit `0x0010`
+имеет приоритет; иначе bit `0x0040` задаёт нулевую alpha, а оставшаяся
+ветвь использует границы 75/95 с поправкой на FOV. При наличии type 16 или
+отсутствии `0x0008` переопределения нет. Оно относится к одному draw range и не меняет общий
материал; alpha `0` временно задаёт число индексов `0`, а при очистке
переопределения исходное число индексов восстанавливается.
-Общий fade по расстоянию пока не реализован. Открыты точная метрика расстояния,
-выбор первого CPU-принятого треугольника диапазона и эквивалентность frustum- и
-culling-отбору оригинала. Поэтому состояния `0x0108` и `0x0118` оставляют alpha
-MAT0, пока эти входные данные не установлены.
+Fade обновляется с камерой каждый кадр. Открыт выбор первой принятой вершины
+после native CPU clipping: приложение пока берёт первую индексированную
+вершину диапазона и считает это приближение в `render_coverage`.
В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков
явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на
@@ -225,6 +225,17 @@ RVA `0x4EBE0` использует соглашение о вызовах `__std
`right - left` на `bottom - top`. Размер окна превью закреплён: если при
запуске или после ненулевого изменения окна физический размер не совпадает с
заданным, приложение завершает работу, а не растягивает изображение.
+
+Проекция во время рисования может отличаться от восстановленного состояния
+камеры после обхода мира. В GOG у `CStridedPrimitive::RenderVB` (Terrain RVA
+`0x1D110`) renderer содержит `near = 0.5`, а на границе World3D RVA `0x13CE4`
+уже `near = 5`. Поэтому захват отдельно сохраняет `geometry_projection` при
+первом вызове геометрии с той же мировой матрицей камеры. Поток, поколение,
+renderer, viewport, far и FOV сверяются с последующей границей; только
+подтверждённая запись используется при воспроизведении. Иначе пол в трёх
+единицах от камеры может исчезнуть из-за чужой ближней плоскости. Старые JSON
+без этой записи сохраняют прежнее поведение с явным счётчиком
+`captured_projection_unverified`; их нужно переснять для проверки близких поверхностей.
Сравнивайте результат с фрагментом исходного PNG по прямоугольнику
`[left, top, right, bottom]`. В этом режиме `FreeFlightCamera` не создаётся,
но при повторной отрисовке обновляются окружение и проецируемые тени для