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

Mr *_*hen 3 opengl-es image-processing webgl

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

gma*_*man 5

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

桌面 GPU 支持DXT1、DXT3、DXT5

大多数移动 GPU 支持ETC1

PowerVR/Imgtec 制造的 GPU 支持PVRTC ,所有 iPhone(以及一些 Android?)

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

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

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

这是一篇解释 PVRTC 的文章另一篇关于 DXT/S3TC 的文章