2025年10月21日

KTX2 テクスチャ圧縮

テクスチャは現代のグラフィカルアプリケーションにおいて至る所で使用されています。モデルに色やマテリアル情報を与えます。

テクスチャの解像度が高いほど、より多くのディテールを得られます。今日では、高解像度カメラがより身近で手頃な価格になってきています。しかし、これにはメモリ使用量という代償が伴います。

JPEGやPNGのような圧縮画像フォーマットがあり、ディスクに保存された画像のメモリ使用量を削減します。これらのフォーマットはウェブアプリケーションにも役立ち、ネットワーク経由で転送するデータ量を減らし、ページの読み込み時間を効果的に短縮できます。しかし、JPEGのようなフォーマットはグラフィックスカード(GPU)で解釈できず、画像を圧縮するために設計されたものであり、レンダリング用ではありません。JPEG画像は、レンダリングのためにGPUに送信する前に解凍する必要があります。

以下は256×256の画像です。

GIMPで作成

高品質でJPEG圧縮すると、53.5 KBになります。

GPUで使用するためにRGBA8に解凍すると、256KBになります。約5倍のサイズです!

これは非常に小さな画像ですが、例として、4K画像(今日では非常に一般的です)は64MBになります。大規模なアプリケーションはテクスチャを含む多くのリソースを持つため、特にスマートフォン、タブレット、VRデバイスのようなローエンドデバイスでは、これが急速に積み重なりGPUメモリ(VRAM)を食い尽くす可能性があります。

テクスチャ圧縮フォーマットは、GPU内で画像を圧縮できるようにするために発明されました。これらの圧縮フォーマットは、最適なパフォーマンスを達成するためにGPUのアーキテクチャに適合するように設計されています。これは、VRAM使用量の削減だけでなく、以下のことにもつながります。

  • GPUに転送する必要があるデータ量が少なくなるため、読み込み時間が高速化します。
  • 内部転送帯域幅の要件が削減されるため、フレームレートが向上します。

異なるGPUメーカーが、主要な関係者と協力して、さまざまなテクスチャ圧縮フォーマットを考案しました。これらのフォーマットの例としては、次のようなものがあります。

  • BC1、BC3、BC6H、BC7などのBCファミリー(S3TCとしても知られています)。これらのフォーマットはデスクトッププラットフォーム専用です。
  • ETC1、ETC2、ETC2_EAC、EACで構成されるETC(Ericsson Texture Compression)ファミリー。これらのフォーマットは主にOpenGLで採用され、AndroidおよびWebGLプラットフォームで使用されています。
  • PVRTCはPowerVRチップ専用のフォーマットファミリーです。iOSで唯一サポートされていたフォーマットであったため重要でした。現在、Appleが全デバイスにASTCを採用しつつあるため、時代遅れになりつつあります。
  • ASTCは、今日最も先進的なテクスチャ圧縮フォーマットです。Khronosグループによって開発された標準規格であり、現在モバイルデバイスにおける事実上の標準フォーマットです。

想像できるように、これほど多くのテクスチャ圧縮フォーマットがあることは、複数のプラットフォームで良好なパフォーマンスを重視するアプリケーション開発者にとって大きな頭痛の種になりえます。

Khronosグループは、KTX2コンテナフォーマットとスーパー圧縮スキームによって、この断片化の問題を解決しようと試みました。これらについては、以降のセクションでさらに詳しく見ていきます。

KTX1

KTX2の前には、ご想像の通り、KTX1がありました。

KTX1は非常にシンプルな画像コンテナ形式でした。つまり、異なる形式の画像を含むことができる単なる形式です。上記の圧縮テクスチャ形式のいずれかを含むことができ、生のRGBA画像も含むことができました。シンプルで、ただ動作します。

問題は、多くのプラットフォームをサポートしたい場合、KTX1コンテナには各プラットフォーム固有のフォーマットの画像を含める必要があることでした。これは管理が難しく、同じ情報を各フォーマットで保存することを意味します(ファイルサイズが大きくなります)。

KTX2

KTX2は、トランスコード可能なフォーマットとスーパー圧縮スキームによって、断片化をさらに解決することを目指しています。

KTX1でサポートされている画像フォーマットに加えて、KTX2は2つのトランスコード可能なフォーマット、Universal ASTC(UASTC)とETC1Sを追加します。これらのフォーマットは、プラットフォーム固有のテクスチャ圧縮フォーマットに変換されるように設計されています。これらのいわゆるトランスコード可能なフォーマットからテクスチャ圧縮フォーマットへの変換は非常に高速であるため、ランタイム時に簡単に実行できるプロセスです(このプロセスはトランスコーディングと呼ばれます)。

