ASTC テクスチャ圧縮形式

原文:ASTC テクスチャ圧縮形式の紹介

一、ASTC テクスチャ圧縮形式の紹介

ASTC は、OpenGL ES 3.0 の出現後、2012 年半ばに作成された、業界をリードするテクスチャ圧縮形式です。その圧縮ブロックは4×4 から 12×12 まで、最終的に1ビット未満毎ピクセルに圧縮できます。それに、多くの圧縮率を選択することができます。ASTC 形式は RGBA をサポートし、 2 の累乗のアスペクト比が1の寸法とサイズ要件のないNPOT (非 2 の累乗) テクスチャに適しています。

ASTC 4×4 ブロック圧縮形式を例にすると、1ビット8bits毎ピクセルです。1024×1024 テクスチャの圧縮サイズは 1MB です。

 

ASTC は、圧縮の品質と容量において大きな利点があります。

 

ドキュメントに詳細なテスト データがあります:

https://developer.nvidia.com/astc-texture-compression-for-game-assets

 

二、対応機種

1、iOS

Apple は A8 プロセッサから ASTC へのサポートを開始しました。これは、iPhone6 および iPad mini 4 より上の iOS デバイスでサポートされていますが、2014 年の iPhone 5s および iPad mini 3 より前のデバイスではサポートされていません。

 

2、アンドロイド

Android の主流の圧縮形式は、ETC2 から ASTC に移行しています。

 

Android ASTC 形式のサポートに関する Unity の公式説明:

https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

公式ドキュメントでは、ASTC の GPU サポートについて言及しています。OpenGL ES 3.1 をサポートするすべての GPU と、OpenGL ES 3.0 をサポートする一部の GPU です。

 

OpenGL ES 3.0 GPU の不確実性を考慮して、現在のユーザーの割合が高いいくつかのローエンドデバイスで ASTC 形式の互換性テストを実施し、さらにテストのために、いくつかの占用率が低いGPU 型番を追加しました: Mali-G71、Adreno 306、Adreno 308、Adreno405 (テスト時間 2020.5.21):

市場に出回っているほとんどの機種は OpenGL ES 3.1 以上をサポートしています. GPU 構成の低いいくつかのモデルは OpenGL ES 3.0 をサポートしていますが、ASTC 圧縮形式をサポートしていません。2020 年 4 月の市場シェアは 1.5% 未満です。個人的な観点から見れば ASTC 圧縮形式が広く使用されても大丈夫です。

 

補足:Unity 公式ドキュメント バージョン 2018.4 で ASTC 圧縮形式のサポートが紹介されました。

 

Texture Compression ASTC  Platform Support:tvOS (all), iOS (A8), Android (PowerVR 6XT, Mali T600 series, Adreno 400 series, Tegra K1)

 

三、圧縮形式の選択

前文で、さまざまな ASTC 形式の Bits Per Pixel (ビット毎ピクセル) について学びました。より直感的に理解するために、例として圧縮歪みが発生しやすいテクスチャを使用します。

 

1、ASTCフォーマットとETC2フォーマットの圧縮結果と容量の比較

上の図からわかるように、512×512 テクスチャ マップ (アルファ チャネルがない、Mipmap をオンにする) の容量は 1MB であり、ETC2 4 ビットに圧縮した後の容量は 170.7KB であり、明らかな歪みがあり、ASTC 6×6 への圧縮後の容量はは 154.7 KB で、明らかな歪みはありません。ASTC 6×6 の容量は ETC2 4 ビットよりも小さく、圧縮品質は ETC2 4 ビットよりも高くなっています。

上記の図からわかるように、ASTC 8×8 に圧縮した後の容量は 85.4KB で、ETC2 4 ビットの約 50% であり、圧縮品質は ETC2 4 ビットよりも高くなっています。

2、アルファ チャネルなし、RGB 24 ビット/ピクセル圧縮形式の選択

上の図からわかるように、512×512 サイズのマップ (アルファ チャネルなし) は、ASTC 6×6、ASTC 8×8、および ASTC 10×10 に圧縮された後に明らかな歪みがなく、ASTC 8×8 に圧縮された後の容量は ASTC 6×6と比較して約 44.8%減少します。 ASTC 10×10 に圧縮すると、ASTC 8×8 に比べて容量が約 33.7% 減少します。

 

法線マップを例に取ります。

上の図からわかるように、ASTC 4×4 に圧縮された 512×512 のサイズの法線マップには明白な歪みがなく、ASTC 5×5 に圧縮され、歪みは肉眼で見ることができ、ASTC 6×6 に圧縮された歪みは明らかです。

例として、顔のテクスチャを取り上げます。

上の図からわかるように、ASTC 6×6 に圧縮すると明らかな歪みはなく、ASTC 8×8 に圧縮すると歪みが肉眼で確認できます。

 

結論: アルファ チャネルのないテクスチャの推奨圧縮形式は、ASTC 8×8 です。テクスチャが法線マップの場合、推奨される圧縮形式は ASTC 5×5 です。より高い要件を持つテクスチャ (顔、シーン グラウンドなど) の場合、圧縮形式を ASTC 6×6 に設定し、法線マップを ASTC 4×4 に設定できます。

 

その結論とNV ドキュメントデータを比較したら、

 

薄い緑はベンチマークの推奨を示し、濃い緑はより高い要件の推奨を示します. 唯一の違いは、通常のテクスチャの圧縮に ASTC 6×6 を選択するか、ASTC 8×8 を選択するかです。個人的な観点から, 8×8 の推奨指数は0のはずです。

