Version: 2020.3
言語: 日本語
フレームデバッガー
Streaming Controller

ミップマップストリーミング

Mip Map Streaming (ミップマップストリーミング) システムは、Unity がメモリにロードするミップマップレベルを制御します。このシステムは Unity がテクスチャのために必要な合計メモリ量を削減します。なぜなら、ミップマップストリーミングシステムは、デフォルトでシーン内のすべてのミップマップをロードするのではなく、シーンの現在のカメラ位置のレンダリングに必要なミップマップのみをロードするからです。これにより、少量の CPU リソースと引き換えに、多くの GPU メモリを節約することが可能です。

ミップマップストリーミングの Memory Budget (メモリバジェット) を使用して、プロジェクトで使用するすべてのテクスチャの合計メモリ量を設定することもできます。ミップマップストリーミングシステムは自動的にミップマップレベルを下げてこの設定内に留めます。

ミップマップストリーミング API を使用して、特定のテクスチャに特定のミップマップレベルをリクエストできます。Unity は、ミップマップ選択のためのエンジンロジックを複製するサンプルの C# コードを提供しています。これを使用して、プロジェクトのためにエンジンロジックをオーバーライドできます。詳細は、ミップマップストリーミング API を参照してください。

Unity の Viking Village デモプロジェクトでは、ミップマップストリーミングはカメラの場所に応じて、テクスチャメモリの 25 - 30% を節約します。

はじめに

ミップマップストリーミングを有効にするには、Unity の Quality 設定 (Edit > Project Settings > Quality) に移動し、Texture Streaming チェックボックスをチェックします。これにより、ミップマップストリーミングシステム特有の設定が表示されます。各設定の詳細は、Quality 設定 を参照してください。

これを行うと、個々のテクスチャにミップマップストリーミングを設定し、ミップマップストリーミングシステムが各テクスチャのミップマップをディスクからメモリにストリーミングできるようにします。これを行うには、ミップマップストリーミングを適用するテクスチャを選択し、インスペクターウィンドウに移動し、テクスチャインポートの設定を表示します。 Advanced 設定を開き、Streaming Mip Maps チェックボックスにチェックします。

Android 用に開発する場合は、Build Settings (ビルド設定) を開き、Compression MethodLZ4LZ4HC に設定する必要があります。 Unity では、ミップマップストリーミングシステムが依存する 非同期テクスチャのロード にそれらの圧縮方法の 1 つが必要です。

Unity はテクスチャの Memory Budget を観察しながら、可能な限り高い解像度レベルでミップマップを読み込みます。より詳細な制御や、テクスチャストリーミングシステムで自動的に得た結果の微調整を行うには、C# API を使用して各テクスチャのミップマップレベルを指定します。詳細は、ミップマップストリーミング API を参照してください。

制限

以下のいずれかの方法で、ミップマップストリーミングに必要なミップマップレベルの計算をするよう指示できます。

  • 各テクスチャを Unity レンダラーに設定されているマテリアルに割り当てます。
  • Texture2D.requestMipmapLevel を使って手動でミップレベルをリクエストします。

これらの方法のいずれかを使用して、ミップマップレベルを計算するようにミップマップストリーミングに指示しないと、Unity はどのミップレベルを使用するかを計算できません。このことは、Unity が低品質のミップを使用してテクスチャをロードし、ぼやけて見える原因になります。

以下のシステムは、標準的なレンダラーを使用しません。このため、これらのシステムに要求されるミップマップを手動で設定するか、Unity が使用するテクスチャを低解像度でロードする必要があります。

  • デカールプロジェクターテクスチャ
  • リフレクションプローブテクスチャ: 解像度の低いミップマップは、粗さ (roughness) のルックアップテーブルになります。そのため、Unity が低いミップマップレベルを使用すると誤った粗さでマテリアルをレンダリングしてしまいます。
  • Unity の Terrain (地形) システムのテクスチャ: Unity はTerrain (地形) テクスチャ のミップマップストリーミングをサポートしていません。これは、Unity がテクスチャをタイル化してブレンドするために、Terrain (地形) テクスチャが常にフル解像度で利用可能である必要があるためです。
  • テクスチャの UV 座標を Unity のビルトインシェーダーとは異なる方法で処理するシェーダー。Unity は常に、テクスチャが Msh に格納されている UV0 を使ってサンプリングされていると仮定します。スケールやトランスレーション (後述参照) や UV1 の使用以外の、シェーダーによるテクスチャ座標の変更は考慮されません。

レンダラーがアクティブなとき、レンダラーが使用するメッシュは、望ましいミップマップレベルを計算するために有効な UV 分布メトリクスを必要とします。Unity では、メッシュのインポートプロセスの一環として、自動的に分配メトリクスを計算します。また、Mesh.GetUVDistributionMetric を使って、スクリプトで計算することもできます。

Unity がストリーミングされたテクスチャを直接 API(Graphics.DrawMeshNow など) でレンダリングする場合、システムにはミップレベルを計算するためのレンダラーバウンドやその他の情報がありません。そのため、テクスチャのミップレベルを明示的に設定するか、このテクスチャのミップマップストリーミングを無効にする必要があります。ロードするミップを手動で設定する方法の詳細は、Texture2D.requestMipmapLevel のドキュメントを参照してください。

ミップマップストリーミングのデバッグ

Unity にはビルトインのミップマップストリーミングデバッグビューモードがあります。それにアクセスするには、シーンビューの描画モードのドロップダウン をクリックし、Texture Streaming を選択します。このビューモードでは、ミップマップストリーミングシステム内でのゲームオブジェクトの状態に応じて、ゲームオブジェクトに以下の色を設定します。

  • Green - ミップマップストリーミングシステムによってミップマップが減少したテクスチャ。
  • Red - ミップマップストリーミングシステムにすべてのミップマップをロードするのに十分なリソースがないため、ミップマップがほどんどないテクスチャ。
  • Blue - ストリーミングに設定されていないテクスチャ、またはミップレベルを計算するレンダラーがない場合。

また、デバッグ API を使って、独自のカスタムデバッグツールやビジュアライゼーションを作成することもできます。

重要: MainTexture プロパティ属性を使って、シェーダーのメインテクスチャにフラグを立てる場合、これらのテクスチャはデバッグモードでは表示されません。これを回避するには、常に _ Maintex という名前のテクスチャプロパティを使用してマテリアルのメインテクスチャを示してください。

フレームデバッガー
Streaming Controller