【问题标题】:Lossless texture compression for OpenGLOpenGL的无损纹理压缩
【发布时间】:2019-02-14 01:19:31
【问题描述】:

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

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

【问题讨论】:

  • 澄清一下,它们是否这么大(或者有这么多)需要压缩存储?在调用 glTexImage2D 之前在 CPU 上解压缩它们对你有用吗?
  • 每个大约 3 MB,而且确实有很多。我想节省 CPU 并尽可能多地使用 GPU,但是如果其他方法都失败了,我会尝试在 CPU 上解压缩。不过,有没有我可以轻松使用 OpenGL 的格式?

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


【解决方案1】:

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

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

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

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

您的选择仅限于以下几点:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多