Androidテクスチャ圧瞮圢匏の比范ずコヌド䟋

最高のテクスチャ圧瞮圢匏は䜕ですか たぶん、PNG、ETC、PVRTC、S3TC、たたは他の䜕かでしょうか 質問は単玔ではありたせんが、非垞に重芁です。 ビゞュアルデザむンの品質、Androidアプリケヌションの速床ずサむズは、答えに䟝存したす。 問題は、普遍的な「最良の圢匏」が単に存圚しないずいう事実によっお耇雑になりたす。 それはすべお、開発者のニヌズに䟝存したす。







テクスチャを2次元たたは3次元モデルに適甚する技術は、コンピュヌタヌグラフィックスで広く䜿甚されおいたす。 これは、モデルによっお衚されるオブゞェクトの詳现を改善するために行われたす。 Androidは倚くのテクスチャ圧瞮圢匏をサポヌトしおおり、それぞれに長所ず短所がありたす。



テクスチャずそのストレヌゞ圢匏の操䜜に関する予備情報



テクスチャマッピングは、画像をシェむプたたはポリゎンの衚面に「貌り付ける」方法です。 わかりやすくするために、図を箱ず比范し、その䞭に䜕かを入れお誰かに枡すために、この箱を包む暡様付きの包装玙でテクスチャを比范したす。 したがっお、英語の文献では、テクスチャマッピングはテクスチャラッピングずも呌ばれ、テクスチャラッピングずしお翻蚳できたす。





最初のタンクはポリゎンモデルで、2番目のタンクはテクスチャがスヌパヌむンポヌズされる同じモデルです。



MIPカヌドMipmapsは、メむンテクスチャ甚に生成される画像の最適化されたグルヌプです。 通垞、画像のレンダリング速床を䞊げ、画像を滑らかにするアンチ゚むリアシングため、぀たり「ステップ」ラむンの効果を取り陀くために䜜成されたす。 マップの各レベル実際には「mip」ず呌ばれたす-これはラスタヌむメヌゞの1぀であり、MIPカヌドに含たれるテクスチャのセットで構成されたす-これは䜎解像床の元のテクスチャのバヌゞョンです。



このような画像は、テクスチャオブゞェクトが遠くから芋える堎合や、サむズが瞮小されおいる堎合に䜿甚されたす。 MIPカヌドを䜿甚するずいうアむデアは、私たちから遠く離れおいるか、寞法が小さいオブゞェクトの现郚を単に区別できないずいう事実に基づいおいたす。 この考えに基づいお、マップのさたざたなフラグメントを䜿甚しお、オブゞェクトのサむズに基づいおテクスチャのさたざたな郚分を衚すこずができたす。 これにより、メむンテクスチャの小さいバヌゞョンのテクセルテクスチャピクセルが倧幅に少なくなるため、぀たりGPUがより少ないデヌタを凊理しおテクスチャモデルを出力するため、レンダリング速床が向䞊したす。 さらに、MIPカヌドは通垞アンチ゚むリアス凊理されるため、顕著なアヌティファクトの数は倧幅に削枛されたす。 ここでは、PNG、ETCKTX、ETC2KTX、PVRTC、およびS3TCの圢匏のMIPカヌドに぀いお説明したす。









MIPカヌド



ポヌタブルネットワヌクグラフィックスPNG



PNGは、情報を倱うこずなくグラフィックデヌタを圧瞮するアルゎリズムを䜿甚しおいるずいう点で特に泚目に倀するラスタヌむメヌゞストレヌゞ圢匏です。 カラヌむンデックス付き画像24ビットRGBたたは32ビットRGBA、フルカラヌ画像、グレヌスケヌル画像、およびアルファチャネルをサポヌトしおいたす。



メリット





欠点





゚リク゜ンテクスチャ圧瞮ETC



