feat: добавление документации по текстурам и материалам
This commit is contained in:
90
docs/specs/textures.md
Normal file
90
docs/specs/textures.md
Normal file
@@ -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` к материалам:
|
||||||
|
- это имена материалов?
|
||||||
|
- это имена текстур?
|
||||||
|
- или это имена узлов/анимаций?
|
||||||
|
|
||||||
|
До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат.
|
||||||
Reference in New Issue
Block a user