OpenGL 的无损纹理压缩

ner*_*kan 0 compression opengl textures lossless-compression image-compression

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

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

Nic*_*las 5

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

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

在访问纹理时,这个问题会被问到很多

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

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

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

    如果某个特定图像有一段时间没有使用过,则将其放入“待重用对象”堆中。如果您需要解压缩新图像,您可以从该堆中取出最近最少使用的图像,而不是不断创建/销毁 OpenGL 纹理对象。

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

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