Texture Native (Секция RW)

Материал из GTAModding.ru
Перейти к: навигация, поиск
Секция RenderWare
Texture Native
0x0015

Texture Native - секция-контейнер, используемая в TXD-файлах внутри секции Texture Dictionary. Как правило, сопровождается секцией Struct.

Содержание

PC / XBOX

PlayStation 2

  • Texture Native
  • Struct - 4 байта - Платформа (PS2), 4байта - Флаги Фильтра
  • String - Название текстуры (размер кратен 4 байтам)
  • String - Название альфа-канала (размер кратен 4 байтам)
  • Struct
  • Struct - 4 байта ширина, 4 байта - высота, 4 байта - глубина цвета (bpp), далее - неизвестно
  • Struct - 80 байт - информация о изображении, растр, (80 байт - информация о палитре), палитра

Информация ниже находится на этапе эксперементирования и проверки, а, следовательно, может оказаться неточной.

Платформа и фильтр

Информация о платформе и фильтрах хранится в стандартной 8-байтовой структуре:

BYTE[4] - 4 байта - Строка "PS2" с завершающим нулём
DWORD   - 4 байта - Флажки фильтра и UV Wrapping

Флажки фильтра (RwTextureFilterMode) предствалены ниже.
Использовать можно только один из фильтров.

0x01  rwFILTERNEAREST            - Point sampled
0x02  rwFILTERLINEAR             - Bilinear
0x03  rwFILTERMIPNEAREST         - Point sampled per pixel mip map
0x04  rwFILTERMIPLINEAR          - Bilinear per pixel mipmap
0x05  rwFILTERLINEARMIPNEAREST   - MipMap interp point sampled
0x06  rwFILTERLINEARMIPLINEAR    - Trilinear

По всей видимости, флажки UV на этапе разработки могут занимать по байту каждый, но в конечной версии используется лишь 1 байт под обе координаты. Можно добавить, что лишь пара-тройка текстур имеет этот байт отличный от 0x11.

Ниже предсталены флажки UV. По идее, wrapping может быть не использован вообще - т.е. 0x00.

0x00  rwTEXTUREADDRESSNATEXTUREADDRESS - ??? (вроде как N/A)
0x01  rwTEXTUREADDRESSWRAP       - UV wraps (tiles)
0x02  rwTEXTUREADDRESSMIRROR     - Alternate UV is flipped
0x03  rwTEXTUREADDRESSCLAMP      - UV is clamped to 0-1
0x04  rwTEXTUREADDRESSBORDER     - Border color takes effect outside of 0-1

Основная структура информации

Здесь содержится вся или практически вся информация об изображении.

DWORD   - 4 байта - Ширина изображения в пикселях
DWORD   - 4 байта - Высота изображения в пикселях
DWORD   - 4 байта - Глубина цвета (bpp)
DWORD   - 2 байта - Флаги изображения
BYTE[7] - 7 байт  - неизвестно
BYTE    - 1 байт  - Тип палитры или что-то в этом роде (всегда равно 0x32, если палитры нет - всегда ноль и последующие 8 байт тоже нули)
WORD[4] - 8 байт  - Флаги палитры (?) (TODO)
...
DWORD - 4 байта - дубль секции SkyMipMapVal, на деле - оба значения всегда равны 0x0FC0 (TODO)

Флаги изображения

Это обычные флаги RenderWare Graphics, соеденённые в двойном слове (DWORD) при помощи побитового AND:

  • RwRasterFormat (Как правило, встречаются лишь RGBA, 8bit pal и 4bit pal, но приведу остальные, которые могут встретится):
