PVR、ETC1、DXT1到底是什么。它们是某种文件格式还是只是压缩算法?

What exactly are PVR, ETC1, DXT1. They are some file format or just compression algorithm?

我一直以为这些词只是使用某种特殊压缩方式的文件格式,但最近我发现了一种可以使用DTX1作为压缩方式的文件格式"DDS"。所以我很好奇,如果它们都只是压缩算法,那是否意味着我可以使用 DXT1(ETC1,PVR)作为压缩方法来获取 PNG 图像?

它们是硬件支持的二进制压缩格式(不是文件格式)。

DXT1, DXT3, DXT5 在台式机 GPU 上受支持

ETC1 大多数移动 GPU 都支持

PVRTC 在 PowerVR/Imgtec 制造的 GPU 上受支持,它是所有 iPhones(和一些 Androids?)

如果你想使用它们,你通常 运行 一些离线工具来生成它们,然后为工具吐出的格式编写一个加载器或推出你自己的。然后,您将数据从文件中拉出并使用数据调用 gl.compressedTexImage2D(...)

压缩纹理格式的优势在于它们占用的 GPU 内存更少,因此您可以使用更多内存,而且它们占用的内存带宽更少,这意味着它们可能 运行 更快。缺点是,虽然它们是压缩的,但它们的压缩率几乎没有 .jpg(通常)那么小,因此它们可能需要更长的时间才能通过 Internet 传输。对于存储在本地计算机上的游戏,例如从 Steam 安装的游戏,您真的不关心游戏下载速度有多快,您预计它需要 10 分钟到几个小时。对于打算在网页上玩的 WebGL 游戏,大多数用户不会等待很长时间,因此需要权衡取舍。

这些格式的另一个问题就像上面所说的那样,它们只适用于某些设备。要跨设备支持它们,您需要通过调用 gl.getExtension 查询各种压缩格式来查询 WebGL,然后从您的服务器请求用户设备的正确纹理集。对于原生游戏,这通常不是问题,因为 Android 应用程序与 iPhone 应用程序分开制作,并且与桌面应用程序分开,但理想情况下,对于网页,您希望任何设备都能够运行 同一页。台式机、平板电脑,也许是智能手机。 (虽然 android 有很多 GPU,所以问题与本地 android 应用程序相似)

这是an article that explains PVRTC and another about DXT/S3TC