Unityで動的にテクスチャをパッキングして圧縮を試してみる

こんにちは、ネイティブエンジニアのHBです。

 

Unityでテクスチャを扱う場合、動的にアトラス画像を作ったり、テクスチャを書き換えたりしたくなる時もあると思います。
今回はそんな時どうすれば良いのか、Unityのランタイム上でアトラス画像生成と圧縮について試してみました。

1.テクスチャを実行中にパッキングしてみる

1

今回の検証用に下の256×256のテクスチャを4枚用意しました。

それぞれのテクスチャ用にマテリアルを作って、4つの板ポリに順番につけているのでSetPassが4ある状態です。

 

まずはこれらのテクスチャをTexture2DのPackTexturesを使ってひとまとめにしたテクスチャを作ります。

 

 

2

パッキングしたテクスチャを設定したマテリアルをそれぞれの板ポリに設定してみました。共通のマテリアルになったため、これでSetPassが1の状態になりました。

 

しかし、これだと見た目がおかしいので、今度は元どおりになるようにそれぞれの板ポリのuv値を変更します。

 

 

3

これで最初の見え方のままでSetPassCallが1になりました。

2.パッキングしたテクスチャをそのまま圧縮してみる

パッキングしたテクスチャはTrueColorの状態です。
画質は綺麗ですが、メモリの容量を圧迫してしまうので圧縮を試してみます。

 

公式のAPIだとランタイムでのPVRTCやETC圧縮はサポートしていないようでした。
かわりに、GetRawTextureDataやLoadRawTextureといったテクスチャのバイナリを読み書きするAPIはあったので、それを使ってランタイムでのPVRTC圧縮を試してみました。

 

 

m1

パッキングしただけだと2MBありました。

 

圧縮すると…

 

m2

これで、PVRTC4bit圧縮により2MBが256KBまで減少しました。

 

Unityエディタ上でRead / Writeのチェックをしていると128KBまで落とせますが、ランタイム上で生成し、読み書き出来る状態のテクスチャのため2倍の256KBになっています。

 

株式会社Sumzap 採用情報

  • このエントリーをはてなブックマークに追加