Valve纹理格式-VTF
Valve Texture Format (VTF) 是起源引擎专用的纹理格式。 VTF 文件通常作为一个独立的材料被引用,而不是直接调用,这样可以允许它以多种方式重复利用。
VTF文件可以用Source SDK Tool VTEX由TGA图像或者其他有第三方软件辅助的常见图像格式创建。纹理和材质都储存在子文件夹 game_dir/materials/
.
存储内容
VTF格式的图像可以存储平面纹理(flat texture),环境映射(environment map)或者体积纹理(volumetric texture)。每一种都可以以拥有多个坐标系。
环境映射是一个六面立方体映射。
体积纹理是一种有深度的纹理,其中的每一帧都是在三维中分层的一个“层”。 所以一个16*16*16的体积纹理由16层独立的16*16的纹理堆叠而成,这样可以赋予纹理深度。这种格式在Source Engine内部被使用,并不需要你自己去创建一个。
对于每一帧和每一面,VTF文件既包含基本的原始源图像数据 (像素图),也包含一系列用于在不同距离上渲染纹理的mipmap( 一种电脑图形图像技术,用于在三维图像的二维代替物中达到立体感效应) 。因为每一个连续的mipmap恰好是前一个mipmap尺寸(高度和宽度)的1/2,源图像尺寸就必须是4的倍数。尽管源图像可能是矩形的,但是方形的mipmap在VTF中的储存效率更高。
开始帧(start frame):用于动画
凹凸贴图(bump map)的规模
VRAD(一个命令行工具,让静态和预编译的光照通过光线传递算法在世界范围内反弹)使用的反射率值。
一个用于引擎颜色采样,分辨率非常低的VTF副本。
资源
VTF 7.3 增加了一个可扩展的 “资源数据(resource data)“系统。 任何内容都可以被添加,但是引擎只会识别以下内容:
用于检测数据是否损坏的CRC(Cyclic Redundancy Check 循环冗余校验)值。
U/V LOD(Level Of Details 多层次细节) 控制。当游戏纹理细节被设置为“高”(
mat_picmip 0
)时,加载细节度最高的mipmap。一个值为11的U LOD 控制值选择的对应mipmap像素为2048(2^11)
因为目前用户选项中只有一个选项是高于”高“的纹理细节设置,所以除了%50或%100的纹理大小之外,这个调试的意义不大。
扩展纹理设置。这是一个包含32个旗标(flag)的集合 。其中没有一个被Valve用到。与内置的VTF旗标不同,我们可以根据游戏自身来定义这些内容。
图像数据格式
VTF格式可以存储多种格式的图像数据。有些格式是为引擎所准备的,有些只是作为转换的过渡格式。未压缩的(uncompressed)格式是无损的,而压缩的(compressed)格式是有损的(比如说DXT)
注解:VTF格式实际上可以存储的格式包括但不限于下面列出的格式 -- 具体请查询你的引擎分支资料public/bitmap/imageformat.h
来获知哪些格式是被支持的。然而,这些格式不能保证一定能在引擎中正确工作,它们的枚举值很容易在引擎分支间被打乱。
图像数据格式表
Format | Red Bits | Green Bits | Blue Bits | Alpha Bits | Total Bits | Compresses | Supported | Comments |
A8 | 0 | 0 | 0 | 8 | 8 | False | True | |
ABGR8888 | 8 | 8 | 8 | 8 | 32 | False | True | Uncompressed texture with alpha |
ARGB8888 | 8 | 8 | 8 | 8 | 32 | False | True | |
BGR565 | 5 | 6 | 5 | 0 | 16 | False | True | Uncompressed texture, limited color depth |
BGR888 | 8 | 8 | 8 | 0 | 24 | False | True | Uncompressed texture |
BGR888_BLUESCREEN | 8 | 8 | 8 | 0 | 24 | False | True | |
BGRA4444 | 4 | 4 | 4 | 4 | 16 | False | True | Uncompressed texture with alpha, half color depth |
BGRA5551 | 5 | 5 | 5 | 1 | 16 | False | True | |
BGRA8888 | 8 | 8 | 8 | 8 | 32 | Either | True | Also used for compressed 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 | Standard compression, no alpha |
DXT1_ONEBITALPHA | N/A | N/A | N/A | 1 | 4 | True | True | Standard compression, one bit alpha |
DXT3 | N/A | N/A | N/A | 4 | 8 | True | True | Uninterpolated Alpha |
DXT5 | N/A | N/A | N/A | 8 | 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 | Uncompressed du/dv Format |
UVLX8888 | N/A | N/A | N/A | N/A | 32 | False | True | |
UVWQ8888 | N/A | N/A | N/A | N/A | 32 | False | True |
HDR(High Dynamic Range Imaging 高动态范围图像) 压缩
HDR纹理可以用BGRA8888格式以压缩形式储存。
将压缩颜色转换回HDR整数值的公式是:
RGB = RGB * (A * 16)
对于浮点HDR公式则是:
RGB = (RGB * (A * 16)) / 262144
选择一个图像格式
尽管VTF提供了对多种图像数据格式的支持,但您一般使用的图像数据格式只有下列少数几种:
BGR888: 这种格式的纹理没有alpha通道,有着非常细微的梯度(即法线贴图(normal maps)或者光晕)。
BGRA8888: 这种格式的纹理有alpha通道和非常细微的梯度(即法线贴图(normal maps)或者光晕)。它也可以用来生产非常高质量的纹理。
DXT1: 一种非常典型的纹理格式,没有alpha通道 (也被称为BC1)。
注解: DXT1支持1位alpha精度。然而,任何alpha值为0的区域将是全黑的。因此,这个功能最好在使用$alphatest语句时使用。
DXT3: DXT5一般都作为DXT3的上位选择,但是DXT3也是可以接受的(不一定更好) ,这是一种带alpha通道和尖锐梯度的纹理 (也被称为BC2)。
DXT5: 一种带有alpha通道的经典纹理格式 (也被称为BC3)。
I8: 没有alpha通道,梯度非常细微的黑白纹理格式(即光晕).
IA88: 有alpha通道,梯度非常细微的黑白纹理格式(即光晕或者烟雾)
RGBA16161616F: HDR纹理格式.
UV88: Du/Dv 映射(Du/dv_map)的纹理格式.
在很多地方你都能找到各种关于DXT压缩格式的技术细节。
图像旗标
提示:大多数着色器都被默认配置为材质参数,而不是纹理旗标。
一个VTF文件可以包含以下旗标 (version 7.5):
Flag | Value | Comment |
Point Sampling | 0x0001 | Low quality, "pixel art" texture filtering. |
Trilinear Sampling | 0x0002 | Medium quality texture filtering. |
Clamp S | 0x0004 | Clamp S coordinates. |
Clamp T | 0x0008 | Clamp T coordinates. |
Anisotropic Sampling | 0x0010 | High quality texture filtering. |
Hint DXT5 | 0x0020 | Used in skyboxes. Makes sure edges are seamless. |
PWL Corrected | 0x0040 | Purpose unknown. |
SRGB | n/a | Uses space RGB. Useful for High Gamuts. Deprecated in 7.5. |
No Compress | 0x0040 | No DXT compression used. Deprecated |
Normal Map | 0x0080 | Texture is a normal map. |
No Mipmaps | 0x0100 | Render largest mipmap only. (Does not delete existing mipmaps, just disables them.) |
No Level Of Detail | 0x0200 | Not affected by texture resolution settings. |
No Minimum Mipmap | 0x0400 | If set, load mipmaps below 32x32 pixels. |
Procedural | 0x0800 | Texture is an procedural texture (code can modify it). |
One Bit Alpha | 0x1000 | One bit alpha channel used. |
Eight Bit Alpha | 0x2000 | Eight bit alpha channel used. |
Environment Map | 0x4000 | Texture is an environment map. |
Render Target | 0x8000 | Texture is a render target. |
Depth Render Target | 0x10000 | Texture is a depth render target. |
No Debug Override | 0x20000 | |
Single Copy | 0x40000 | |
Pre SRGB | 0x80000 | SRGB correction has already been applied |
One Over Mipmap Level In Alpha | 0x80000 | Fill the alpha channel with 1/Mipmap Level. Deprecated (Internal to VTEX?) |
Premultiply Color By One Over Mipmap Level | 0x100000 | (Internal to VTEX?) |
Normal To DuDv | 0x200000 | Texture is a DuDv map. (Internal to VTEX?) |
Alpha Test Mipmap Generation | 0x400000 | (Internal to VTEX?) |
No Depth Buffer | 0x800000 | Do not buffer for Video Processing, generally render distance. |
Nice Filtered | 0x1000000 | Use NICE filtering to generate mipmaps. (Internal to VTEX?) |
Clamp U | 0x2000000 | Clamp U coordinates (for volumetric textures). |
Vertex Texture | 0x4000000 | Usable as a vertex texture |
SSBump | 0x8000000 | Texture is a SSBump. (SSB) |
Border | 0x20000000 | Clamp to border colour on all texture coordinates |
文件格式
VTF图像格式介绍如下:
VTF 布局设计
VTF 数据头(Header)
VTF 低分辨率图像数据(Low Resolution Image Data)
对应的Mipmap (从最小到最大)
对应的帧 (从首个到最后一个)
对应的 (从首个到最后一个)
对应的 Z 切片(Z Slice;最小到最大;;随着Mipmap变化)
VTF 高分辨率图像数据(High Resolution Image Data)
VTF 列举(enumerations)
VTF 数据头(header)
VTF 资源条目(Resource Entry)
标签(Tags)
VTF 低分辨率图像数据
低分辨率图像被在文件的头数据中所描述的格式紧密包装。 低分辨率图像数据通常以DXT1压缩图像格式存储。其尺寸最大即是宽度和高度不超过16像素的mipmap尺寸。比如说对于一个 256x256 像素的 VTF是16x16,;对于一个256x64 像素的VTF是 16x4;1x32 像素的VTF是: 1x16,; 4x4 像素的VTF是 4x4,以此类推。
VTF 高分辨率图像数据
高分辨率图像被在文件的头数据中所描述的格式紧密包装。 通用的数据格式包含 DXT1, DXT5, BGR888, BGRA8888 和UV88。所有维度都必须是4的倍数。
历史版本
目的:解决游戏特定的兼容性问题
v7.5
发布于July 19th, 2010 ,作为 Alien Swarm 异星虫群 的一部分
同于 v7.4.
重定义并修改了两个纹理旗标
球形地图正式归为冗余信息
VTF内部创建过程的大部分更改都是使用VTEX, 比如说: Mipmap衰减(MipMap fading), alpha衰减(Alpha decay) 和 XBox360 格式.
v7.4
发布于October 10th, 2007 作为半条命2橙盒版的一部分。
同于 v7.3.
解决有关伽马校正在XBOX360电视输出纹理执行结合系统内存分页池的问题。
v7.3
添加了一个可扩展的面向资源的结构。
增加了CRC,纹理的LOD控制,列表资源以及向后兼容的图像和低分辨率图像资源。
添加了几种定制化的深度模板格式(供内部引擎使用),以及法线贴图格式和线性未压缩格式。
发布于September 18th, 2007 作为 军团要塞2 beta测试的一部分.
v7.2
增加了体积纹理支持。
发布于September 23rd, 2005 作为Steam引擎升级的一部分。
v7.1
为环境映射增加了球形地图支持(这是为了支持DirectX 6,后来被砍掉了)。
v7.0
最初发布的版本 (只在内部发布,然而,一些v7.0纹理被公开发表了)。
执行(Implementation)
一个独立于Steam实现的VTF图像文件格式的例子可以在LGPL C/ c++库的VTFLib中找到。
Last updated