- Обновлены спецификации `runtime-pipeline`, `sound`, `terrain-map-loading`, `texture`, `ui` и `wear`. - Добавлены разделы о статусе покрытия и оставшихся задачах для достижения 100% завершенности. - Внесены уточнения по архитектурным ролям, минимальным контрактам и требованиям к toolchain для каждой подсистемы. - Уточнены форматы данных и правила взаимодействия между компонентами системы.
7.0 KiB
7.0 KiB
Render pipeline
Документ описывает полный процесс рендера кадра в движке Parkan: Iron Strategy, без привязки к внутренним адресам/именам дизассемблера.
Связанные страницы:
1. Инициализация рендера
На старте движок:
- Выбирает видеодрайвер (software или аппаратный).
- Создаёт render backend.
- Подключает библиотеки ресурсов:
Material.libTextures.libLightMap.libpalettes.lib
- Инициализирует менеджеры:
- material manager
- texture/lightmap cache
- effect manager
- Загружает базовые world-ресурсы (включая наборы объектов сцены).
2. Структура кадра
Кадр выполняется как последовательность:
Simulation updateAnimation samplingVisibility / cullingMaterial + texture resolveMesh drawFX update + drawUI/overlay drawPresent
3. Geometry path
3.1. Подготовка инстансов
Для каждого видимого объекта:
- Вычисляется
world transform. - Выбирается
LOD. - Для каждого узла выбирается slot через
Res1.
3.2. Culling
Сначала отсекаются узлы/слоты по bounds (AABB/sphere) из Res2.
3.3. Батчи
Для каждого прошедшего slot:
- Берутся батчи из диапазона
Res13. - По
materialIndexвыбирается активный материал. - По фазе материала выбирается текстура/lightmap.
- Выполняется
DrawIndexedPrimitive:- индексный диапазон:
indexStart/indexCount - базовая вершина:
baseVertex - индексы читаются из
Res6 - вершины/атрибуты читаются из
Res3/Res4/Res5(+ optional streams)
- индексный диапазон:
4. Animation path
Для анимированных моделей:
- Для узла выбирается ключ через
Res19и fallback-логику. - Декодируются
pos + quatизRes8. - При необходимости выполняется blending двух сэмплов.
- Узловая матрица передаётся в geometry path.
5. Material path
Material pipeline на кадре:
- По material handle выбирается запись
MAT0. - По игровому времени выбирается текущая фаза.
- Применяются коэффициенты фазы (цвет/альфа/параметры).
- Резолвятся ссылки на texture/lightmap.
- Невалидные ссылки обрабатываются fallback-стратегией.
Практическая цепочка привязки для большинства *.msh ассетов из *.rlb:
- Для модели выбирается одноимённый
WEAR(<model_stem>.wea). - Из
WEARберётся material-слот (по имени,legacyIdне участвует в выборе). - В
Material.libищетсяMAT0по имени (DEFAULT, затем индекс0как fallback). - Из выбранной material-фазы берётся
textureName. Texmищется вTextures.lib(и/или lightmap-архиве для lightmap-ветки).
6. Texture path
При резолве текстуры:
- Ищется
Texmentry по имени. - Проверяется и декодируется заголовок.
- При необходимости применяется
mipSkip. - Для indexed-формата подключается палитра.
- Optional
Pagechunk интерпретируется как atlas-таблица. - Объект текстуры кладётся/берётся из cache.
7. FX path
Эффекты выполняются параллельно mesh-рендеру:
- Для активных инстансов FX вычисляется runtime-коэффициент (
time_mode + flags). - Команды FX обновляют внутреннее состояние.
- Команды emit-этапа формируют примитивы/батчи эффектов.
- Эффекты рисуются в 3D-кадре с собственным счётчиком батчей.
8. Псевдокод кадра
void RenderFrame(Scene* scene, Camera* cam, float dt) {
UpdateGame(scene, dt);
for (Object* obj : scene->objects) {
if (!obj->visible) continue;
UpdateObjectAnimation(obj, scene->time);
BuildObjectNodeTransforms(obj);
}
BeginFrame(cam);
for (Object* obj : scene->objects) {
if (!obj->visible) continue;
RenderObjectMeshes(obj, cam);
}
UpdateAndRenderFx(scene, dt, cam);
RenderUI(scene);
Present();
}
9. Критичные условия для 1:1
- Та же политика округления/FP для анимации и FX.
- Та же логика fallback по материалам и текстурам.
- Та же очередность стадий кадра.
- Тот же контракт интерпретации
Res1/Res2/Res13/Res6. - Тот же контракт
FXIDкомандного потока.
10. Статус валидации
- Порядок кадра и подключение
Material.lib / Textures.lib / LightMap.libподтверждены текущей runtime-валидацией проекта. - Детальные инварианты форматов зафиксированы в
tools/msh_doc_validator.pyиtools/fxid_abs100_audit.py.
11. Статус покрытия и что осталось до 100%
Закрыто:
- Высокоуровневый кадр: simulation -> animation -> culling -> material/texture resolve -> mesh draw -> fx -> ui -> present.
- Связка MSH/MAT0/WEAR/Texm/FXID в едином runtime-процессе.
- Форматная валидация входных данных на полном retail-корпусе.
Осталось:
- Полный pixel-parity контур с эталонными кадрами оригинального рендера по набору моделей/сцен.
- Формализация всех render-state деталей (точные blend/depth/cull/state transitions) для гарантии 1:1 в каждом draw-pass.
- Полный coverage-пакет по динамическим веткам (FX-heavy кадры, сложные material-режимы, lightmap-комбинации).