OpenGL 的无损纹理压缩

Lossless texture compression for OpenGL

我有几个 32 位(带 alpha 通道)位图图像,我将它们用作游戏中的基本信息。 RGBA 值的最细微变化都会破坏一切,所以我不能使用像 S3TC 这样的有损压缩方法。

是否有任何可用于 OpenGL 的可行的无损压缩算法?我正在使用片段着色器,我想使用 glCompressedTexImage2D() 方法来定义纹理。我还没有尝试使用 GL_COMPRESSED_RGBA 参数使用 OpenGL 压缩纹理,我是否有机会通过这种方式获得无损压缩?

与常规图像压缩不同的纹理压缩是为一个特定目的而设计的:作为 纹理。这意味着数据的快速随机访问。

无损压缩格式在涉及随机访问模式时往往表现不佳。主要的无损压缩格式是某种形式的 RLE 或基于 table 的编码。这些足以一次解压整个数据集,但它们 很糟糕 无法知道纹素 (U,V) 的值在哪个内存位置。

在访问纹理时,经常问这个问题。

因此,没有无损的硬件纹理压缩格式。

您的选择仅限于以下内容:

  1. 使用纹理内存作为一种缓存。也就是说,当您确定需要此帧中的特定图像时,将其解压缩。这可以在 CPU 或 GPU 上完成(通过计算着色器等)。请注意,对于快速 GPU 解压缩,您必须想出一种利用并行执行的压缩方案。大多数无损压缩格式并不是特别并行。

    如果某张图片一段时间未使用,则将其放入 "subject to be reused" 堆中。如果您需要解压缩一张新图像,您可以从那堆图像中取出最近最少使用的图像,而不是不断地 creating/destroying OpenGL 纹理对象。

  2. 构建您自己的无损压缩方案,专为您的特定需求而设计。如果您绝对需要纹理中的精确纹素值,我假设您在访问这些纹理时没有使用线性过滤。所以这些并不是真正的颜色;它们是关于纹素的任意信息。

    我可能会建议字段压缩(改进可用 space 中的位打包)。但是在不知道您的数据实际是什么或意味着什么的情况下,我不能说您的特定用例是否适合它。