゚リク゜ンテクスチャ圧瞮は、4x4ピクセルブロックで動䜜するテクスチャ圧瞮圢匏です。 Khronosはもずもず、Open GL ES 2.0の暙準圢匏ずしおETCを䜿甚しおいたした。 このバヌゞョンはETC1ずも呌ばれたす。 その結果、この圢匏はほがすべおのAndroidデバむスで䜿甚できたす。 OpenGL ES 3.0のリリヌス。 新しい暙準ずしお、ETC2圢匏ETC1の改蚂版が䜿甚されたす。 2぀の暙準の䞻な違いは、ピクセルグルヌプで動䜜するアルゎリズムです。 アルゎリズムの改善により、小さな画像の詳现の出力の粟床が向䞊したした。 その結果、画質は改善されたしたが、ファむルサむズは改善されおいたせん。



ETC1およびETC2は24ビットRGBデヌタの圧瞮をサポヌトしおいたすが、アルファチャネルを䜿甚した画像の圧瞮はサポヌトしおいたせん。 さらに、ETCアルゎリズムに関連する2぀の異なるファむル圢匏がありたす。これらはKTXずPKMです。



KTXは暙準的なKhronos Groupファむル圢匏であり、倚くの画像を保存できるコンテナを提䟛したす。 KTXを䜿甚しおMIPカヌドを䜜成するず、単䞀のKTXファむルが生成されたす。 PKMファむルの圢匏ははるかに単玔で、そのようなファむルは䞻に個々の画像を保存するために䜿甚されたす。 その結果、MIPカヌドの䜜成䞭にPKMを䜿甚するず、単䞀のKTXではなく耇数のPKMファむルが䜜成されたす。 したがっお、PKM圢匏はMIPカヌドの保存には掚奚されたせん。



メリット





欠点





ETCで画像を圧瞮するには、 Mali GPUテクスチャ圧瞮ツヌルずETC-Packツヌルを䜿甚できたす。



PowerVRテクスチャ圧瞮PVRTC



PowerVRテクスチャ圧瞮は、䞻にむマゞネヌションテクノロゞヌのPowerVR MBX、SGX、および䞍正デバむスで䜿甚される損倱の倚いグラフィックデヌタ甚の固定レベルの圧瞮圢匏です。 iPhone、iPod、iPadで暙準の画像圧瞮方法ずしお䜿甚されたす。



ETCやS3TCずは異なり、PVRTCアルゎリズムはピクセルの固定ブロックでは機胜したせん。 バむリニア拡倧ず、2぀の䜎解像床画像の䜎粟床ブレンドを䜿甚したす。 独自の圧瞮プロセスに加えお、PVRTCは、2-bppオプションピクセルあたり2ビットず4-bppオプションピクセルあたり4ビットの䞡方に察しお、RGBA圢匏透明床ありをサポヌトしおいたす。



メリット





欠点







圧瞮には、 PVRTexToolを䜿甚できたす。



S3テクスチャ圧瞮S3TCたたはDirectXテクスチャ圧瞮DXTC



S3テクスチャ圧瞮は、圧瞮レベルが固定された非可逆グラフィックデヌタ圧瞮圢匏です。 その機胜により、この圢匏は、グラフィックアクセラレヌタを䜿甚するように蚭蚈された3Dアプリケヌションで䜿甚されるテクスチャの圧瞮に最適です。 S3TCずMicrosoft DirectX 6.0およびOpenGL 1.3の統合は、その普及に貢献したした。 少なくずも5぀の異なるS3TC圢匏オプションDXT1からDXT5たでがありたす。 サンプルアプリケヌションは、最も䞀般的に䜿甚されるオプションDXT1、DXT3、およびDXT5をサポヌトしおいたす。



DXT1は最も匷力な圧瞮を提䟛したす。 各入力16ピクセルブロックは、2぀の16ビットRGB 565カラヌ倀ず2ビット4x4ルックアップテヌブルで構成される64ビットブロックに倉換されたす。 透明床のサポヌトは1色に制限されおいたす1ビット透明床。



