【问题标题】:Opengl best texture compression format on desktop nowadays当今桌面上最好的 Opengl 纹理压缩格式
【发布时间】:2014-12-18 14:33:14
【问题描述】:

我没有找到任何在线更新的有效资源,并比较了桌面版 OpenGL 的纹理压缩格式。一切要么过时,要么适用于移动设备。

在我的平台上,我看到了许多不同的格式:

GL_ARB_compressed_texture_pixel_storage
GL_ARB_texture_compression
GL_ARB_texture_compression_bptc
GL_ARB_texture_compression_rgtc
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_latc
GL_EXT_texture_compression_rgtc
GL_EXT_texture_compression_s3tc
GL_NV_texture_compression_vtc

如果我直接查询GL_COMPRESSED_TEXTURE_FORMATS,我还有一些其他的

  public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
  public static final int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
  public static final int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;

  public static final int GL_PALETTE4_RGB8_OES = 0x8B90 = 35728;
  public static final int GL_PALETTE4_RGBA8_OES = 0x8B91;
  public static final int GL_PALETTE4_R5_G6_B5_OES = 0x8B92;
  public static final int GL_PALETTE4_RGBA4_OES = 0x8B93;
  public static final int GL_PALETTE4_RGB5_A1_OES = 0x8B94;
  public static final int GL_PALETTE8_RGB8_OES = 0x8B95;
  public static final int GL_PALETTE8_RGBA8_OES = 0x8B96;
  public static final int GL_PALETTE8_R5_G6_B5_OES = 0x8B97;
  public static final int GL_PALETTE8_RGBA4_OES = 0x8B98;
  public static final int GL_PALETTE8_RGB5_A1_OES = 0x8B99 = 35737;

  public static final int GL_COMPRESSED_RGB8_ETC2 = 0x9274 = 37492;
  public static final int GL_COMPRESSED_SRGB8_ETC2 = 0x9275;
  public static final int GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;
  public static final int GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;
  public static final int GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278;
  public static final int GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279 = 37497;
  public static final int GL_COMPRESSED_R11_EAC = 0x9270 = 37488;
  public static final int GL_COMPRESSED_SIGNED_R11_EAC = 0x9271;
  public static final int GL_COMPRESSED_RG11_EAC = 0x9272;
  public static final int GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273 = 37491;

虽然here Nicol 说不要依赖glGet,但要依赖扩展..

据我所知,它们都是有损的,对吧?

搜索 S3TC/DXTx/BCx 似乎是在线记录最多的一种,但它也很古老,而且性能优于更现代的格式。

比较它们的一个非常好的网站是this one,但它是针对移动设备的,也是我发现的唯一一个解释 DXT3 和 DXT5 不同目标的网站。但它错过了EC2,这在 GLES3 和 GL4.3 上似乎是强制性的。

另一个有趣的网站是this one

PVRTC 在性能方面似乎是最好的,但不幸的是它只能在专用硬件上运行。 ASTC 也很有前途,但与 PVRTC 有相同的缺点。 ATITC 的名字似乎也很古老(ATI 纹理压缩)

所以,我想知道您认为当今桌面上 GL3+ 的最佳压缩格式是什么。

编辑:添加另一个有趣的来自 Nvidia 的 link 纹理压缩,并强调 ASTC

【问题讨论】:

    标签: format compression textures opengl-3 opengl-4


    【解决方案1】:

    您似乎已经对可用的压缩格式进行了深入研究。

    这是我的 2cents 贡献:大多数压缩格式都是有损的。我猜只有 GL_OES_compressed_pa​​letted_texture 不会有损,但它只支持 16 或 256 色,并且对性能有一些担忧。它受到 Adreno GPU 以及一些 Intel 和 Mali 硬件的支持。此外,它也没有像 ETC1 那样被广泛支持。如果保真度至关重要,请考虑使用尺寸合适的未压缩纹理。您可以使用尺寸 (256/512/1024) 和颜色深度 (565/888),直到找到最佳的平衡质量/性能。通过允许可配置的纹理质量,您可以让您的客户选择最适合他/她的东西。

    此外,如果您的目标客户端硬件不支持,您是否选择了可用的“最佳”格式也没关系。 如果您的应用程序面向广泛的受众,您必须意识到必须降低图形要求。

    另一件事。今天的大多数“台式”PC 实际上是由英特尔显卡驱动的笔记本电脑。除非您有足够的资源来为无数当前的显卡(NVidia、AMD、Intel)编写替代路径,否则最好坚持使用最常见的解决方案。

    但是最常用/最可用的压缩格式是什么?好吧,检查一些数据库为Delphigl.de OpenGL databaseOpenGL ES Database,并考虑为每个平台报告的一些压缩格式的覆盖率。 请注意,一些旧硬件甚至不支持压缩纹理。

    作为默认选项,保留一组未压缩的纹理和一组压缩的 S3TC(DXT1、DXT3、DXT5)或 ETC/ETC2(对于没有透明度的 RGB 来说足够好)。

    祝你好运!

    【讨论】:

    • “我猜只有 GL_OES_compressed_pa​​letted_texture 不是有损但没有得到广泛支持” 不是有损?仅当原始纹理只有 任何硬件调色板支持。对内存的额外间接性和相关的延迟非常难以隐藏。 AFAIK 现在所有的 TC 方法都是固定速率的,没有间接性。
    • 是的,你是对的。压缩的调色板纹理只能处理 256 种颜色。但是正如您已经发布的那样,对于低颜色计数纹理,它不会有损,因为它保持与原始图像的逐像素颜色匹配。关于对此的支持,我建议您查看一些 GL 数据库,正如我之前的帖子中所述。在移动平台上,它是第二大受支持的压缩纹理格式(46% - 主要是 Adreno、Intel 和一些 Mali GPU),仅输给 ETC1(97%)。在我的应用程序中,我使用 ETC1 来制作非透明纹理。对于带有 alpha 的纹理,我使用小尺寸、未压缩的 RGBA。
    • 好的,所以可能有一些图形图像只有几种颜色,但你几乎可以争辩说在编辑阶段已经造成了损失。这可能有点走极端,但如果图像编辑器包知道 ETC 或 PVRTC 的内部结构,艺术家可以直接创建无损压缩纹理。其次,仅仅因为有调色板纹理的界面,并不意味着它们有硬件支持。 AFAIK,我已经在纹理压缩领域工作了 年,这些纹理通常被解压缩到 32bpp。
    • 同意。 ;) 我猜有些驱动器只是解压缩调色板纹理并使用 ETC1 或其他格式再次压缩它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多