我正在使用一些大纹理进行WebGL工作,并且已达到我必须使用纹理压缩来缓解VRAM和上传时间问题的程度。
我的应用程序需要在过去两三年内在iOS和Android手机上运行。一次,桌面支持不是必然的。
据我所知,iOS中的Chrome和Safari将允许我以PVRTC格式传递纹理,因为所有iOS设备都使用PowerVR GPU芯片组。所以iOS是一个解决的问题。
我也明白,几乎所有Android手机都正式支持爱立信纹理压缩(ETC,ETC1) - 这实际上是OpenGL 2规范要求的。但是,我已经阅读过一些Android实例上的某些浏览器实际上以非压缩方式传递ETC1纹理的报告。
WebGLStats警告我非常反对使用WEBGL_compressed_texture_etc1扩展名:
警告请勿使用。通常在浏览器中实现,通过在CPU上解压缩并将完整大小上传到GPU,具有严重的性能,vram和质量影响。修复了Chrome 57和Firefox ??。
我所知道的另一种常见格式是S3TC。这在桌面上得到了很好的支持,但Android的可操作性似乎仅限于使用NVIDIA芯片组的设备。我相信这些都是罕见的(仅限Tegra?)。
选择适用于现代Android手机的纹理压缩格式的最佳选择是什么?
答案 0 :(得分:4)
Android-WebGL上有哪些纹理压缩格式?
取决于设备上的GPU /驱动程序/浏览器
您可以使用
检查特定设备 gl.getSupportedExtensions();
截至2017-07-15检查webglstats.com它声称
我99%肯定它并不完全准确,因为我很确定NVidia Shield支持s3tc,但也许没有人使用NVidia Shield曾经访问过使用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
...
然后在启动时查询用户设备支持的格式并选择最佳格式(对于 best 的某些定义,可能是最小尺寸)
实施例
// 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;
...
}
或者上面的其他变体,你可以弄清楚用户的设备需要什么,然后使用它。