diff options
Diffstat (limited to 'docs/tomes')
| -rw-r--r-- | docs/tomes/05-render.md | 86 |
1 files changed, 68 insertions, 18 deletions
diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index a7a1396..1329268 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-уровни и атласы @@ -736,6 +740,19 @@ struct FxHeader60 { локальную точку опоры, scale -- базовый масштаб экземпляра. Unknown flags и settings ID сохраняются. +У каждого экземпляра эффекта есть своё начало отсчёта. Например, эффект +длительностью четыре секунды, созданный на 135-й секунде, на 137-й находится +в середине цикла: `(137 − 135) / 4 = 0,5`. Режим может идти вперёд, +повторяться, идти назад или сохранять постоянную фазу. Вызывающий код может +сменить режим экземпляра, не меняя документ. Запрос перезапуска ждёт конца +текущего цикла и начинает новый при следующем обновлении. + +Эти правила реализованы в `fparkan-fx::clock`. Приложение передаёт одну фазу +геометрии, свету и звуку одной Control-строки; повторная отправка кадра не +пересчитывает её и не расходует случайные числа повторно. В статической сцене +все экземпляры пока рождаются в момент ноль. Управляющие команды Control и +очередь обновления с шагом 50 миллисекунд остаются задачами игрового цикла. + Каждая команда начинается с `uint32_t command_word`: ```text @@ -837,9 +854,13 @@ emit не должен повторно менять игровое состоя gate. Type 4 point list задаёт локальную матрицу; текущие MSH owner и mounted node poses входят в transform до локальной FX basis. Реализованные visuals охватывают Op3 modes 0–2, Op4, Op7/8 particle pools и Op9 generated mesh. Op1 -selector 1 добавляет point lights без native flag `0x80000000` в общий diffuse -список; остальные active records сохраняют flags для специальных путей и -projected shadows. Радиус источника масштабируется длиной его преобразованного +selector 1 добавляет point lights в освещение. Native flag `0x80000000` +ограничивает источник собственным объектом: такая лампа освещает завод, но +не рельеф вокруг него. Это не запрет на обычный расчёт света. Потеря локального +жёлтого источника над трубой делала крышу завода заметно холоднее оригинала. +Renderer сопоставляет владельца лампы и диапазона MSH; общие источники +доступны всем поверхностям. Исходные flags сохраняются также для projected +shadows. Радиус источника масштабируется длиной его преобразованного направления до нормализации. Например, локальный радиус 7 при масштабе узла около 4,85 освещает область радиусом около 34. Потеря этого множителя оставляла синий свет завода почти незаметным. Неположительный итог заменяется на 0,01. @@ -863,7 +884,8 @@ Effect renderer подавляет header bit `0x800` только при render selector 0. Native AniMesh component path захвачен с selector 1, а в его 53-entry manager присутствуют FX entries с header `0xD00`; preview использует selector 1 и пропускает такие visual commands. Изменения manager -`A8`, которые задают runtime phase/header gate, пока не моделируются. Header +`A8`, которые задают runtime phase/header gate, пока заменены нулём с явным +счётчиком `control_fx_manager_flag_stub`. Header bit `0x10` относится к activation lifecycle и не выключает draw. Для visual effect renderer использует MAT0, указанный самой командой. Его @@ -1147,13 +1169,39 @@ lightmap state передаются в `VulkanStaticMaterial`, а shader посÐ В [эталонной сборке](../reference/original-binaries.md) выбор грани находится в Terrain.dll RVA `0x28A50`, а подготовка EMBM-пакета — в RVA `0x1B540`. -Первый Vulkan-проход строит плоское зеркало. Для горизонтальной воды на -высоте `h` отражённая координата точки равна `z′ = 2h − z`. Это преобразование -применяется перед обычной проекцией. Оно меняет порядок вершин треугольника, -поэтому проход меняет сторону отсечения и отбрасывает геометрию ниже воды. +Для горизонтальной воды на высоте `h` камера отражения находится в точке +`[eye_x, eye_y, 2h − eye_z]`. Но она не повторяет наклон основной камеры: +смотрит вертикально вверх, а её окно лежит на прямоугольнике водоёма. Поэтому +текстура отражения привязана к местности, а не к экрану игрока. В плоскости +воды координаты изображения равны `U = 1 − Ynorm`, `V = 1 − Xnorm`. + +Terrain.dll RVA `0x4EFF0` передаёт shifted-проекции пять значений: +`[min_y − eye_y, min_x − eye_x, span_y, span_x, eye_z − h]`. Например, +для наблюдателя `[1200, 800, 185]`, воды `150` и границ +`[1000, 500, 1500, 1200]` это `[-300, -200, 700, 500, 35]`. +Матрица камеры и эти аргументы проверены исполнением оригинальной функции +при двух положениях и разных поворотах основной камеры. Оракул подменяет +ввод-вывод очереди, ландшафта и камеры; сам renderer и матрица глубины в эту +проверку не входят. Vulkan-проекция сохраняет near/far основного вида; +Rust-тест отдельно проверяет углы водоёма и границы глубины. + +Отражённый вид меняет сторону отсечения и отбрасывает геометрию ниже воды. Небо и оставшаяся сцена попадают в отдельную цветовую текстуру с собственной -глубиной. В основном проходе водные треугольники читают её в экранной -координате: точки самой плоскости не сдвигаются при отражении. +глубиной. В основном проходе водные треугольники читают её по координатам +водоёма с добавленным смещением волн. Для неперспективной камеры API остаётся +обычное зеркало с экранными координатами. + +Размер изображения отражения выбирается отдельно от размера основного кадра. +Terrain.dll в конструкторе CShade (RVA `0x278E0`, цикл с `0x27FC7`) берёт +ширину и высоту renderer через Ngi32.dll RVA `0x7FB0`. Сторона квадратной +текстуры — наибольшая степень двойки, не превосходящая меньшую из этих +величин и 1024; нижний предел равен 2. Например, экран 1280×1024 даёт +отражение 1024×1024, а 1280×720 — 512×512. Getter размеров и исходный цикл +выбора проверены исполнением DLL на десяти входах; создание нативной текстуры +в этом оракуле пропущено. Vulkan создаёт цвет и глубину с этой стороной и +задаёт каждому проходу собственные viewport и область очистки. Так уменьшение +отражения не обрезает основной кадр и воспроизводит исходный масштаб его +пикселей, от которого зависит чёткость берегов и ряби. Цветовой target переходит из attachment layout в shader-read layout после записи. Следующий зеркальный проход ждёт предыдущего чтения этой текстуры; @@ -1182,10 +1230,12 @@ lightmap state передаются в `VulkanStaticMaterial`, а shader посÐ В Vulkan карта хранится в двух каналах несжатой текстуры и возвращается к знаковым значениям перед вычислением смещения. -Обычное зеркало ещё не повторяет shifted-камеру оригинала: смещения Du/Dv -сейчас переводятся из координат водоёма в текущую зеркальную проекцию. -Это приближение учитывается в `planar_reflection_shifted_camera_unsupported`; -совпадение генератора волн не доказывает совпадения итогового отражения. +Матрица положения камеры, её окно, размер текстуры и координаты волн восстановлены, но весь +контекст отражённого вида ещё не повторён. Диапазон глубины, небо, туман и FX +заимствуются из основного вида. Для захвата с обрезанным viewport ещё не +подтверждено соответствие размера окна FParkan полному renderer оригинала. +Эти ограничения учитываются в `planar_reflection_render_context_approx`; +совпадение генератора волн и окна не доказывает совпадения итогового отражения. Один target обслуживает ближайшую активную высоту воды; другие высоты и негоризонтальные поверхности явно считаются как неподдержанные. Это промежуточный водный проход, а не полная |
