- Updated MSH documentation to reflect changes in material, wear, and texture specifications. - Introduced new `render.md` file detailing the render pipeline process. - Removed outdated sections from `runtime-pipeline.md` and redirected to `render.md`. - Added detailed specifications for `Texm` texture format and `WEAR` wear table. - Updated navigation in `mkdocs.yml` to align with new documentation structure.
5.5 KiB
5.5 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-стратегией.
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-кодом приложения и импортами движковых DLL. - Детальные инварианты форматов зафиксированы в
tools/msh_doc_validator.pyиtools/fxid_abs100_audit.py.