Одновременно может использоваться только один флаг из каждой "группы" (группы флажков тут условно разделены пустой строкой).
0x0100  rwRASTERFORMAT1555        - 16 бит  - 1 бит альфа, по 5 бит на красный, зелёный и синий (5-5-5, только первый бит - альфа)
0x0200  rwRASTERFORMAT565         - 16 бит  - 5 бит - красный, 6 бит  - зелёный, 5 бит - синий (5-6-5)
0x0300  rwRASTERFORMAT4444        - 16 бит  - по 4 бита на красный, зелёный и синий
0x0400  rwRASTERFORMATLUM8        -  8 бит  - белый (красный = зелёный = синий)
0x0500  rwRASTERFORMAT8888        - 32 бита - 8 bits per component
0x0600  rwRASTERFORMAT888         - 24 бита - 8 bits per component
...
0x0A00  rwRASTERFORMAT555         - 16 бит  - по 5 бит на красный, зелёный и синий (обычный 5-5-5)

0x1000  rwRASTERFORMATAUTOMIPMAP  - RenderWare генерирует мипмапы автоматически
 
0x2000  rwRASTERFORMATPAL8        - 8 бит с палитрой (в этих двух случаях тип палитры указан с помощью флагов выше)
0x4000  rwRASTERFORMATPAL4        - 4 бит с палитрой
 
0x8000  rwRASTERFORMATMIPMAP      - Флаг наличия мипмапов.
  • RwRasterPrivateFlag:
Здесь я в данный момент не уверен, но если значение равно единице - нужно как-то корректировать палитру (или наоборот - не корректировать). Пока что привожу с оригинальными комментами разработчиков.
0x01  rwRASTERGAMMACORRECTED
0x02  rwRASTERPIXELLOCKEDREAD     - pixels are locked for reading
0x04  rwRASTERPIXELLOCKEDWRITE    - pixels are locked for writing
0x08  rwRASTERPALETTELOCKEDREAD   - palette is locked for reading
0x10  rwRASTERPALETTELOCKEDWRITE  - palette is locked for writing
0x20  rwRASTERPIXELLOCKEDRAW      - the pixels are in platform specific
  • Также, почти все (на практике - все) текстуры имеют флаги 0x020000 и 0x04. Второй из них и означает "текстура" (есть ещё камера и ещё чё-то). Первый отвечает за фоормат структуры, содержащей растр:
0x000000 - Изображение и палитра предваряются 80-байтовыми непонятными блоками.
0x010000 - Только растр и палитра
0x020000 - Растр и палитра (и мипмапы) предваряются информационными блоками.

Первые два флага встречаются только в GTA 3, всегов нескольких файлах.

Растр и палитра

Само изображение хранится в растровом формате, характерном для Sony PlayStation 2, так сокращаемом называемом TIM2. Заголовки изображения и файла не используется. (Подробнее о самом формате можно почитать в отдельной статье).
Практически всегда изображение, имеющее палитру, находится под swizzling'ом. Исключение составляют, например, 4-битные текстуры GTA 3. Алгоритм swizzling'а одинаков и для 4 и для 8 бит (по крайней мерев RenderWare). Текстуры, имеющие глубину цвета более 8 (т.е. беспалитровые 16, 32 и, в теории, 24-битные текстуры) не используют swizzling.
Определить наличие swizzling'а на данный момент удаётся лишь сравнивая размеры в структуре информации и в блоке информации (см. ниже).
В RenderWare начиная с версии 3.4 или 3.5 используются мипмапы. Мипмапы могут быть сгенерированы и сохранены заранее, наподобие того, как это часто используется в San Andreas. Каждый мипмап имеет заголовок наподобие оригинального растра и использует ту же палитру. После растра и мипмапов идёт палитра.

Совет: удобней считать палитру, отсчитав её размер от конца структуры. Размер палитры равен 4 x 2depth.
Если текстура 4-битная и под swizzling'ом, то палитра содержит ещё 32 дополнительных байта!

Блоки информация об изображении / палитре (заголовок палитры / изображения)

Информация хранится в 80-байтовом блоке в любом из этих случаев. Здесь всегда содержится информация об размере последующей структуры (по всей видимости, размер выражен в 16-байтовых блоках).
Важно отметить, что некоторые текстуры не содержат этого блока вообще. Например, CAS_WOM.TXD в GTA 3.


Смотри также

  1. TXD - информация о TXD-архивах (Texture Dictionary)
  2. Texture Native Struct на gtamodding.com (англ.)