3TC信息
S3TC的压缩率由每个基本格式决定,23位纹理实际上被存储成32位纹理,因此GL_COMPRESSED_RGB_S3TC_DXT1_EXT也能达到8:1的压缩率。S3TC的压缩公式如下,其中8位块大小用于DXT1,16位用于DXT3和DXT5。
图像容量 = 块大小 * 格子(宽/4)* 格子(高/4)
不同分辨率下,压缩和未压缩图像之间的差异由缩小倍数和放大倍数过滤器决定。
图3左边的是128*128未压缩纹理,右边是S3TC RGB DXT1压缩纹理,缩小倍数和放大倍数过滤器设置为GL_NEAREST(邻近点采样)

图4左边的是128*128未压缩纹理,右边是S3TC RGB DXT1压缩纹理,缩小倍数和放大倍数过滤器设置为GL_LINEAR(双线性过滤),根据过滤算法原理,双线性过滤比邻近点采样的图像要好。

图5左边的是64*64未压缩纹理,右边是S3TC RGB DXT1压缩纹理,缩小倍数和放大倍数过滤器设置为GL_NEAREST(邻近点采样)

图6左边的是64*64未压缩纹理,右边是S3TC RGB DXT1压缩纹理,缩小倍数和放大倍数过滤器设置为GL_LINEAR(双线性过滤),根据过滤算法原理,双线性过滤比邻近点采样的图像要好。

我们还可以比较一下未压缩的64*64位纹理与压缩的128*128纹理的区别,压缩纹理明显比未压缩纹理优越.
图7a是未压缩64*64纹理,b是RGB_DXT1 128*128压缩纹理,缩小倍数和放大倍数过滤器设置为GL_LINEAR(双线性过滤),它们占用相同的内存空间。

四、运行时间层
运行时间层的主要任务是把压缩纹理解压,从硬盘中取得压缩纹理再直接下载到OpenGL已经成为了许多
游戏的标准运行步骤,它有几个好处:
1、从快速媒体载入,减少了压缩纹理的占用的磁盘空间。
2、压缩纹理比未压缩纹理小,提高了主内存到纹理内存存储的效率。
3、纹理的尺寸减小,可以在视频内存中放入更多纹理,避免以性能损失极大的AGP方式来传送数据。
4、减少内存带宽消耗,把通道留给渲染像素,提高fps(frames r second,帧/秒),如:quake 3 32位色使用纹理压缩可增加20%的游戏速度。
运行时间层的处理过程很简单,首先读入纹理文件,然后决定长、宽、高、边界、内部格式、缓冲容量和图像的可用性,并利用glCompressedTexImage2D附加$#@60;internalFormat$#@62;集的方法来决定内部格式类型,最后压缩纹理将直接发到纹理缓存,源代码:
glBindTexture(GL_TEXTURE_2D, already_compressed_decal_map);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height,
border, image_size, data);
注意:由于压缩处理的过程很慢,运行时间层不会压缩动态纹理。
五、总结
OpenGL使用纹理压缩可以极大提高
程序性能,更好地还原图像的本来面目,已经成为显卡制造商未来发展的方向之一。希望通过上述讲解,能让各位对纹理压缩有更深一层的认识。