4.5 KiB
Текстуры и материалы
На текущем этапе в дизассемблированных библиотеках не найден полный декодер формата текстурного файла (нет явных парсеров 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), которые сильно влияют на текстурный пайплайн:
DisableMipmapDisableBilinearDisableTrilinearDisableMultiTexturingDisable32bitTextures/Force16bitTexturesForceSoftwareForceNoFilteringForceHWTnLForceNoHWTnL
Практический вывод для порта:
- движок может работать без мипмапов, без фильтрации, и даже без 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) Что нужно найти дальше (чтобы написать полноценную спецификацию материалов/текстур)
- Место, где
materialIndexразворачивается в набор render states:- alpha blending / alpha test
- z‑write/z‑test
- culling
- 1‑pass vs 2‑pass (multi‑texturing)
- Формат записи “material record”:
- какие поля
- ссылки на текстуры (ID, имя, индекс в таблице)
- Формат “texture asset”:
- где хранится (внутри NRes или отдельным файлом)
- компрессия/палитра/мip’ы
- Привязка строковой таблицы
Res10к материалам:- это имена материалов?
- это имена текстур?
- или это имена узлов/анимаций?
До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат.