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 应用程序相似)
我一直以为这些词只是使用某种特殊压缩方式的文件格式,但最近我发现了一种可以使用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 应用程序相似)