DDS是DirectDraw Surface的缩写,它是DirectX纹理压缩(DirectX Texture Compression,简称DXTC)的产物。
DXTC减少了纹理内存消耗的50%甚至更多,有3种DXTC的格式可供使用,分别是DXT1,DXT3和DXT5。
DXT1 压缩比例:1:8
压缩比最高,它只有1Bit Alpha,Alpha通道信息几乎完全丧失。一般将不带Alpha通道的图片压缩成这种格式。如WorldWind用的卫星图片
DXT3 压缩比例:1:4
使用了4Bit Alpha,可以有16个Alpha值,可很好地用于alpha通道锐利、对比强烈的半透和镂空材质。
DXT5 压缩比例:1:4
使用了线形插值的4Bit Alpha,特别适合Alpha通道柔和的材质,比如高光掩码材质。
许多3D软件包括大部分游戏都用dds格式,又称“贴图”,许多fans通过修改dds文件可以生成特殊显示效果。
nVidia提供了PhotoShop使用dds的插件,通过该插件也可以生成dds文件。
还有一种生成dds文件的方法是使用nVidia提供的命令行工具nvdxt.exe
DDS 支持各种输出格式,具体情况取决于分配给红、绿和蓝 (RGB) 通道、可选 alpha 通道(透明度)和可能未使用位数的像素数量。这也是一组压缩格式。
A8 R8 G8 B8—每像素 32 位: 对于 RGB 和 alpha 通道,每像素 8 位。
A1 R5 G5 B5—每像素 16 位: 对于 RGB ǖ溃�肯袼?5 位,alpha 通道,每像素 1 位。
A4 R4 G4 B4—每像素 16 位: 对于 RGB 和 alpha 通道,每像素 4 位。
R8 G8 B8—每像素 24 位: 对于 RGB 通道,每像素 8 位;无 alpha。
R5 G6 B5—每像素 16 位: 对于 R 和 B 通道,每像素 5 位,对于 G 通道,每像素 6 位;无 alpha。
A2 R10 G10 B10—每像素 32 位: 对于 RGB 通道,每像素 10 位;alpha 通道,每像素 2 位。
X8 R8 G8 B8—每像素 32 位: 对于 RGB 通道,每像素 8 位;8 位未使用;无 alpha。
X1 R5 G5 B5—每像素 16 位: 对于 RGB 通道,每像素 5 位;1 位未使用;无 alpha。
R3 G3 B2—每像素 8 位: 对于 R 和 G 通道,每像素 3 位,对于 B 通道,每像素 2 位;无 alpha。
A8 R3 G3 B2—每像素 16 位: 对于 R 和 G 通道,每像素 3 位,对于 B 通道,每像素 2 位;对于 alpha 通道,每像素 8 位。
X4 R4 G4 B4—每像素 16 位: 对于 RGB 通道和 4 个未使用位,每像素 4 位。
A16 B16 G16 R16—每像素 64 位: 对于 RGB 和 alpha 通道,每像素 16 位。
DXT1—带有 1 位 alpha 的压缩格式。
DXT2—带有 4 位预乘 alpha 的压缩格式。
DXT3—带有 4 位 alpha 的压缩格式,无预乘。
DXT4—带有插补预乘 Alpha 的压缩格式。
DXT5—带有插补 Alpha 的压缩格式,但是无预乘。
生成 Mipmap—启用该选项之后,将生成该图像的 mipmap。默认设置为禁用状态。
Mipmap 是一组较低细节的位图。第一个是原始图像大小的一半,下一个是该图像的一半,依次类推,直到单个像素。(可以将它们的排列方式视为四棱锥。)当未以完全大小显示纹理时,它们既可用于优化显示时间,也可以减少锯齿。例如,如果原始 DDS 图像是 512 x 512 像素,但是其显示的区域只是 100 像素的方形,则显示设备将在 128 x 128 mipmap 和 64 x 64 mipmap 之间插补。
JPEG:(文件扩展名为 .jpg 或 .jpeg ) 应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除,从而达到较大的压缩比(可达到2:1甚至40:1),所以“身材娇小,容貌姣好”,特别适用于网络环境。
PNG:与JPEG格式类似,网页中有很多图片都是这种格式,压缩比高于GIF,支持图像透明,可以利用Alpha通道调节图像的透明度。
BMP:Windows系统下的标准位图格式,使用很普遍。其结构简单,未经过压缩,一般图像文件会比较大。它最大的好处就是能被大多数软件“接受”,可称为通用格式。
GIF:分为静态GIF和动画GIF两种,支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,所以归根到底GIF仍然是图片文件格式。
其他相关格式:
PSD:图像处理软件Photoshop的专用图像格式,图像文件一般较大,包含图层等众多信息。
PCX:ZSOFT公司在开发图像处理软件Paintbrush时开发的一种格式,存储格式从1位到24位。它是经过压缩的格式,占用磁盘空间较少,并具有压缩及全彩色的优点。
DXF:三维模型设计软件AutoCAD的专用格式,文件小,所绘制的图形尺寸、角度等数据十分准确,是建筑设计的首选。
CDR:著名的图形设计软件——CorelDRAW的专用格式,属于矢量图像,最大的优点“体重”很轻,便于再处理。
DDSURFACEDESC2 简介
-----------------------------------------------------------------------------------------------------------------
typedef struct _DDSURFACEDESC2 {
DWORD dwSize; //整个结构体(或此结构对象)大小
DWORD dwFlags; //一些标志
DWORD dwHeight; //图像高
DWORD dwWidth; //图像宽
union
{
LONG lPitch;
DWORD dwLinearSize;
} DUMMYUNIONNAMEN(1);
DWORD dwBackBufferCount;
union
{
DWORD dwMipMapCount;
DWORD dwRefreshRate;
} DUMMYUNIONNAMEN(2);
DWORD dwAlphaBitDepth;
DWORD dwReserved;
LPVOID lpSurface;
DDCOLORKEY ddckCKDestOverlay;
DDCOLORKEY ddckCKDestBlt;
DDCOLORKEY ddckCKSrcOverlay;
DDCOLORKEY ddckCKSrcBlt;
DDPIXELFORMAT ddpfPixelFormat;
DDSCAPS2 ddsCaps;
DWORD dwTextureStage;
} DDSURFACEDESC2, FAR *LPDDSURFACEDESC2;
坦率的说,编写DirectDraw的应用程序其实并不难。但是事情往往是这样,80%的工作只需要我们花费20%的时间就可以完成,而剩下的20%的工作却需要我们花费80%的时间来完成。DirectDraw编程比这还要严重,就笔者的看法,至少90%的工作只需要我们不到10%的时间来完成,而剩下的不到10%的工作却至少需要我们90%的时间!结构DDSURFACEDESC就是10%的一部分,它较为复杂,它嵌套了其它的结构。让我们看看这个怪物到底做了什么。我只说说重点的部分:
· DWORD dwSize:任何DirectX结构都有dwSize这个成员,表示结构的大小。有了它,当函数接收到指向这些结构的指针时,就可以测定结构的大小了。
· DWORD dwFlags:太好了,又有一大堆标志常量了^_^ !这些标志告诉接收函数哪些数据成员是有效的。要想使需要的数据成员有效,就必须传递相对应的标志常量给dwFlags,你当然可以用“|”组合它们。以下是列表:
◎ DDSD_ALL:所有的数据成员都有效。
◎ DDSD_ALPHABITDEPTH:表示数据成员dwAlphaBitDepth有效。
◎ DDSD_BACKBUFFERCOUNT:表示数据成员dwBackBufferCount有效。
◎ DDSD_CAPS:表示数据成员ddsCaps有效。
◎ DDSD_CKDESTBLT:表示数据成员ddckCKDestBlt有效。
◎ DDSD_CKDESTOVERLAY:表示数据成员ddckCKDestOverlay有效。
◎ DDSD_CKSRCBLT:表示数据成员ddckCKSrcBlt有效。
◎ DDSD_CKSRCOVERLAY:表示数据成员ddckCKSrcOverlay有效。
◎ DDSD_HEIGHT:表示数据成员dwHeight有效。
◎ DDSD_LINEARSIZE:表示数据成员dwLinearSize有效。
◎ DDSD_LPSURFACE:表示数据成员lpSurface有效。
◎ DDSD_MIPMAPCOUNT:表示数据成员dwMipMapCount有效。
◎ DDSD_PITCH:表示数据成员lPitch有效。
◎ DDSD_PIXELFORMAT:表示数据成员ddpfPixelFormat有效。
◎ DDSD_REFRESHRATE:表示数据成员dwRefreshRate有效。
◎ DDSD_TEXTURESTAGE:表示数据成员dwTextureStage有效。
◎ DDSD_WIDTH:表示数据成员dwWidth有效。
· DWORD dwheight,dwWidth:表示要创建表面的尺寸。也就是往显卡写入图像的宽高以象素为单位。
· LONG lPitch:这个需要好好解释一下。lPitch表示从画面一行行首数据到下一行行首数据的距离,以字节为单位。例如,640×480×16,每一行有640个象素,每个象素需要两个字节装颜色的信息,所以pitch应该是1280个字节,对不对?可能有一些显示卡要多于1280,这每行多于的内存没有装置任何的图形数据,但是防备有些显示卡不能在线性内存模式显示图形,你还是把多于地放在那吧。这种情况很少发生,但你最好还是考虑在内。
· LPVOID lpSurface:指向表面内存开始地址的指针。不管你使用什么显示模式,你都可以用DirectDraw创建的线性地址模式操作表面象素。要想这样,你必须锁住表面,但这已经超出我们现在所学的了。
· DWORD dwBackBufferCount:后缓冲区的数目。以后我们会在提到它。
· DWORD ddckCKDestBlt,ddckCKSrcBlt:前者为描述位转换操作的目标颜色值,后者是源颜色值。我们将在以后的文章中具体介绍。
· DDPIXELFORMAT ddpfPixelFormat:这个结构包含了描述显示模式的象素格式标识符。以后会具体介绍,现在就不多说了。
· DDSCAPS2 ddsCaps:这是最后一个重要的结构。它是一个充满控制标志的结构。感谢菩萨,这是一个小结构,结构成员中只有一个很重要。让我们看一看:
typedef struct _DDSCAPS2{
DWORD dwCaps;
DWORD dwCaps2;
DWORD dwCaps3;
DWORD dwCaps4;
} DDSCAPS2, FAR* LPDDSCAPS2;
最重要的就是dwCaps了。第三个和第四个成员从来没有用过,是为将来准备的。总之,dwCaps可以使用如下的值,当然可以用“|”组合。以下是最为常用的,其它的你若有兴趣,自己查好了。
· DDSCAPS_BACKBUFFER:指出这个表面是需要表面切换结构的后缓冲区。
· DDSCAPS_COMPLEX:是一个复杂表面,由主表面,一个或多个粘贴表面组成,通常是为了页面切换。
· DDSCAPS_FLIP:指出这个表面是表面切换结构的一部分。前缓冲区紧跟着一个或多个建立好的后缓冲区。
· DDSCAPS_FRONTBUFFER:是关于表面切换结构的前缓冲区。
· DDSCAPS_LOCALVIDMEM:指出在true、local video memory【不知怎么翻译】中建立表面。如果使用该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志,但不能同DDSCAPS_NONLOCALVIDMEM标志同时使用。
· DDSCAPS_MODEX:指出这个表面是Mode X模式(320×200或320×240)的表面。
· DDSCAPS_NONLOCALVIDMEM:指出表面建立在non-local video memory【不知怎么翻译】中。如果定义该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志。但是不能同DDSCAPS_LOCALVIDMEM同时使用。
· DSCAPS_OFFSCREENPLAIN:这是一个简单的离屏表面。
· DDSCAPS_OWNDC:这个表面将具有长周期的设备上下文。
· DDSCAPS_PRIMARYSURFACE:主表面。
· DDSCAPS_STANDARDVGAMODE:是标准的VGA模式表面。不能同DDSCAPS_MODEX同用。
· DDSCAPS_SYSTEMMEMORY:建立在系统内存里的表面。
· DDSCAPS_VIDEOMEMORY:这个表面建立在显示内存里。
天啊,终于介绍完了这个结构。现在我们准备建立表面吧。第一步当然是填充DDSURFACEDESC2结构。Microsoft推荐大家当你使用一个结构之前,你应该把它先初始化为0。