3、アルファ チャネル、RGBA 32 ビット/ピクセルの圧縮精度の選択

上の図からわかるように、ASTC 5×5 に圧縮すると歪みが肉眼で確認でき、ASTC 6×6 に圧縮すると明らかな歪みがあり、ASTC 5×5 に圧縮するとASTC 4×4 と比較して容量が約 34.9 % 減少します。 同じ圧縮形式の下で、アルファ チャネルを使用した圧縮の品質は、アルファ チャネルを使用しない場合よりも大幅に低下します。

 

結論: アルファ チャネルを持つテクスチャの推奨圧縮形式は ASTC 5×5 です。より高度な要件 (特殊効果、UI など) を持つテクスチャの場合、圧縮形式を ASTC 4×4 に設定できます。

 

結論は、NV ドキュメント データの比較と一致しています。

4、圧縮に対するアルファチャンネルの有無の影響

同じ圧縮形式の下では、テクスチャの容量は同じままです。アルファ チャネルの有無は圧縮結果に大きな影響を与え、アルファ チャネルを使用したテクスチャの圧縮品質は低下します。

上の図からわかるように、アルファ チャネルを含む 32 ビット イメージとアルファ チャネルを含まない 24 ビット イメージでは、同じ圧縮形式を選択しても、圧縮結果は大きく異なります。

アルファ チャネルを含む 32 ビット イメージの場合、[インポート設定] で [アルファ ソース] を [なし] に選択すると、圧縮結果はアルファ チャネルがない場合と同じになります。

5、その他の問題

1) シェーダーへの影響

デフォルト テクスチャが「黒」の場合、テクスチャがデフォルトの場合、デフォルト値は (0,0,0,0) であり、A チャネルは 0 を読み取り、RGB ETC2 4 ビット フォーマットを使用する場合、A チャネルは 0 を読み取ります。 ASTC フォーマットでは、チャネル A は 1 として読み取られます。ここで、シェーダーのデフォルト値の考慮に注意を払う必要があります。

 

2) JPEG 形式はすでに非可逆形式です。JPEG で失われる精度は、ASTC 圧縮とは関係ありません。

 

3) テクスチャサイズについて。

圧縮形式が非 2 の累乗をサポートしている場合、ハードウェアが圧縮形式をサポートしている限り、NPOT テクスチャを使用できます。ただし、2 の累乗のテクスチャは他のサイズよりも優れており、ここには複雑なグラフィック要素があります。

 

参考記事:「2 の累乗でないテクスチャに対する OpenGL のサポートの基本原理は何ですか?」 (中国語注意)

簡単に理解すると、テクスチャは GPU 内のブロック単位で保存されます。メモリと帯域幅をできるだけ節約するために、圧縮形式もテクスチャをブロック的に保存します。再帰またはループでは、数値が 2 の累乗の場合、2 で割り切れ、商も 2 の累乗になります。 OpenGL API は 2 の累乗以外をサポートします。これは、使いやすさのために詳細が隠され、必要なストレッチ操作や塗りつぶし操作が内部で処理されるためです。したがって、特別な要件がない場合は、POT テクスチャを使用してみてください。また、作成時に実際のアプリケーション サイズに応じて作成して、高精度の圧縮から低精度の使用を避けるようにしてください。

 

4) テクスチャ自体にアルファ情報があるかどうかに関係なく、ASTC 圧縮のさまざまな設定によって圧縮サイズが直接決まります。テクスチャ リソースのパッケージ サイズを制御するかどうかは、ASTC 圧縮形式の仕様が適切かどうかに依存します. 結局、ASTC 8×8 への圧縮後の容量は、ASTC 6×6 と比較して約 44.8% 削減され (85.4KB 対 154.7KB)、ASTC 4×4 よりも約 300% 小さいのです (85.4KB 対 341.4KB)。そして通常、アルファ チャネルが空かどうかを確認します。これは、アルファ情報が冗長であるかどうか、および圧縮精度を低く設定する必要があるかどうかを判断するのに役立ちます。

5)ASTC 圧縮アルゴリズムはよりスマートで、より可変性の高いチャネル RGB または A に高い重みを割り当てます。モノクロ画像の場合、またはRGB チャネルのコンテンツが同じ場合、より低い「1ビット毎ピクセル」を使用して、良い効果が出られます。モノクロ画像の場合、R8 圧縮形式を使用する必要はありません。代わりに、RGB チャネルに同じ情報を入力し、ASTC 8×8 など、ASTC が低いピクセル比を選択できます。

6)プロジェクトの実際の使用では、法線マップの場合、ETC2 4 ビットの圧縮効果が ASTC 5×5 の圧縮効果よりも優れていることがわかりました。透過チャネルを持つマップの場合、ETC2 8 ビットがASTC 4×4よりも優れている場合があります。¥を以前のテストで比較見逃していました。さらに比較が必要であり、実際の状況に応じて選択します。

 

A チャネルの詳細がある場合は ASTC を選択し、A チャネルの詳細が少ない場合は ETC2 を選択します。

 


投稿者の に感謝します。

著者のホームページ: https://www.zhihu.com/people/ssiya-330

著者の許可なしに転載しないでください。

 

シェアすることは大歓迎です!

無断転載・二次配布は禁止となります。

何かご意見・ごコメントがございましたら、いつでもお気軽にお問合せください。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com