Valve Texture Format

From Valve Developer Community
< Ru
Jump to: navigation, search
English (en)Français (fr)Русский (ru)Translate (Translate)
Info content.png
This page has not been fully translated.

You can help by finishing the translation.

Also, please make sure the article tries to comply with the alternate languages guide.

Valve Texture Format (VTF) - это проприетарный формат текстур(en) использующийся движком Source(en). VTF файлы обычно задействуются через VMT(en) файлы вместо использования напрямую, что предоставляет возможность их повторного использования.

VTF файлы могут быть созданы из изображений в формате TGA(en) с помощью Source SDK Tool VTEX(en) или из большинства основных форматов изображений с помощью сторонних инструментов(en). И текстуры и материалы хранятся в подпапках game_dir/materials/.

Note.pngПримечание:VTF файлы должны быть в размерности степени двойки, например: 64x64, 128x128, 256x256, 512x512 и т.д.
Note.pngПримечание:Хотя технически это ограничение можно обойти с помощью альтернативных программ для конвертации текстур, например SprayMaker 5000

Возможности

Формат VTF может хранить двумерную текстуру, либо карту окружения(en), либо объемную текстуру. Каждая из этих текстур может иметь несколько кадров.

  • Карта окружения (environment map) - это шестигранная кубическая карта.
  • Объемная текстура (volumetric texture) - это текстура с глубиной, у которой каждый кадр это слой в третьем измерении. То есть объемная текстура 16x16x16 имеет 16 текстур размером 16x16 сложенных друг на друге (как стопка блинчиков). Этот формат используется внутренне движком Source и у вас не должно быть никакой потребности в создании такой текстуры самому.
  • Для каждого кадра и грани, файл VTF содержит и оригинальное изображение и серию mipmap(en)'ов, использующихся для рендера текстуры на различных расстояниях. Так как каждый последующий mipmap имеет 1/2 размера (ширины и высоты) предыдущего, оригинальное изображение должно быть в размерности степени двойки. Не смотря на то, что оригинальное изображение может быть прямоугольным, квадратные mipmap'ы хранятся более эффективно в VTF.
  • Начальный кадр (для анимаций)
  • Размер бамп мапы(en)
  • Значение коэффициента отражения(en) для VRAD(en)
  • Копия VTF небольшого разрешения для сэмплирования цвета движком.

Ресурсы

В VTF версии 7.3 появилась расширяемая система ресурсов. Вы можете хранить что угодно, но движок Source распознает только следующие данные:

  • Значение CRC для обнаружения "битых" данных.
  • An U/V LOD control. This is the highest mipmap which should be loaded when game's Texture Detail setting is "High" (mat_picmip 0). An U LOD Control value of 11 selects the mipmap which is 2048 pixels (211) across.
    Note.pngПримечание:Since users are currently only presented with one texture detail setting above High, there is little point setting this value to anything except 50% or 100% of your texture's size.
  • Данные animated particle sheet(en).
  • Расширенные настройки текстуры. Это коллекция из 32 флагов, ни один из которых не используется в Valve. В отличие от встроенных флагов VTF, эти могут быть определены специально для определенной игры.

Форматы данных изображения

VTF может хранить в себе данные в различных форматах. Некоторые форматы предназначены для движка, некоторые только как промежуточные форматы для преобразований. Несжатые форматы не теряют данных, а сжатые (DXT) - теряют.

Таблица форматов данных изображений