その上で、KTX2はスーパー圧縮スキームのサポートを追加します。これは、トランスコード可能なフォーマットをディスク上でさらに圧縮する技術です。これらの技術により、JPEGと同程度のサイズ、あるいはそれよりも小さいKTX2ファイルを実現できます。

[https://www.khronos.org/ktx/ からの画像]

 

画像をKTXに変換する方法

画像をKTXに変換するには、公式のKTX-Softwareコマンドラインツールを使用できます。

コマンドラインツールはソースからコンパイルできますが、最も簡単な方法はReleasesセクションからインストーラーをダウンロードすることです。

インストール時に「Command line tools」チェックボックスがオンになっていることを確認してください。

インストールフォルダ内に必要なツールがあります: toktx.exe

基本コマンド:

toktx.exe –encode uastc –zcmp 15 –genmipmap output.ktx input.jpg

 

–zcmp: ディスク上の圧縮レベルを設定します。

–genmipmap: ミップマップチェーン全体を生成し、KTXファイルに保存します。圧縮テクスチャのミップマップチェーン生成は負荷が高いため、ランタイムでの実行を避けるために推奨されます。

もう一つの興味深いオプションは–uastc_qualityで、品質と圧縮速度のバランスを微調整できます。

toktx.exe –encode uastc –zcmp 15 –genmipmap –uastc_quality 3 output.ktx input.jpg

 

toktxには多数のオプションがありますので、ぜひご確認ください:

toktx.exe –help

 

ベンチマーク

簡単な例として、PBRマテリアルを適用したシンプルな球体を使用します。

一方がJPG画像を使用し、もう一方がKTX画像を使用している点を除き、同一のマテリアルを2つ作成しました。

ご覧の通り、KTXを使用するとVRAM使用量が大幅に削減されます。JPG使用時は4枚の画像で合計128MBのVRAMを消費するのに対し、KTX使用時は32MBです。最終的な画質は同等であり、違いに気づくことはないでしょう。

さらに、常にそうとは限りませんが、多くの画像においてKTXはJPGよりもディスク容量が少なくて済むようです。

このテストでは、公式の「toktx」コマンドラインツールを使用してJPG画像をKTXに変換しました。このコマンドラインツールに渡す最適なパラメータセットを見つけるには、トレードオフを伴うため、一種の技量が求められます。品質/パフォーマンス要件を考慮し、アプリケーションの画像に最適なパラメータを見つけるようにしてください。例えば、法線マップは通常、カラーマップよりも高い精度が要求されます。

前の例で使用したパラメータは以下の通りです:

カラー:

& 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf srgb –target_type RGB –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_color.ktx .\Jpg\Bricks_color.jpg

 

法線:

& 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type RGB –normalize –uastc_quality 3 –uastc_rdo_l 0.5 –zcmp 20 .\Ktx\Bricks_normals.ktx .\Jpg\Bricks_normals.jpg

 

PBR:

& 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type RG –uastc_quality 3 –uastc_rdo_l 1 –zcmp 20 .\Ktx\Bricks_pbr.ktx .\Jpg\Bricks_pbr.jpg

 

AO:

& 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type R –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_AO.ktx .\Jpg\Bricks_AO.jpg

 

EvergineにおけるKTX

Evergine 2025.10では、KTX1とKTX2の両方、およびすべてのプラットフォーム固有の圧縮テクスチャ形式のサポートを追加しました。

これはすべてのアプリケーションにとって朗報ですが、特にWebアプリケーションでは、その採用によりロード時間が大幅に改善されます。

最小限の投資でグラフィカルアプリケーションを最適化できるようになりました。すべてがエンジンにシームレスに統合されており、非常に使いやすくなっています。

ユーザーは、他の画像形式と同様にエディターでKTX2ファイルをインポートし、マテリアルで使用できます。ファイル拡張子は「.ktx」または「.ktx2」である必要があります。

Evergine.ImageRuntimeが拡張され、KTX2ファイルの読み込みが可能になりました。

GLTFファイルにKTX画像が含まれている場合(埋め込みまたは参照)、すべてがそのまま動作します。

著者
Alejandro Juan Pérez
Plain Concepts Research