DXT纹理压缩

转:http://blog.csdn.net/lhc717/article/details/6802951编码

咱们知道游戏中对于3D物体表面细节的表现最重要的仍是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图天然表现力也是越强,可是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中仍是很是很是重要的。 因此各个平台上都在使用纹理压缩的技术,让纹理贴图在内存占用和显示效果能达到一个尽量的平衡。在DirectX中,使用一种叫作DXT的纹理压缩技术,目前这种技术被大部分显卡所支持,经过对DXT的了解,咱们能够对纹理压缩技术管中窥豹。 DXT是一种DirectDraw表面,它以压缩形式存储图形数据,该表面能够节省大量的系统带宽和内存。即便不直接使用DXT表面渲染,也能够经过 DXT格式建立纹理的方法节省磁盘空间。Direct3D提供了D3DFMT_DXT1 ~ D3DFMT_DXT5共5种压缩纹理格式。其中,D3DFMT_DXT1支持15位RGB和1位alpha图形格式,D3DFMT_DXT二、D3DFMT_DXT3支持12位RGB和4位alpha,D3DFMT_DXT四、D3DFMT_DXT5则采起了线性插值方式生成alpha。
 

 

 

DXT1 
    DXT1格式主要适用于不具透明度的贴图或仅具一位Alpha的贴图(非彻底透明则即彻底不透明),对于彻底RGB565格式的贴图,DXT1具备4:1的压缩比,即平均每一个像素颜色占4位,虽然压缩比并非很好,可是DXT的特性使得它更适合用于实时游戏之中。 
    DXT1将每4×4个像素块视为一个压缩单位,压缩后的4×4个像素块占用64位,其中有2个16位的RGB颜色和16个2位索引,格式描绘以下图所示:spa

 

  DXT1中的两个RGB颜色负责表示所在压缩的4×4像素块中颜色的两个极端值,而后经过线性插值咱们能够再计算出两个中间颜色值,而16个2位索引则代表了这4×4个像素块所在像素的颜色值,2位能够表示4种状态,恰好能够完整表示color_0,color_1以及咱们经过插值计算出的中间颜色值color_2和color_3,而对于具备一位Alpha的贴图,则只计算一个中间颜色值,color_3用来表示彻底透明。 
    对于如何判断DXT1格式是表示不透明仍是具备1位alpha的贴图,则是经过两个颜色值color_0和color_1来实现的,若是color_0的数值大于color_1则表示贴图是彻底不透明的,反之则表示具备一位透明信息。 
DXT二、DXT3 
    DXT2和DXT3能够表示具备更复杂的透明信息的贴图,这两种格式采用的是显式的Alpha表示,咱们知道了在DXT1中,咱们使用64位数据来描述4*4的像素块的颜色信息,在DXT2和DXT3中,这部分颜色信息是不变的,而是经过另附加64位数据也就是每一个像素4位来表示他们的Alpha透明信息,而这4位的Alpha的信息一般状况下咱们能够采用直接编码的方式来表示便可。 
    这样每一个4×4像素块占用128位也就是8个字,0~3字表示透明信息;4~7表示前面描述的颜色的信息。 
    DXT2和DXT3的不一样之处在于,DXT2中颜色是已经完成了Premultiplied by alpha操做(已完成颜色与alpha的混合,当透明度发生改变时,直接改变总体颜色值,没必要再单独复合),DXT3的Alpha信息则是相对独立的,之因此要区分开了则是为了适应不一样的须要,由于有些场合须要独立的Alpha信息。.net

 

DXT四、DXT5 
    DXT四、DXT5也是用于表示具备复杂的透明信息的贴图,与2和3不一样的是4和5的Alpha信息是经过线性插值计算所得,相似于DXT1的颜色信息。一样的,每4×4的像素块的透明信息占用64位,所不一样的是,64位中采用了2个8位的alpha值和16个3位的索引值,既然每一个像素的索引占3位,那么能够表示8种不一样的透明状态。 
    在这里插值的方法有两种,一种用于表示具备彻底透明和彻底不透明的状态,另外一种则是仅在给出的极端值alpha_0和alpha_1中进行插值。区分的方法也是经过比较alpha_0和alpha_1的大小来实现的,若是alpha_0大于alpha_1,则经过插值计算剩下的6个中间alpha值;不然,只经过插值计算4个中间alpha值,alpha_6直接赋值0,alpha_7直接赋值255。 
    DXT4和DXT5的区别同DXT2和DXT3的区别相同,DXT4的颜色值是理解为已经完成Premultiplied by alpha操做的。 
    另外须要注意的是,全部的压缩纹理格式都是2的幂,由于纹理压缩的单位是4×4像素,因此若是贴图的大小位16×2或者8×1这样的比例,系统会一样采用4×4的单位进行压缩,会形成必定的空间浪费,一样的大小会被占用,只是不会参与使用而已。blog

相关文章
相关标签/搜索