DXT3は、16ピクセルの各ブロックを128ビット、アルファチャネルデヌタごずに64ビット、色情報ごずに64ビットに倉換したす。 DXT3は、透明な領域ず䞍透明な領域の間の急激な移行を䌎う画像たたはテクスチャに非垞に適しおいたす。 ただし、透明床のグラデヌションがなく、画像に透明な領域がある堎合は、DXT1の䜿甚を怜蚎する䟡倀がありたす。



DXT5は、DXT3ず同様に、16ピクセルの各ブロックを128ビット、アルファチャネルデヌタごずに64ビット、色情報ごずに64ビットに倉換したす。 ただし、DXT3ずは異なり、DXT5は、透明領域ず䞍透明領域の間のスムヌズな移行を䌎う画像たたはテクスチャに適しおいたす。



メリット





欠点





この圢匏で䜜業するには、 DirectXのDirectX Texture Tool DX SDKに含たれおいたすを䜿甚できたす。



テクスチャデヌタにアクセスする



圧瞮テクスチャを保存するためのほずんどのファむル圢匏には、画像デヌタの前にヘッダヌが含たれおいたす。 通垞、ヘッダヌには、テクスチャ圧瞮圢匏の名前、テクスチャの幅ず高さ、その色深床、デヌタサむズ、内郚圢匏、およびファむルに関するその他の情報に関する情報が含たれおいたす。



私たちの目暙は、さたざたなファむルからテクスチャデヌタをロヌドし、それらを2次元モデルにオヌバヌレむしお、画質ずデヌタサむズを比范するこずです。 グラフィックデヌタの前にあるヘッダヌは、テクスチャの䞀郚ずしお凊理されるべきではありたせん。これを画像の断片ず芋なし、モデルに重ね合わせるず、歪みが発生したす。 さたざたなテクスチャ圧瞮圢匏のファむルヘッダヌは異なるため、各圢匏には個別のサポヌトが必芁です。そうでない堎合、テクスチャの読み蟌みず適甚が正しく機胜したせん。



泚意しおください



PVRTCヘッダヌは、64ビットピクセル圢匏この䟋ではmPixelFormatのデヌタメンバヌの存圚を考慮しおパックされたす。 ARM甚にコンパむルされたコヌドでは、ヘッダヌは4バむトが远加されお敎列されたす。その結果、元の52バむトから56バむトになりたす。 これは、ARMデバむスで衚瀺されるずきにむメヌゞが歪むずいう事実に぀ながりたす。 Intelプロセッサ甚にコンパむルされたコヌドでは、これは起こりたせん。 ヘッダヌパッケヌゞは、ARMデバむスのアラむメントの問題を解決するため、ARMデバむスずIntelデバむスの䞡方でテクスチャが正しく衚瀺されたす。





タむトルの配眮によっお生じるARMデバむス䞊の画像の歪みは次のようになりたす。



サンプルアプリケヌションに぀いお



以䞋にフラグメントを瀺すAndroid Texture Compressionの䟋により、誰もが5぀の圢匏のテクスチャの品質をすばやく比范できたす。 ぀たり、ポヌタブルネットワヌクグラフィックスPNG、゚リク゜ンテクスチャ圧瞮ETC、゚リク゜ンテクスチャ圧瞮2ETC2、PowerVRテクスチャ圧瞮PVRTC、およびDirectXテクスチャ圧瞮DXTCず呌ばれるこずもあるS3テクスチャ圧瞮S3TCです。 。



この䟋は、AndroidのOpenGL ESを䜿甚しおこれらの圢匏のテクスチャをロヌドおよび䜿甚する方法を瀺しおいたす。 異なる圢匏で保存された画像は隣り合っお配眮されるため、サむズず品質を比范できたす。 特定のプロゞェクトの圧瞮テクスチャを保存するのに最適な圢匏を遞択するず、開発者はアプリケヌションのサむズ、芖芚的な画質、パフォヌマンスの適切なバランスを芋぀けるこずができたす。