Формат Red Bits Green Bits Blue Bits Alpha Bits Total Bits Сжатие Поддерживается Комментарий
A8 0 0 0 8 8 False True
ABGR8888 8 8 8 8 32 False True Несжатая текстура с альфа-каналом
ARGB8888 8 8 8 8 32 False True
BGR565 5 6 5 0 16 False True Несжатая текстура, ограниченная глубина цвета
BGR888 8 8 8 0 24 False True Несжатая текстура
BGR888_BLUESCREEN 8 8 8 0 24 False True
BGRA4444 4 4 4 4 16 False True Несжатая текстура с альфа-каналом, половина глубины цвета
BGRA5551 5 5 5 1 16 False True
BGRA8888 8 8 8 8 32 Either True Также используется для сжатых HDR
BGRX5551 5 5 5 1 16 False True
BGRX8888 8 8 8 8 32 False True
DXT1 N/A N/A N/A 0 4 True True Стандартное сжатие, без альфа-канала
DXT1_ONEBITALPHA N/A N/A N/A 1 4 True True Стандартное сжатие, однобитный альфа-канал
DXT3 N/A N/A N/A 4 8 True True Uninterpolated Alpha
DXT5 N/A N/A N/A 4 8 True True Interpolated Alpha (recommended)
I8 N/A N/A N/A N/A 8 False True Luminance (Grayscale)
IA88 N/A N/A N/A 8 16 False True Luminance (Grayscale)
P8 N/A N/A N/A N/A 8 False False Paletted
RGB565 5 6 5 0 16 False True
RGB888 8 8 8 0 24 False True
RGB888_BLUESCREEN 8 8 8 0 24 False True
RGBA16161616 16 16 16 16 64 False True Integer HDR Format
RGBA16161616F 16 16 16 16 64 False True Floating Point HDR Format
RGBA8888 8 8 8 8 32 False True
UV88 N/A N/A N/A N/A 16 False True Несжатый формат du/dv
UVLX8888 N/A N/A N/A N/A 32 False True
UVWQ8888 N/A N/A N/A N/A 32 False True
Сравнение влияния DXT сжатия на различные типы изображений

Сжатие HDR

HDR текстуры могут храниться в сжатой форме используя формат BGRA8888.

Эта формула показывает как преобразовать эти цвета в целочисленный HDR (integer): RGB = RGB * (A * 16)

и в HDR с плавающей запятой (floating point):

RGB = (RGB * (A * 16)) / 262144

Выбор формата изображений

Не смотря на то, что VTF предоставляет поддержку широкого ряда форматов изображений, есть только несколько форматов, которые вы, скорее всего, будете использовать. Эти форматы и критерии выбора описаны ниже.

  • BGR888: используйте для текстур без альфа-канала и с качественным градиентом (например, карт нормалей и световых ореолов (light halo)).
  • BGRA8888: используйте для текстур с альфа-каналом и с качественным градиентом (например, карт нормалей и световых ореолов). Он также может быть использован, чтобы получать высококачественные текстуры.
  • DXT1: используйте этот формат для обычных текстур без альфа-канала.
  • DXT3: используйте этот формат для обычных текстур с альфа-каналом и резкими градиентами.
  • DXT5: используйте этот формат для обычных текстур с альфа-каналом и плавными градиентами.
  • I8: используйте этот формат для черно-белых текстур без альфа-канала и с качественным градиентом (например, световые ореолы).
  • IA88: используйте этот формат для черно-белых текстур с альфа каналом и качественным градиентом (например, дым или световые ореолы).
  • RGBA16161616F: используйте этот формат для HDR текстур.
  • UV88: используйте этот формат для DuDv карт.

Технические детали о различных форматах сжатия DXT.

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

Tip.pngСовет:Большинство настроек шейдера конфигурируются с помощью параметров материала(en), не с помощью текстурных флагов.

VTF может содержать следующие флаги (версия 7.5):

