OpenGL的无损纹理压缩

时间:2018-09-09 10:43:25

标签: opengl compression textures image-compression lossless-compression

我有几个32位(带有alpha通道)位图图像,这些图像在我的游戏中用作基本信息。 RGBA值的微小变化会破坏所有内容,因此我不能使用像S3TC这样的有损压缩方法。

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

1 个答案:

答案 0 :(得分:4)

与常规图像压缩相反,

纹理压缩是针对一种特定目的而设计的:纹理。这意味着可以快速随机访问数据。

当涉及到随机访问模式时,无损压缩格式往往效果不佳。主要的无损压缩格式是某种形式的RLE或基于表的编码。这些足以立即解压缩整个数据集,但很糟糕,因为它们能够知道texel(U,V)的值在哪个内存位置。

访问纹理时,这个问题被问了很多

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

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

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

    如果某个图像在一段时间内未使用,则将其放入“可重复使用的对象”堆中。而且,如果需要解压缩新图像,则可以从堆栈中删除最近使用最少的图像,而不用不断创建/销毁OpenGL纹理对象。

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

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