- Introduced `LoadedModel` and `LoadedTexture` structs for better encapsulation of model and texture data. - Added functions to load models and textures from archives, including support for resolving textures based on materials and wear entries. - Implemented error handling for missing textures, materials, and wear entries. - Updated the rendering pipeline to support texture loading and binding, including command-line arguments for texture customization. - Enhanced the `texm` crate with new decoding capabilities for various pixel formats, including indexed textures. - Added tests for texture decoding and loading to ensure reliability and correctness. - Updated documentation to reflect changes in the material and texture resolution process.
6.1 KiB
6.1 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-кодом приложения и импортами движковых DLL. - Детальные инварианты форматов зафиксированы в
tools/msh_doc_validator.pyиtools/fxid_abs100_audit.py.