Флаг Значение Комментарий
Point Sampling 0x0001 Низкое качество, фильтрация текстур "пиксельная графика".
Trilinear Sampling 0x0002 Фильтрация текстур среднего качества.
Clamp S 0x0004 Координаты зажима S.
Clamp T 0x0008 Координаты зажима T.
Anisotropic Sampling 0x0010 Качественная фильтрация текстур.
Hint DXT5 0x0020 Используется в skybox(en)es. Убедитесь, что края бесшовные.
PWL Corrected 0x0040 Цель неизвестна.
SRGB n/a Использует пространство RGB. Полезно для высоких гамм. Не рекомендуется в версии 7.5.
No Compress 0x0040 Сжатие DXT не используется. Устаревшее
Normal Map 0x0080 Текстура - это карта нормалей.
No Mipmaps 0x0100 Отрисовывать только самые большие MIP-карты. (Не удаляет существующие MIP-карты, а просто отключает их.)
No Level Of Detail 0x0200 Не зависит от настроек разрешения текстуры.
No Minimum Mipmap 0x0400 Если установлено, загружайте MIP-карты размером менее 32x32 пикселей.
Procedural 0x0800 Текстура - это процедурная текстура (код может ее изменять).
One Bit Alpha 0x1000 Используется однобитовый альфа-канал.
Eight Bit Alpha 0x2000 Используется восьмибитный альфа-канал.
Environment Map 0x4000 Текстура - это карта окружения.
Render Target 0x8000 Текстура - это цель рендеринга.
Depth Render Target 0x10000 Текстура - это цель рендеринга глубины.
No Debug Override 0x20000
Single Copy 0x40000
Pre SRGB 0x80000 Исправление SRGB уже применено
One Over Mipmap Level In Alpha 0x80000 Заполните альфа-канал значением 1 / Mipmap Level. Устарело (для внутреннего использования VTEX?)
Premultiply Color By One Over Mipmap Level 0x100000 (Для внутреннего использования VTEX?)
Normal To DuDv 0x200000 Текстура - это карта DuDv. (Для внутреннего использования VTEX?)
Alpha Test Mipmap Generation 0x400000 (Для внутреннего использования VTEX?)
No Depth Buffer 0x800000 Не Z-буферизация для обработки видео обычно расстояние визуализации.
Nice Filtered 0x1000000 использование NICE фильтрация(en) для создания MIP-карт. (Для внутреннего использования VTEX?)
Clamp U 0x2000000 Координаты зажима U (для объемных текстур).
Vertex Texture 0x4000000 Может использоваться как вершинная текстура
SSBump 0x8000000 Текстура - это SSBump(en). (SSB)
Border 0x20000000 Привязка к цвету границы по всем координатам текстуры

Формат файла

Описание формата VTF.

Структура формата

7.2 7.3 +
  1. VTF заголовок
  2. VTF Данные изображения с низким разрешением
  3. Для каждого Mipmap (от наименьшего к наибольшему)
    • Для каждого кадра (от первого до последнего)
      • Для каждого лица (от первого до последнего)
        • Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
          • VTF Данные изображения высокого разрешения
  1. VTF заголовок
  2. Записи ресурсов
    • VTF Данные изображения с низким разрешением
    • Другие данные о ресурсах(en)
    • Для каждого Mipmap (от наименьшего к наибольшему)
      • Для каждого кадра (от первого до последнего)
        • Для каждого лица (от первого до последнего)
          • Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
            • VTF Данные изображения высокого разрешения

Перечисления

