Files
fparkan/docs/specs/textures.md

4.5 KiB
Raw Blame History

Текстуры и материалы

На текущем этапе в дизассемблированных библиотеках не найден полный декодер формата текстурного файла (нет явных парсеров 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потоки

В загрузчике модели присутствуют дополнительные pervertex ресурсы:

  • 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),
  • нормалмапы,

то где‑то должен быть код:

  • который выбирает эти потоки как входные атрибуты вершинного шейдера/пайплайна,
  • который активирует multitexturing.

Сейчас в найденных фрагментах это ещё не подтверждено, но структура данных “просится” именно туда.


4) Что нужно найти дальше (чтобы написать полноценную спецификацию материалов/текстур)

  1. Место, где materialIndex разворачивается в набор render states:
    • alpha blending / alpha test
    • zwrite/ztest
    • culling
    • 1pass vs 2pass (multitexturing)
  2. Формат записи “material record”:
    • какие поля
    • ссылки на текстуры (ID, имя, индекс в таблице)
  3. Формат “texture asset”:
    • где хранится (внутри NRes или отдельным файлом)
    • компрессия/палитра/мipы
  4. Привязка строковой таблицы Res10 к материалам:
    • это имена материалов?
    • это имена текстур?
    • или это имена узлов/анимаций?

До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат.