Home > 程序/算法 > DXT++纹理压缩格式(续)

DXT++纹理压缩格式(续)

November 2nd, 2010 Leave a comment Go to comments

之前写过一篇文章DXT++纹理压缩格式,讨论了将dds文件进一步压缩的可能。上个周末花了时间将文中提到的算法实现了。

结果发现效果没有想象中的好,压缩是压缩了,但是压缩比基本和直接把dds压缩成zip格式相当,甚至不如压缩比更高的7z格式。 不要被文中最后提到的两个例子蒙骗,那两个是很特殊的纹理,颜色数非常少……

所以说目前来看,dxt++无损压缩的实用价值不大,因为用zip压缩也能达到类似的压缩比,可能的利用价值在于它可以通过损失一些颜色数,简单的说就是把近似的颜色合并,减少huffman编码的比特数从而进一步提高压缩比。反正dds本身已经是有损压缩,画质要求不高的话再损一点可能也能接受。

这个算法本身来自网络,所以干脆也开源了,托管在google code上,svn地址是http://dxtpp.googlecode.com/svn/trunk/ ,包含所有源代码,一个测试工程和一张测试用dds图片(老奶奶Lenna)

目前还很土,只支持DXT1格式,而且不支持mipmap,接下来会尝试一下有损压缩,如果确实有前途的话,我会继续完善其他DXT分支格式的支持。

Categories: 程序/算法 Tags:
  1. yao
    November 3rd, 2010 at 14:20 | #1

    感觉他这个算法对卡通风格的贴图比较适合。另外他还提到了在压缩indice时,他会反复尝试使用不同的编码长度,选择压缩比最高的一种。不过我感觉这个对压缩率影响应该也不大。

  2. yao
    November 3rd, 2010 at 15:55 | #2

    另外对NormalMap压缩率会比对DiffuseMap高,至少Normal.z可以不存。
    还有个想法,不一定要做颜色合并,还可以对color table做一下重新排序,将相似的颜色排到一起,然后对这个color table再次使用颜色压缩算法(目前想到可以用JPEG算法,或类似于dxt1的压缩算法,使用一部分颜色的插值,来表示另一部分颜色,还可以改成动态调整block的大小。)

  3. November 4th, 2010 at 11:07 | #3

    我目前是固定用8bit的字长来压缩selectors,基本上只能压缩20%~30%,试过16bit,结果更差。可能在这两个长度之间某个取值能好一些,但我也怀疑能好到哪里去。这部分数据占到DXT1数据的一半,而且只能无损压缩,瓶颈主要就在这里。

    @yao

  4. November 4th, 2010 at 11:20 | #4

    卡通风格或者normalmap的特征都是颜色少,color table那部分能压缩的更小,主要还是selector不好压缩,所以总体很难压到50%以下

    你说的再次压缩color table的想法不错……

    @yao

 

Spam Protection by WP-SpamFree