OpenGL的无损纹理压缩

问题描述 投票:0回答:1

我有几个32位(带alpha通道)位图图像,我在游戏中使用它作为基本信息。 RGBA值的最轻微变化会破坏一切,因此我无法使用像S3TC这样的有损压缩方法。

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

opengl compression textures image-compression lossless-compression
1个回答
4
投票

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

无论是随机访问模式,无损压缩格式都不会很好。主要的无损压缩格式是某种形式的RLE或基于表的编码。这些对于一次解压缩整个数据集是足够的,但是它们能够知道texel(U,V)的值在哪个存储位置是很糟糕的。

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

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

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

  1. 使用纹理内存作为一种缓存。也就是说,当您确定在此帧中需要特定图像时,请将其解压缩。这可以在CPU或GPU上完成(通过计算着色器等)。请注意,对于快速GPU解压缩,您必须提出利用并行执行的压缩方案。大多数无损压缩格式并不特别平行。 如果特定图像在某段时间内未被使用,则将其放入“待重复使用”堆中。如果您需要解压缩新图像,您可以从该堆中取出最近最少使用的图像,而不是不断创建/销毁OpenGL纹理对象。
  2. 构建您自己的无损压缩方案,专为您的特定需求而设计。如果您绝对需要纹理中的精确纹理元素值,我假设您在访问这些纹理时不使用线性过滤。所以这些不是真正的颜色;它们是关于纹素的任意信息。 我可能会建议进行场压缩(在可用空间中改进位的打包)。但是,如果不知道您的数据实际是什么或意味着什么,我不能说您的特定用例是否适合它。
© www.soinside.com 2019 - 2024. All rights reserved.