Menu Home

DDS

C++创建DDS文件

OS: ubuntu12.04 创建DDS文件头 这里只使用DXT1压缩,mipmaps为1,输入格式为GBR #define PUTL32(buf, l) \ (buf)[0] = ((l) ) & 0xff; \ (buf)[1] = ((l) >> 8) & 0xff; \ (buf)[2] = ((l) >> 16) & 0xff; \ (buf)[3] = ((l) >> 24) & 0xff; int compression = DDS_COMPRESS_BC1; unsigned int rmask = 0x00ff0000; unsigned int gmask […]

DDS图像格式

名词解释 DDS是一种图片格式。DirectDraw Surface的缩写,它是DirectX纹理压缩(DirectX Texture Compression,简称DXTC)的产物。 我们可以利用一些程序轻松地将bmp,tga等文件转化为dds文件,也有photo, gimp的插件能帮助我们利用我们所熟悉的工具来完成转化工作。dds档还起到了压缩文件大小的作用,这在游戏制作中是很重要的,更小的纹理容量意味着显示速度的增加和显存要求的降低在选择生成文件时,有多种格式可供选择。 DDS文件格式要追述到S3(Silicon & Software Systems)公司提出的一种纹理压缩格式S3TC(S3 Texture Compression), 其目的是通过对纹理的压缩, 以达到节约系统带宽并提高效能的目的. S3TC就是通过压缩方式, 利用有限的纹理缓存空间来存储更多的纹理, 因为它支持6:1的压缩比例, 所以6M的纹理可以被压缩为1M存放在材质缓存中, 从而在节约了缓存的同时也提高了显示性能. 后来的DXTC和FXT1都是与S3TC类似的技术, 它们分别是微软和3dfx开发的纹理压缩标准, FXT1能提供比S3TC更高的压缩比, 达到8:1, 同时它也在3DFX新版本的Glide中得到支持. DXTC是1999年微软从S3公司取得S3TC的授权后更名而来的, 并在DirectX6中提供了支持, 即使用户的图形硬件不能支持S3TC, DirectX API会自动解码压缩后的纹理贴图. 压缩纹理贴图可以使用高品质的离线压缩器, 不会造成加载程序时有很多延时, 而DDS文件就可以使用DXTC方式压缩或是存储未压缩的像素格式。 格式介绍

像素格式

像素格式 像素格式(pixel format)像素色彩按分量的大小和排列。这种格式以每个像素所使用的总位数以及用于存储像素色彩的红、绿、蓝和 alpha 分量的位数指定。 像素格式 像素格式描述了像素数据存储所用的格式。定义了像素在内存中的编码方式。下面的像素格式 (PF_*) 类型定义了: 本地格式 (PF_A8R8G8B8 以及其他大量的不同的类型) 这意味着在内存中使用了本地储存方式(big endian或者little endian,包括16,24,32位)的整形数据。同时意味着可以把PF_A8R8G8B8格式的图片看作一个32位的整形数组,在16进制表现为0xAARRGGBB。这些字母的意义我们在稍后会提供。 位组格式Byte formats(PF_BYTE_*) 在这种格式下每个通道对应一个byte,通道在内存理的组织方式和格式名称定义的相同。例如PF_BYTE_RGBA格式的像素包含了四个byte,一个对应红色,一个绿色,一个蓝色,以及一个alpha通道。 Short格式(PF_SHORT_*) 在这种格式下每个通道对应一个unsigned short数据(16 bit整型),通道在内存里的组织方式和格式名称定义的相同。例如PF_BYTE_RGBA格式的像素包含了四个unsigned short数据,一个对应红色,一个绿色,一个蓝色,以及一个alpha通道。 Float16 格式(PF_FLOAT16_*) 在这种格式下每个通道对应一个16 bit浮点数,通道在内存理的组织方式和格式名称定义的相同。例如PF_BYTE_RGBA格式的像素包含了四个16 bit浮点数数据,一个对应红色,一个绿色,一个蓝色,以及一个alpha通道。16 bit浮点数也被称为半浮点(half float),非常类似于IEEE 对32bit单精度浮点数标准,只不过它只有5个exponent位和10个mantissa位而已。值得注意,这并不是一个标准的C++数据,CPU对其支持也不够好,不过GPU却能如同处理32bit浮点数一样高效的处理它。 Float32格式(PF_FLOAT32_*) 在这种格式下每个通道对应一个32 bit浮点数,通道在内存理的组织方式和格式名称定义的相同。例如PF_BYTE_RGBA格式的像素包含了四个32 bit浮点数数据,一个对应红色,一个绿色,一个蓝色,以及一个alpha通道。在C++中,这个数据就是普通的float。just “float”。 压缩格式formats (PF_DXT[1-5]) S3TC压缩纹理格式。