enum
{
	IMAGE_FORMAT_NONE = -1,
	IMAGE_FORMAT_RGBA8888 = 0,
	IMAGE_FORMAT_ABGR8888,
	IMAGE_FORMAT_RGB888,
	IMAGE_FORMAT_BGR888,
	IMAGE_FORMAT_RGB565,
	IMAGE_FORMAT_I8,
	IMAGE_FORMAT_IA88,
	IMAGE_FORMAT_P8,
	IMAGE_FORMAT_A8,
	IMAGE_FORMAT_RGB888_BLUESCREEN,
	IMAGE_FORMAT_BGR888_BLUESCREEN,
	IMAGE_FORMAT_ARGB8888,
	IMAGE_FORMAT_BGRA8888,
	IMAGE_FORMAT_DXT1,
	IMAGE_FORMAT_DXT3,
	IMAGE_FORMAT_DXT5,
	IMAGE_FORMAT_BGRX8888,
	IMAGE_FORMAT_BGR565,
	IMAGE_FORMAT_BGRX5551,
	IMAGE_FORMAT_BGRA4444,
	IMAGE_FORMAT_DXT1_ONEBITALPHA,
	IMAGE_FORMAT_BGRA5551,
	IMAGE_FORMAT_UV88,
	IMAGE_FORMAT_UVWQ8888,
	IMAGE_FORMAT_RGBA16161616F,
	IMAGE_FORMAT_RGBA16161616,
	IMAGE_FORMAT_UVLX8888
};
enum
{
	// Flags from the *.txt config file
	TEXTUREFLAGS_POINTSAMPLE = 0x00000001,
	TEXTUREFLAGS_TRILINEAR = 0x00000002,
	TEXTUREFLAGS_CLAMPS = 0x00000004,
	TEXTUREFLAGS_CLAMPT = 0x00000008,
	TEXTUREFLAGS_ANISOTROPIC = 0x00000010,
	TEXTUREFLAGS_HINT_DXT5 = 0x00000020,
	TEXTUREFLAGS_PWL_CORRECTED = 0x00000040,
	TEXTUREFLAGS_NORMAL = 0x00000080,
	TEXTUREFLAGS_NOMIP = 0x00000100,
	TEXTUREFLAGS_NOLOD = 0x00000200,
	TEXTUREFLAGS_ALL_MIPS = 0x00000400,
	TEXTUREFLAGS_PROCEDURAL = 0x00000800,

	// These are automatically generated by vtex from the texture data.
	TEXTUREFLAGS_ONEBITALPHA = 0x00001000,
	TEXTUREFLAGS_EIGHTBITALPHA = 0x00002000,

	// Newer flags from the *.txt config file
	TEXTUREFLAGS_ENVMAP = 0x00004000,
	TEXTUREFLAGS_RENDERTARGET = 0x00008000,
	TEXTUREFLAGS_DEPTHRENDERTARGET = 0x00010000,
	TEXTUREFLAGS_NODEBUGOVERRIDE = 0x00020000,
	TEXTUREFLAGS_SINGLECOPY	= 0x00040000,
	TEXTUREFLAGS_PRE_SRGB = 0x00080000,
        
        TEXTUREFLAGS_UNUSED_00100000 = 0x00100000,
	TEXTUREFLAGS_UNUSED_00200000 = 0x00200000,
	TEXTUREFLAGS_UNUSED_00400000 = 0x00400000,

	TEXTUREFLAGS_NODEPTHBUFFER = 0x00800000,

	TEXTUREFLAGS_UNUSED_01000000 = 0x01000000,

	TEXTUREFLAGS_CLAMPU = 0x02000000,
	TEXTUREFLAGS_VERTEXTEXTURE = 0x04000000,
	TEXTUREFLAGS_SSBUMP = 0x08000000,			

	TEXTUREFLAGS_UNUSED_10000000 = 0x10000000,

	TEXTUREFLAGS_BORDER = 0x20000000,

	TEXTUREFLAGS_UNUSED_40000000 = 0x40000000,
	TEXTUREFLAGS_UNUSED_80000000 = 0x80000000,
};

Заголовок формата

typedef struct tagVTFHEADER
{
	char		signature[4];		// File signature ("VTF\0"). (or as little-endian integer, 0x00465456)
	unsigned int	version[2];		// version[0].version[1] (currently 7.2).
	unsigned int	headerSize;		// Size of the header struct  (16 byte aligned; currently 80 bytes) + size of the resources dictionary (7.3+).
	unsigned short	width;			// Width of the largest mipmap in pixels. Must be a power of 2.
	unsigned short	height;			// Height of the largest mipmap in pixels. Must be a power of 2.
	unsigned int	flags;			// VTF flags.
	unsigned short	frames;			// Number of frames, if animated (1 for no animation).
	unsigned short	firstFrame;		// First frame in animation (0 based).
	unsigned char	padding0[4];		// reflectivity padding (16 byte alignment).
	float		reflectivity[3];	// reflectivity vector.
	unsigned char	padding1[4];		// reflectivity padding (8 byte packing).
	float		bumpmapScale;		// Bumpmap scale.
	unsigned int	highResImageFormat;	// High resolution image format.
	unsigned char	mipmapCount;		// Number of mipmaps.
	unsigned int	lowResImageFormat;	// Low resolution image format (always DXT1).
	unsigned char	lowResImageWidth;	// Low resolution image width.
	unsigned char	lowResImageHeight;	// Low resolution image height.

	// 7.2+
	unsigned short	depth;			// Depth of the largest mipmap in pixels.
						// Must be a power of 2. Can be 0 or 1 for a 2D texture (v7.2 only).

	// 7.3+
	unsigned char	padding2[3];		// depth padding (4 byte alignment).
	unsigned int	numResources;		// Number of resources this vtf has
} VTFHEADER;

