ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

UE5 2の累乗じゃないテクスチャのミップマップ生成

UE5.1 のリリースノートに、2 の累乗じゃないテクスチャでミップマップが使えるようになったとあります。そこでちょっとだけ試してみました。

用意したのは2種類のサイズのテクスチャ。

・400 x 180 ‥ 4 の倍数なのでブロック圧縮が可能
・399 x 179 ‥ 圧縮不可

UE にインポートしたらテクスチャの設定を確認します。Mip Gen Settings が NoMipmaps になっているので、ミップマップのある別の設定に変えます。

するとどちらのテクスチャもこのようにミップマップの生成を確認できました。

各 Mip Level のサイズは以下のような感じ。
400 x180 / 200 x 90 / 100 x 45 / 50 x 22 / 25 x 11 / 12 x 5 / 6 x 2 / 3 x 1 / 1 x 1
399 x 179 / 199 x 89 / 99 x 44 / 49 x 22 / 24 x 11 / 12 x 5 / 6 x 2 / 3 x 1 / 1 x 1

レベルに配置してプレビューしてみましたが、ちゃんと効いていますね!

圧縮設定を変えてチャンネル数やファイルサイズの変化を見た感じでは、4 の倍数になっている方は圧縮は効いていて、そうではない方は効いていないと思われます。

ストリーミングされているのかはコンソールコマンド「ListTextures streaming」「ListTextures nonstreaming」で調べることができると思うのですが、ストリーミングはされていなさそう‥?400 x 180 の方は Format で BC4 が反映されています。

ひとまず簡易的なテストでした!

コンソールコマンドメモ:
r.streaming.poolsize Texture Streaming Pool Size を設定できる
stat streaming ストリーマがどれだけメモリを使用しているか確認できる
Obj List: Class=Texture2D どのテクスチャがロードされているか確認できる
r.Streaming.dropmips 1 Mip をキャッシュせず不要になったらすぐに破棄する
ListTextures streaming ストリーミングされているテクスチャを確認できる
ListTextures nonstreaming ストリーミングされないテクスチャを確認できる

正規表現メモ:
リストアップされた情報を整形する際、単にカンマをタブスペースに変換するだけでは (500KB, 0) みたいな部分もヒットしてしまうので、前方不一致指定で「(?<!KB), 」「\t」で置き換えると良い。

参考記事:
[UE4] テクスチャのメモリについて - Qiita
[UE4] Texture Streaming Pool Sizeの決め方を考えてみる - Qiita
[UE4] Texture Streaming Pool Over Budgetの意味 - Qiita
[UE4] Texture GroupがTexture Streamingに与える影響 - Qiita
[UE4] StreamingされないTextureはStreaming Texture Poolに入るのか?? - Qiita
[UE4] TextureのNever Streamの動的変更について - Qiita