fix(render): animate sky layers on the native UV clock
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
This commit is contained in:
8 files changed
+285
-13
No files matched your search
@@ -65,6 +65,10 @@ MSH-запрос со свободной preview-камерой; это не п
|
||||
обхода мира, которое может отсекать близкие поверхности. Это отмечается
|
||||
`captured_projection_unverified`; для приёмки таких поверхностей нужен новый захват.
|
||||
|
||||
Захваты без `sky_uv_clock` не подтверждают начальное положение облаков,
|
||||
звёзд и фона. Replay использует elapsed clock приложения и считает
|
||||
это как `captured_sky_phase_unverified`; для приёмки неба нужен новый захват.
|
||||
|
||||
Закрывающий эксперимент: запустить оригинал в совместимой Windows/DirectX
|
||||
среде, перехватить DirectDraw/Direct3D calls и surface flips, сохранить state
|
||||
log на минимальных сценах с одним типом материала.
|
||||
|
||||
@@ -149,6 +149,31 @@ gradient и clouds row 2. Для nebula/stars/clouds используются UV
|
||||
directional RGB из `sky.packed[0]`. Это четыре фиксированных pass, а не три
|
||||
независимых цветных слоя.
|
||||
|
||||
Все три текстурных слоя движутся. Обновление GOG `CSky`
|
||||
(`Terrain.dll`, RVA `0x48B90`, запись UV `0x4942A–0x495B7`;
|
||||
[сборка и SHA-256](original-binaries.md)) берёт разность текущего `u32` clock
|
||||
и сохранённого поля объекта `+8` с переполнением. Это отдельные миллисекунды
|
||||
жизни неба, а не абсолютная фаза суток из SKE.
|
||||
|
||||
| Слой | Период | Добавка к исходным UV |
|
||||
|---|---:|---|
|
||||
| Фон | 300 000 мс | одинаковый сдвиг U и V |
|
||||
| Звёзды | 100 000 мс | одинаковый сдвиг U и V |
|
||||
| Облака | 50 000 мс | сдвиг только U |
|
||||
|
||||
Добавка равна остатку от деления elapsed clock на период, умноженному на
|
||||
нативный коэффициент `f32` (`3.3333333e-6`, `1e-5`, `2e-5`). Вершинные UV
|
||||
каждый раз вычисляются от позиции купола заново; накопление приращений
|
||||
создавало бы дрейф. `SkyMesh::update_uvs` получает текущие миллисекунды кадра
|
||||
и сохраняет геометрию купола. В работающем оригинале проверены UV всех трёх
|
||||
слоёв, включая разность clock с переполнением.
|
||||
|
||||
Захват сохраняет `sky_uv_clock` на входе в рендер неба, проверяя его по
|
||||
фактическим UV вершины зенита и clock того же кадра. Replay удерживает эту
|
||||
фазу вместе с фазой суток. Без такого поля текстуры движутся по elapsed clock
|
||||
приложения; начальная фаза оригинала неизвестна и явно считается как
|
||||
`captured_sky_phase_unverified`.
|
||||
|
||||
Цвет первого screen-gradient и последнего пояса вычисляет
|
||||
`SkyFrame::screen_gradient(yaw_radians, glare_rgb_delta)`. Native `CSky` сначала
|
||||
округляет `(yaw + pi) * 180 / pi` режимом nearest-even, выбирает сектор
|
||||
|
||||
@@ -1187,10 +1187,15 @@ drawable размер `(right - left) × (bottom - top)` и отклоняет
|
||||
`FreeFlightCamera` в этом режиме не создаётся, но redraw продолжает обновлять
|
||||
environment и projected shadows от captured camera. Перед environment update и
|
||||
его audio events listener получает position, forward и up captured camera;
|
||||
начальная сортировка world draw использует её же position. Phase capture может
|
||||
начальная сортировка world draw использует её же position. Облака в обычном
|
||||
запуске движутся с отдельным 50-секундным циклом UV; фон и звёзды имеют свои
|
||||
периоды. Изменение цвета неба по расписанию не заменяет это движение.
|
||||
Phase capture может
|
||||
содержать наблюдаемый mission path и проверенный `atmosphere_seconds`; viewer
|
||||
использует эту абсолютную фазу по умолчанию, если не указан явный CLI override,
|
||||
и удерживает sample атмосферы на ней через readback frames. Фазы FX следуют
|
||||
и удерживает sample атмосферы на ней через readback frames. Дополнительный
|
||||
`sky_uv_clock` фиксирует положение движущихся текстур на том же кадре;
|
||||
без него их начальная фаза не подтверждена. Фазы FX следуют
|
||||
выбранному control clock: без `--control-clock-ms` он обновляется по elapsed
|
||||
time, а с явным значением readback frames переигрывают заданный clock. Это не
|
||||
полное simulation time: `weather`, RNG и
|
||||
|
||||
Reference in new issue
Block a user