2017-07-14 3 views
-1

私はいくつかの大きなテクスチャでWebGLの作業をしており、問題VRAMとアップロード時間を軽減するためにテクスチャ圧縮を使用する必要があるポイントに達しました。Android-WebGLではどのようなテクスチャ圧縮形式が使用できますか?

私のアプリケーションは、最後の2つまたは3つの年からiOSとAndroidの携帯電話の両方で実行する必要があります。一度、デスクトップのサポートは重要ではありません。

私はすべてのiOSデバイスがのPowerVR GPUチップセットを使用してのiOSでのChromeとSafariが、私はPVRTC形式でテクスチャを渡すことができるようになることを理解しています。だから、iOSは解決された問題です。

また、私は正式にエリクソンテクスチャ圧縮(ETC、ETC1)をサポートしているほぼすべてのAndroid携帯電話を理解する - これは実際にOpenGLの2仕様で規定されていること。しかし、一部のAndroidインスタンスのブラウザの中には、実際にETC1のテクスチャを非圧縮形式で渡しているという報告があります。

WebGLStatsはWEBGL_compressed_texture_etc1拡張子を使用しないことをかなりstarkly私に警告します:

警告は使用しないでください。ブラウザでは、CPUの圧縮を解除し、フルサイズをGPUにアップロードすることで、パフォーマンス、vram、および品質に大きな影響を与えます。 Chrome 57とFirefoxで修正されましたか?私の知る

他の一般的なフォーマットは、S3TCです。これはデスクトップでうまくサポートされていますが、Androidの操作性はNVIDIAチップセットを使用するデバイスに限られているようです。私はこれらが稀であると信じています(Tegraのみ?)。

現代のAndroid携帯電話上で動作するテクスチャ圧縮フォーマットを選択するための私の最高のオプションは何ですか?アンドロイド、WebGLの上で利用可能なテクスチャ圧縮フォーマット

答えて

1

それが主張webglstats.comをチェックあなたは2017年7月15日の時点で

gl.getSupportedExtensions(); 

を使用して、特定のデバイスを確認することができ、デバイス

上のGPU /ドライバ/ブラウザ次第です

  • ないAndroidデバイスは、デバイスのs3tc
  • 2%SUをサポートしませんPPORTデバイスのpvrtc
  • 97%は、私は99%確信しているastc

デバイスのetc1

  • 97%がデバイスのetc
  • 48%がデバイスのatc
  • 46%をサポートサポートサポートサポートNVidia Shieldがs3tcをサポートしているとは確信していますが、NVidia Shieldを使用している人は誰もwebglstatsを使用しているサイトを訪れたことはありません。comまたは多分ユーザー数が0%に切り捨てられるほど小さいです

    最新のAndroid搭載携帯電話で動作するテクスチャ圧縮形式を選択するための最良の選択肢は何ですか?

    あなたが間違いなく行うべきことは、etc1、etc、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; 
        ... 
    } 
    

    または、ユーザーのデバイスが必要とするものを見つけて使用する、上記の他のバリエーション。

  • 関連する問題