この䟋では、各圢匏のファむルに保存されおいる画像が読み蟌たれ、モデル䞊のオヌバヌレむの座暙が決定され、各テクスチャのフラグメントが衚瀺されたす。 結果は、察応する圢匏の4぀のテクスチャに分割された単䞀の画像です。 フォヌマットは画面䞊郚に衚瀺され、ファむルサむズは以䞋に衚瀺されたす。



ここで説明する䟋は、William Guoが䜜成したコヌドに基づいおいたす。 Intel Graphics SpecialistのChristiano Ferreiraが、テクスチャ圧瞮ETC2の䜿甚䟋を補足したした。 ここからコヌドをダりンロヌドできたす。





テクスチャ圧瞮圢匏サむズず品質



PNGダりンロヌド



この目的のために特別に䜜成されたKhronos OpenGLの単玔なglGenerateMipmap関数を䜿甚しお、PNG MIPカヌドを操䜜できたす。 Sean Barretが準備したコヌド、stb_image.c䞀般公開されおいたすを䜿甚しお、PNGファむルを読み取り、ダりンロヌドしたした。 このコヌドは、凊理する必芁があるテクスチャの䞀郚を芋぀けお遞択するためにも䜿甚されたす。



//      glTexImage2D( GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, pData );    //  MIP-    glGenerateMipmap( GL_TEXTURE_2D );
      
      





ETC / ETC2をダりンロヌド



前述のように、ETCテクスチャはKTXおよびPKMファむルに保存できたす。 KTXは、耇数の画像のコンテナずしお䜿甚される暙準の圧瞮圢​​匏であり、MIPカヌドの䜜成に最適です。 同様に、PKMは個々の圧瞮画像を保存するために䜜成されたため、それに基づいおMIPカヌドを䜜成するには、倚くのファむルを生成する必芁があり、非効率的です。 この䟋でのETCのMIPカヌドのサポヌトは、KTX圢匏に制限されおいたす。



Khronosは、KTXファむルからのMIPカヌドの読み蟌みをサポヌトする、Cで蚘述されたオヌプン゜ヌスラむブラリlibktxを提䟛したす。 このラむブラリを䜿甚し、テクスチャのロヌドを担圓するLoadTextureETC_KTX関数にコヌドを実装したした。 KTXファむルを盎接ダりンロヌドする機胜は、ktxLoadTextureMず呌ばれたす。 メモリ内のデヌタから目的のテクスチャをロヌドできたす。 この関数はlibktxラむブラリの䞀郚であり、そのドキュメントはKhronos Webサむトにありたす。



以䞋は、テクスチャを初期化し、ETCKTX圢匏のMIPカヌドサポヌトを提䟛するコヌドスニペットです。



 //   (handle)      GLuint handle = 0;   GLenum target;   GLboolean mipmapped;       KTX_error_code result = ktxLoadTextureM( pData, fileSize, &handle, &target, NULL, &mipmapped, NULL, NULL, NULL );   if( result != KTX_SUCCESS )   {       LOGI( "KTXLib couldn't load texture %s. Error: %d", TextureFileName, result );       return 0;   }   //     glBindTexture( target, handle );
      
      





PVRTCをダりンロヌド



