web-dev-qa-db-ja.com

Android OpenGLテクスチャ圧縮

Androidでテクスチャ圧縮を使用する方法に関する情報(または例)を見つけるための手助けが必要です。現在、PNGがたくさんあるので、使用するメモリの量を減らす必要があります。 PVR圧縮を見ていましたが、OpenGL内でこれを使用する方法がわかりません。

正しい方向を教えてくれる人もいれば、何も見つからないのでいくつか例を挙げてくれる人もいます。

55
Chris

Androidでは、主に4つのテクスチャ圧縮タイプがサポートされています。

  • ETC1(エリクソンテクスチャ圧縮)。この形式は、すべてのAndroid携帯電話でサポートされています。ただし、アルファチャネルはサポートされていないため、不透明なテクスチャにのみ使用できます。
  • PVRTC(PowerVRテクスチャ圧縮)。 PowerVR GPUを搭載したデバイス(Nexus S、Kindle fireなど)でサポートされています。
  • ATITC(ATIテクスチャ圧縮)。 Qualcomm(Nexus Oneなど)のAdreno GPUを搭載したデバイスで使用されます。
  • S3TC(S3テクスチャ圧縮)。このテクスチャ圧縮は、NVIDIAチップセット統合デバイス(Motorola Xoomなど)で使用されます

より詳細な情報 here および here

つまり、テクスチャにアルファがない場合は、ETC1を使用できます。それらにアルファがあり、すべてのデバイスをサポートする場合は、他の3つのタイプでテクスチャを圧縮し、デバイスに応じてそれらをロードする必要があります。

使い方:

  1. Pngファイルを圧縮します( ETC-PackPVRTexToolATI CompressonatorNvidia Texure Tools などのツールを使用できます=テクスチャのタイプに応じて)、プロジェクトアセットに追加します。

  2. ETC1を使用していない場合、デバイスで利用可能な拡張機能を決定します。

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    
         String s = gl.glGetString(GL10.GL_EXTENSIONS);
    
         if (s.contains("GL_IMG_texture_compression_pvrtc")){
              //Use PVR compressed textures         
         }else if (s.contains("GL_AMD_compressed_ATC_texture") ||
                  s.contains("GL_ATI_texture_compression_atitc")){
              //Load ATI Textures           
         }else if (s.contains("GL_OES_texture_compression_S3TC") ||
                    s.contains("GL_EXT_texture_compression_s3tc")){
             //Use DTX Textures
         }else{
             //Handle no texture compression founded.               
         }
    
    }           
    
  3. 生データとして圧縮テクスチャをロードします。

  4. GlTexImage2Dの代わりにglCompressedTexImage2Dを使用します。

    public void onDrawFrame(GL10 gl) {
    
       ....
    
       gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width, 
                                 height, border, imageSize, data);
    
    }
    
84
gergonzalez

これはolスレッドであるため、 http://devtools.ericsson.com/etc で利用可能な情報で更新すると思った。

5
remi arnaud

AndroidではPVR圧縮のみを使用しないでください。すべてのモデルで機能するわけではありません。これを回避するには、ETC1(すべてのGLES 2.0デバイスで必須)のみを使用するか、GPUモードごとに個別のテクスチャパックを使用する必要があります。 Android dev guide には、圧縮形式をロードするヘルパークラスがあります。

etcpack を使用して圧縮を行うことができます。

ETC1ではアルファチャンネルを取得できないことに注意してください。アルファチャンネルを別のテクスチャとして使用することで、いくつかの派手なフラグメントシェーディングトリックを実行して、それを回避できます。

3

Etc1がすべてのAndroidデバイスでサポートされていないことを指摘したかったのですが、 gergonzalez

注意:ETC1形式は、ほとんどのAndroidデバイスでサポートされていますが、利用可能であるとは限りません。デバイスでETC1形式がサポートされているかどうかを確認するには、ETC1Util.isETC1Supported()メソッドを呼び出します.

https://developer.Android.com/guide/topics/graphics/opengl.html#textures

3
ed-