2017-07-14 377 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; 
    ... 
} 

或上面的其他變體,您可以找出用戶的設備需要什麼,然後使用它。