我正在做一些大型纹理的WebGL工作,并且已经达到了必须使用纹理压缩来减少VRAM和上传时间问题的地步。
我的应用程序需要在过去两三年的iOS和安卓手机上运行。这一次,桌面支持并不是必然的结果。
我知道iOS中的Chrome和Safari将允许我以PVRTC格式传递纹理,因为所有iOS设备都使用PowerVR GPU芯片组。因此,iOS是一个已解决的问题。
我还了解到几乎所有的安卓手机都正式支持爱立信纹理压缩(例如,ETC1) --这实际上是OpenGL 2规范所要求的。然而,我读过一些报告说,一些安卓实例上的浏览器实际上以一种未压缩的方式传递ETC1纹理。
WebGLStats非常强烈地警告我不要使用WEBGL_compressed_texture_etc1扩展:
警告不要使用。通常在浏览器中通过在CPU上解压缩并将全部大小上传到GPU来实现,具有严重的性能、vram和质量影响。修正了Chrome 57和Firefox ??
我知道的另一种常见格式是S3TC。这在桌面上得到了很好的支持,但Android的可操作性似乎仅限于使用NVIDIA芯片组的设备。我相信这些都是稀有的(特格拉?)
选择一种在现代Android手机上工作的纹理压缩格式,我的最佳选择是什么?
发布于 2017-07-14 18:07:00
什么纹理压缩格式是可用的Android?
这取决于设备上的GPU/驱动程序/浏览器
可以通过以下方法检查特定设备
gl.getSupportedExtensions();截至2017-07-15检查webglstats.com声称
我确信它不完全准确,因为我非常肯定NVidia盾支持s3tc,但也许没有人使用NVidia盾访问过使用webglstats.com的站点,或者用户数量太少,以致于减少到0%
选择一种在现代Android手机上工作的纹理压缩格式,我的最佳选择是什么?
您应该做的是支持所有的etc1,等等,atc,astc。将资产存储在文件夹或扩展名等中
assets/etc1/image1
assets/etc1/image2
assets/astc/image1
assets/astc/image2
...或
assets/image1.etc1
assets/image2.etc1
assets/image1.astc
assets/image2.astc
...然后在启动查询时,用户的设备支持哪种格式,并选择最佳的(对于某些定义最好的,比如最小的大小)
示例
// in order of best compression to worst
const compressions = [
{ ext: "astc", name: "WEBGL_compressed_texture_astc" },
{ ext: "etc1", name: "WEBGL_compressed_texture_etc1" },
...
];
let imageExtension = ""; // pick a default?
for (let i = 0; i < compressions.length; ++i) {
const info = compressions[i];
const ext = gl.getExtension(info.name);
if (ext) {
imageExtension = info.ext;
break;
}
}
function loadImage(baseUrl) {
...
img.src = baseUrl + imageExtension;
...
}或者上面的其他变体,在这些变体中,您了解了用户的设备需要什么,然后使用它。
https://stackoverflow.com/questions/45103814
复制相似问题