2017-07-14 373 views
-1

我正在做一些大纹理的WebGL工作,并且已经达到了必须使用纹理压缩来缓解VRAM和上传时间问题的地步。Android-WebGL上有什么纹理压缩格式?

我的应用程序需要在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

Android-WebGL上有什么纹理压缩格式?

它通过使用

gl.getSupportedExtensions(); 

随着2017年7月15日检查webglstats.com它声称的是给设备上的GPU /驱动器/浏览器

您可以查看特定设备

  • 没有机器人设备支持设备的s3tc
  • 2%苏pport设备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 
... 
在启动查询的格式用户的设备支持

然后,选择最好的之一(如可能最小的最好一些定义大小)

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

或上面的其他变体,您可以找出用户的设备需要什么,然后使用它。