PVRTCテクスチャのMIPカヌドサポヌトは、もう少し耇雑なタスクです。 ヘッダヌを読み取った埌、ヘッダヌサむズずメタデヌタの合蚈に等しいオフセットが決定されたす。 タむトルの埌にメタデヌタがあり、それらは画像の䞀郚ではありたせん。 生成されたマップレベルごずに、ピクセルはブロックにグルヌプ化されたす違いは、゚ンコヌドがピクセルあたり4ビットか2ビットかによっお異なりたす。䞡方ずもPVRTCに適しおいたす。 次に、境界の怜玢が行われ、ブロックの幅ず高さが固定されたす。 次に、関数glCompressedTexImageが呌び出され、圧瞮されたPVRTC圢匏の2次元画像を識別したす。 次に、ピクセルデヌタのサむズが蚈算され、マップの次のフラグメントのピクセルのセットをグルヌプ化するために、以前に芋぀かったオフセットに䜕が起こったのかが远加されたす。 このプロセスは、マップを構成するすべおのテクスチャが凊理されるたで繰り返されたす。



 //     unsigned int offset = sizeof(PVRHeaderV3) + pHeader->mMetaDataSize;   unsigned int mipWidth = pHeader->mWidth;   unsigned int mipHeight = pHeader->mHeight;   unsigned int mip = 0;   do   {       //   ( *  * bbp/8),    32       unsigned int pixelDataSize = ( mipWidth * mipHeight * bitsPerPixel ) >> 3;       pixelDataSize = (pixelDataSize < 32) ? 32 : pixelDataSize;       //             glCompressedTexImage2D(GL_TEXTURE_2D, mip, format, mipWidth, mipHeight, 0, pixelDataSize, pData + offset);       checkGlError("glCompressedTexImage2D");       //        ,  – 1       mipWidth  = ( mipWidth >> 1 == 0 ) ? 1 : mipWidth >> 1;       mipHeight = ( mipHeight >> 1 == 0 ) ? 1 : mipHeight >> 1;       //           offset += pixelDataSize;       mip++;   } while(mip < pHeader->mMipmapCount);
      
      





ダりンロヌドS3TC



S3TCテクスチャを保存するファむルをダりンロヌドした埌、そのフォヌマットが決定され、ヘッダヌの埌ろにあるMIPカヌドが読み取られたす。 マップフラグメントはバむパスされ、ピクセルはブロックにグルヌプ化されたす。 次に、圧瞮デヌタ内の2次元画像を識別するために、glCompressedTexImage関数が呌び出されたす。 次に、ブロックの合蚈サむズがオフセットに远加されるため、マップの次のフラグメントの先頭を芋぀けお同じアクションを実行できたす。 これは、すべおのマップレベルが凊理されるたで繰り返されたす。 以䞋は、テクスチャを初期化し、S3TC圢匏のMIPカヌドのサポヌトを提䟛するコヌドスニペットです。



 //     //      unsigned int offset = 0;   unsigned int width = pHeader->mWidth;   unsigned int height = pHeader->mHeight;   unsigned int mip = 0;   do   {       //         //   : size = ceil(<w>/4) * ceil(<h>/4) * blockSize       unsigned int Size = ((width + 3) >> 2) * ((height + 3) >> 2) * blockSize;        glCompressedTexImage2D( GL_TEXTURE_2D, mip, format, width, height, 0, Size, (pData + sizeof(DDSHeader)) + offset );       checkGlError( "glCompressedTexImage2D" );       offset += Size;       if( ( width <<= 1 ) == 0) width = 1;       if( ( height <<= 1 ) == 0) height = 1;       mip++;   } while( mip < pHeader->mMipMapCount );
      
      





結論



特定の状況に応じお、圧瞮テクスチャの保存に最適な圢匏を遞択するず、画像の倖芳が改善され、アプリケヌションのサむズが倧幅に削枛され、パフォヌマンスが倧幅に改善されたす。 最適なテクスチャ圧瞮方法を慎重に遞択するこずにより、開発者ずそのアプリケヌションに深刻な競争䞊の優䜍性を䞎えるこずができたす。 Android Texture Compressionサンプルアプリケヌションは、Android環境で最も䞀般的な圢匏のテクスチャを操䜜する方法を瀺しおいたす。 コヌドをダりンロヌドし、プロゞェクトに最適なテクスチャ圧瞮圢匏のサポヌトを远加したす。



All Articles