dxt4纹理压缩

时间:2012-04-02 08:08:43

标签: opengl image-processing graphics compression

当记住表现时,我们(不情愿地)使用纹理压缩。通过压缩引入的假象可能或多或少是可接受的。什么是不同的可能性,可以应用于原始图像级别的工作周围,以最小化压缩算法引入的伪像。在我目前的情况下,大多数人工制品在使用渐变时都会出现。

1 个答案:

答案 0 :(得分:4)

DXT压缩是关于插值或渐变的,如果你愿意的话。但是,你必须清楚它究竟是做什么的。 DXT压缩是一种妥协,它在非常差的压缩下提供相当差的质量,但它 提供了一些压缩,并且在硬件中实现几乎是微不足道的,并且几乎是零成本运行。这就是它被使用的原因。

有一些方法可以提高质量,但如果质量问题不可接受,唯一的解决方案是不使用DXT。 (此外,您在问题标题中使用的DXT4并未广泛使用,这是DXT5预乘)

首先,请注意:

  • DXT通过存储两个5:6:5颜色并在RGB空间中沿此线插值来编码4x4块纹素的颜色。插值量化为2位,因此每个像素只能有4个值可供选择。
  • DXT4 / 5中的Alpha通道存储两个8位alpha值,并使用3位内插器。
    • DXT2 / 3使用明确的4位/纹素alpha通道(即不在某些选定的8位值之间进行插值)。
    • DXT1可以假装一个1位的alpha通道,但这是一个排序/编码技巧,而且是一个不同的故事。
  • 如果没有转换到另一个颜色空间(由于端点的5:6:5存储),在DXT中无法获得纯灰色。

这意味着DXT原则上(或多或少)可以完美地再现许多没有太苛刻变化的水平,垂直或对角1D渐变,但它完全无法再现大多数其他模式(尽管它通常可以重现接近的东西。) 例如,如果您有2D渐变或旋转渐变,则没有办法(除了巧合!)存在一对两种颜色,这将允许整个4x4块很好地插值。此外,由于插值被量化为仅4个选择,绝大多数“奇数旋转”简单地不能被编码,也不能被许多颜色组合。然而,对于大多数“天然”纹理,这是可以接受的。

DXT压缩器通常会尝试在4x4单元内找到最佳匹配(尽管某些压缩器会/可能会做其他事情)。即使细胞内的梯度表现良好,也可能导致梯度踩踏。

您可以对DXT做些什么:

  • 使用不同的压缩机并选择最佳效果。不同的压缩机使用至少3种不同的(非强力)策略,给出了截然不同的结果。
  • 试试crunch库。在某个地方也有一个Windows GUI压缩器。虽然crunch主要旨在生成较小的(压缩后压缩)文件,并且它最终受到DXT块格式的技术限制的约束,但它使用了一种不寻常的搜索技术,它考虑了更大的范围。 可能会发生这种情况,它可以让您的渐变中的一个或另一个看起来更好看。
  • 避免使用2D或未与u / v或对角线对齐的渐变,因为您知道无法对这些渐变进行编码。
  • 压缩前将自然图像转换为非RGB色彩空间。 YCoCg和YCbCr可以是候选者,或JPEG-LS变换。人眼在各个方面都不是同样敏感的。有些错误不太明显。使用不同的颜色空间可以利用它。
  • 如果您不需要alpha,请将alpha通道用于最重要的通道,因为您知道它具有8位端点分辨率(而不是5/6)和3位插值器而不是2位。否则,使用绿色表示最重要的通道,因为它还有一位。
  • 对于手绘纹理,您可以尝试使用5:6:5匹配的颜色,这将至少为这些颜色提供完美的点击。虽然对于“绘制”的纹理(看起来像漫画的东西),DXT通常是一个非常不明智的选择。
  • 如果质量没有削减它,不要使用DXT(是的,这听起来像一个愚蠢的建议,但它确实是......如果它不合适,不要使用它)。