Android-WebGL上有哪些纹理压缩格式?

时间:2017-07-14 13:05:55

标签: android textures webgl

我正在使用一些大纹理进行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手机的纹理压缩格式的最佳选择是什么?

1 个答案:

答案 0 :(得分:4)

  

Android-WebGL上有哪些纹理压缩格式?

取决于设备上的GPU /驱动程序/浏览器

您可以使用

检查特定设备
 gl.getSupportedExtensions();

截至2017-07-15检查webglstats.com它声称

  • 没有Android设备支持s3tc
  • 2%的设备支持pvrtc
  • 97%的设备支持etc1
  • 97%的设备支持etc
  • 48%的设备支持atc
  • 46%的设备支持astc

我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;
   ...
}

或者上面的其他变体,你可以弄清楚用户的设备需要什么,然后使用它。