diff options
| author | Valentin Popov <valentin@popov.link> | 2026-02-10 00:44:01 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-02-10 00:44:01 +0300 |
| commit | 022ec608f55fe6541e5b294555c5547f75fdddfc (patch) | |
| tree | b286c9b55d8bba69e6e7cdf6ece8f930a1137f7b /docs/specs | |
| parent | 54c94fddb5fcf4e38bc9124be0e9cec93a4cdcba (diff) | |
| download | fparkan-022ec608f55fe6541e5b294555c5547f75fdddfc.tar.xz fparkan-022ec608f55fe6541e5b294555c5547f75fdddfc.zip | |
feat: добавление документации по текстурам и материалам
Diffstat (limited to 'docs/specs')
| -rw-r--r-- | docs/specs/textures.md | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/docs/specs/textures.md b/docs/specs/textures.md new file mode 100644 index 0000000..72e1462 --- /dev/null +++ b/docs/specs/textures.md @@ -0,0 +1,90 @@ +# Текстуры и материалы + +На текущем этапе в дизассемблированных библиотеках **не найден полный декодер формата текстурного файла** (нет явных парсеров DDS/TGA/BMP и т.п.). Поэтому документ пока фиксирует: + +- что можно достоверно вывести по рендер‑конфигу, +- что видно по структурам модели (materialIndex), +- какие места требуют дальнейшего анализа. + +--- + +## 1) Материал в модели + +В batch table модели (см. документацию по MSH/AniMesh) есть поле, очень похожее на: + +- `materialIndex: u16` (batch + 2) + +Это индекс, по которому рендерер выбирает: + +- текстуру(ы), +- параметры (blend, alpha test, двухтекстурность и т.п.), +- “шейдер/пайплайн” (в терминах оригинального рендера — набор state’ов). + +**Где лежит таблица материалов** (внутри модели или глобально) — требует подтверждения: + +- вероятный кандидат — отдельный ресурс/таблица, на которую `materialIndex` ссылается. +- строковая таблица `Res10` может хранить имена материалов/текстур, но маппинг не доказан. + +--- + +## 2) Переключатели рендера, влияющие на текстуры (из Ngi32.dll) + +В `Ngi32.dll` есть набор runtime‑настроек (похоже, читаются из системных настроек/INI/registry), которые сильно влияют на текстурный пайплайн: + +- `DisableMipmap` +- `DisableBilinear` +- `DisableTrilinear` +- `DisableMultiTexturing` +- `Disable32bitTextures` / `Force16bitTextures` +- `ForceSoftware` +- `ForceNoFiltering` +- `ForceHWTnL` +- `ForceNoHWTnL` + +Практический вывод для порта: + +- движок может работать **без мипмапов**, **без фильтрации**, и даже **без multitexturing**. + +--- + +## 3) “Две текстуры” и дополнительные UV‑потоки + +В загрузчике модели присутствуют дополнительные per‑vertex ресурсы: + +- Res15 (stride 8) — кандидат на UV1 (lightmap/second layer) +- Res16 (stride 8, split в 2×4) — кандидат на tangent/bitangent (normal mapping) +- Res18 (stride 4) — кандидат на vertex color / AO + +Если материал реально поддерживает: + +- вторую текстуру (detail map, lightmap), +- нормалмапы, + +то где‑то должен быть код: + +- который выбирает эти потоки как входные атрибуты вершинного шейдера/пайплайна, +- который активирует multi‑texturing. + +Сейчас в найденных фрагментах это ещё **не подтверждено**, но структура данных “просится” именно туда. + +--- + +## 4) Что нужно найти дальше (чтобы написать полноценную спецификацию материалов/текстур) + +1. Место, где `materialIndex` разворачивается в набор render states: + - alpha blending / alpha test + - z‑write/z‑test + - culling + - 1‑pass vs 2‑pass (multi‑texturing) +2. Формат записи “material record”: + - какие поля + - ссылки на текстуры (ID, имя, индекс в таблице) +3. Формат “texture asset”: + - где хранится (внутри NRes или отдельным файлом) + - компрессия/палитра/мip’ы +4. Привязка строковой таблицы `Res10` к материалам: + - это имена материалов? + - это имена текстур? + - или это имена узлов/анимаций? + +До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат. |