VTF данные изображения в низком разрешении

Плотно упакованные данные изображения с низким разрешением в формате, описанном в заголовке. Данные изображения с низким разрешением всегда хранятся в формате сжатого изображения DXT1. Его размеры соответствуют размерам самого большого MIP-карты с шириной или высотой, не превышающей 16 пикселей. то есть для VTF 256x256 пикселей: 16x16, для VTF 256x64 пикселей: 16x4, для VTF 1x32 пикселей: 1x16, для VTF 4x4 пикселей: 4x4.

VTF данные изображения в высоком разрешении

Tхорошо упакованные перемежающиеся данные изображения высокого разрешения в формате, описанном в заголовке. Распространенные форматы изображений включают DXT1, DXT5, BGR888, BGRA8888 и UV88. Все размеры должны быть power of two.

История версий

v7.5

  • Выпущено 19 июля 2010 г. как часть Alien Swarm(en)
  • Побитовый эквивалент v7.4.
  • Переопределяет и изменяет два флага текстуры.
  • Сферы теперь официально избыточны.
  • Большинство изменений внутри процесса создания VTF с помощью VTEX, например Форматы MipMap fading, Alpha decay и XBox360.

v7.4

  • Выпущена 10 октября 2007 г. как часть The Orange Box.
  • Побитовый эквивалент версии 7.3.
  • Решает проблемы, связанные с тем, как выполняется гамма-коррекция текстур для ТВ-вывода на XBOX 360 в сочетании с поиском памяти выгружаемого пула ОС.

v7.3

  • Добавлена ​​расширяемая структура, ориентированная на ресурсы.
  • Добавлены ресурсы CRC, управления уровнем детализации текстуры и листа, а также ресурсы изображений с обратной совместимостью и изображений с низким разрешением.
  • Добавлено несколько форматов трафаретов глубины, зависящих от поставщика (для внутреннего использования в движке), а также форматы карт нормалей и линейные несжатые форматы.
  • Выпущена 18 сентября 2007 г. как часть Team Fortress 2(en) бета.

v7.2

  • Добавлена ​​поддержка объемных текстур.
  • Выпущен 23 сентября 2005 г. как Steam(en) обновление двигателя.

v7.1

  • Добавлена ​​поддержка карты сфер для карт среды. (Это было предназначено для поддержки DirectX 6, которая позже была сокращена.)

v7.0

  • Изначальный выпуск. (Только для внутреннего выпуска, однако некоторые текстуры v7.0 попали в опубликованный заголовок.)

Реализация

Пример независимой от Steam реализации формата файла изображения VTF можно найти в библиотеке LGPL C / C ++. VTFLib(en).

Инструменты

Просмотр
Windows thumbnail handler(en) (Windows XP+)
VTF Explorer(en) (Windows; можно исследовать внутри GCFs)
gdk-pixbuf-vtf (Gnome\Nautilus\Eog)
IrfanView plugin
Программа просмотра изображений Leadworks (supports VTF) [мёртвая ссылка]
Редактирование
VTFEdit(en) (GUI) и VTFCmd(en) (command line(en))
Photoshop Plug-in(en) (6 и вверх)
GIMP Plug-in
Paint.NET Plug-in
3DSMax plugin(en) (версии с 6 по 2009)
VIDE
Преобразование между версиями
7.5 to 7.4 Batch Converter

См. также