【问题标题】:DXT Compression is yielding same filesize as original PNGDXT 压缩产生与原始 PNG 相同的文件大小
【发布时间】:2012-10-03 08:50:18
【问题描述】:

我正在尝试使用原始 PNG 的 DXT 压缩将我的纹理转换/压缩为 DDS 格式。我在 Mac 上,所以我使用的是图形转换器(尽管我也尝试过其他工具)。但无论我使用哪种 DXT 级别 (DXT1-5),文件大小都与原始 PNG 大致相同。

【问题讨论】:

  • 使用 gzip for DXT 可以获得良好的压缩率

标签: compression webgl textures dds-format


【解决方案1】:

PNG 是一种无损压缩格式,基于 zlib 和一些专门的过滤器。 它将保证复制与原始图像完全相同的图像。

因此,PNG 压缩率是可变的。 在复杂的图像上,压缩效果会很差。 在全黑图像上,压缩效果非常好。

相比之下,DXT 压缩具有固定压缩比。 这个比率对于 DXT1 是 8:1,对于 DXT5 是 4:1(假设 32 位 RGBA 输入)。 DXT5 的优势是更好的 Alpha 通道(用于透明度)。不需要就别用,浪费带宽。

您可以猜到,权衡是DXT 质量将是可变的。 DXT 质量仅被认为“足够好”,但远非完美。在图像的复杂部分,会有一些可见的伪影/失真。在简单的零件上,复制品几乎与原件完全相同。

PNG 的工作方式是将整个图像压缩为单个字节流。 DXT 压缩的工作方式是将图像切割成 4x4 像素的小块,然后将它们独立压缩到固定的压缩比。

这带来了根本不同的属性:DXT 纹理应该由 GPU 硬件直接解码。这是非常快的,几乎是免费的。这得益于纹理被切割成小块的事实:无需解码整个纹理来推送单个像素 => 只需解码适当的 4x4 块。此属性是解码过程的关键。

相比之下,PNG 对整个图像进行解码,因此通过查找直接 4x4 邻域之外的相关性来改进压缩的空间更大。但权衡是不可能只检索一小块像素:那就是整个图像,或者什么都没有。

如您所见,选择一种或另一种压缩方法与压缩比无关。出于存储目的,请选择 PNG,尤其是因为它是无损。为了实时快速显示大量纹理(3D 游戏的典型场景),DXT 是唯一可行的方法。

【讨论】:

  • 谢谢青色,我明白了。 DXT 有助于运行时内存,而 PNG 仅对文件大小有利。虽然在为 WebGL 压缩纹理和传输时间时需要考虑,这可能是一个更难的调用。
【解决方案2】:

DDS/DXT 纹理不保证小于 PNG。这取决于纹理的内容及其大小。纯色 PNG 或大多数纯色(如卡通的 png)会压缩得非常小,而照片通常不会很好地压缩。其中 DXT 是 4 比 1 或 6 比 1 压缩周期,具体取决于它是 DXT1、DXT3 还是 DXT5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多