Unreal Engine でランドスケープを作成するときには、審美性とパフォーマンスの間でバランスを取るのが困難になることがあります。ランドスケープをビルドする際には、Landscape アクタがどのように構成されているかと、高いパフォーマンスを引き出すことのできる寸法について把握しておくことが重要です。ただし、作業を始めるときから、ランドスケープの高さマップの有効なサイズが明確になっているとは限りません。高さマップの有効なサイズを判断する (最適なサイズの判断を可能にする) には、ランドスケープの基本的なアーキテクチャについて十分に理解していなければなりません。ランドスケープの基本的なアーキテクチャについてはこのページで説明します。
ランドスケープコンポーネント
ランドスケープは複数のランドスケープ コンポーネントに分割されます。ランドスケープ コンポーネントは、レンダリングおよび可視性の計算、コリジョンにおいて Unreal Engine の基本単位となります。ランドスケープに配置されているすべてのランドスケープ コンポーネントは、すべて同じサイズで、常に正方形です。ランドスケープ コンポーネントのサイズはランドスケープ作成時に決定され、そのランドスケープのサイズと詳細度に応じて異なります。
各ランドスケープ コンポーネントの高さデータは 1 つのテクスチャに格納されます。そのため、テクスチャのサイズを表す頂点の数は 2 の累乗である必要があります。2 つの隣り合うランドスケープ コンポーネントが接するエッジ上で共有する頂点の列は、各ランドスケープ コンポーネント内で複製されて格納されます。このため、各ランドスケープ コンポーネント内の四角ポリゴン (クワッド) の数について検討することが有効となります。
下図は非常に単純なランドスケープです。全体の輪郭が緑で示され、4 つのランドスケープ コンポーネントが含まれています。各ランドスケープ コンポーネントは単一のクワッドで構成されています。これはランドスケープ コンポーネント同士の接触部分の頂点がどのように複製されるかを示すために 1 つのランドスケープ コンポーネントを分離しています。
4 つのランドスケープ コンポーネントで構成されているランドスケープ
コンポーネント セクション
コンポーネントは、必要に応じて、1 つ、または 4 つ (2x2) のサブセクションに分割することで、ランドスケープの解像度を向上させることができます。サブセクションはランドスケープの LOD 計算の基本単位となります。
4 つ (2x2) のサブセクションを利用すれば 1 つのサブセクションで 4 倍のランドスケープ コンポーネントを使用して同じサイズの高さマップに分割することができますが、ランドスケープ コンポーネントの使用数が少ない方が高いパフォーマンスを得られます。
頂点で表した各セクションのサイズも、2 の累乗値でなければなりません (最大値は 256)。これによって、異なる LOD レベルをテクスチャのミップマップに保存することが可能になります。こうすることで、各ディレクトリのランドスケープ コンポーネント内のクワッド数が、2 の累乗値から 1 を減算した数 (1 ランドスケープ コンポーネントにつき 1 セクションの場合) となるか、あるいは、2 の累乗値から 2 を減算した数 (1 ランドスケープ コンポーネントにつき 4 セクションの場合) となります。
下図は、個別のランドスケープ コンポーネントです。全体の輪郭が緑で示され、4 つのセクションで構成されています。各セクションは 9 個 (3x3) のクワッドで構成されています。ここでも、セクションが接する頂点が重複していることがわかります。
4 つのサブセクションで構成されているランドスケープ コンポーネント。
ランドスケープ コンポーネントの UI
Landscape アクタは、識別しやすいように、ランドスケープ コンポーネントのタイプごとに色分けされています。ランドスケープのエッジは黄色、各コンポーネントのエッジは薄緑、セクションのエッジ (2x2 セクションの場合) は緑、ランドスケープの個々のクワッドは深緑で強調表示されます。
UI の色を表示したビューポートで作成されている新しいランドスケープ。
色 | 説明 |
---|---|
黄 | Landscape アクタのエッジ |
薄緑 | ランドスケープ コンポーネントのエッジ |
緑 | ランドスケープ セクションのエッジ |
深緑 | ランドスケープの個別のクワッド |
パフォーマンスに関する考慮事項
ランドスケープ コンポーネントの総数とランドスケープ コンポーネント サイズの選択は、パフォーマンスに関してトレードオフの関係にあります。ランドスケープ コンポーネントのサイズが小さくなると LOD の遷移が速くなり、より多くのテレインがオクルージョンされますが、サイズが小さいとより多くのランドスケープ コンポーネントが必要になります。
それぞれのランドスケープ コンポーネントでレンダリングスレッドの CPU の処理負荷が増大します。また、セクションごとに 1 つのドローコールが実行されるため、コンポーネントの数を最小限に抑える必要があります。きわめて大規模なランドスケープの場合、Epic では最大 1024 ランドスケープ コンポーネントという値を推奨しています。
高さマップの寸法を計算する
メモリおよびパフォーマンス上の効率を維持しながら、きわめて大規模なテレインに対応できるシステムを構築するためには、アーキテクチャによって高さマップのサイズに制限が課されます。これらの制限については、以下で説明しています。つまり、一部の寸法は有効であるものの、その他は無効であるということです。
ランドスケープのサイズは、各セクションに含まれるクワッド数、および、各ランドスケープ コンポーネントに含まれるセクション数、ランドスケープ内のランドスケープ コンポーネントの総数に基づきます。コンポーネントの総数とそれらコンポーネントそれぞれの解像度が決まれば、以下の式を使用して、ランドスケープ全体のサイズを計算することができます。
(AQuads + 1, BQuads + 1)
ここで、A と B は各方向のランドスケープ コンポーネントの数で、Quads (クワッド) はランドスケープ コンポーネントあたりのクワッド数です。
以下は、この式を使用した 2 つの例です。
例 1
まず、64x64 の頂点を含んでいる単一のサブセクションで構成されている 1 つのランドスケープ コンポーネントの場合、このランドスケープ コンポーネントのサイズは 63x63 クワッドです。ランドスケープにこういったランドスケープ コンポーネントが 10x10 ある場合、ランドスケープに合計 630x630 のクワッドがあることになります。このランドスケープの高さをインポートするには、631x631 の頂点で構成される高さマップが必要です。なぜなら、頂点の列は常にクワッドの数より多いためです (たとえば、1x1 クワッドには 4 個の頂点が必要)。したがって、631x631 が有効なランドスケープのサイズとなります。
例 2
1 つのランドスケープ コンポーネントを 4 つのサブセクションに分割した場合、各セクションは 64x64 の頂点からできています。すなわち、各セクションは 63x63 のクワッドからなり、各ランドスケープ コンポーネントは 126x126 のクワッドから構成されることになります。このようなコンポーネントが 32x32 ある場合、縦横各方向に合計 126 * 32 = 4032 ずつのクワッドがあることになります。したがって、ランドスケープ全体での頂点数は 4033x4033 になります。
上記の例は正方形のランドスケープでした。ただし、正方形以外のランドスケープを作成することも可能です。各コンポーネントに 63 個のクワッドがあるとして、AxB 個のコンポーネントからなるランドスケープを作ることができ、そのトータルのサイズは頂点数で (A63+1 , B63+1) となります。
高さマップ Z スケールを計算する
Unreal Engine は -256 ~ 255.992 までの 16 ビット精度で格納された値を使って高さマップの高さを計算します。計算された高度が、高さマップ データをインポートするときに入力した Z スケール値で乗算処理されます。たとえば、Z スケール値が 1 の場合、最大高度は約 256 cm、最大深度は -256 cm になります。したがって、デフォルトの Z 値 100 の場合、高度値は 256 m と -256 m になります。
インポート プロセス時の Z スケールの調整。
カスタム高度を計算する場合、カスタム高度値を Unreal Engine で使用される -256 から 256 の範囲に変換するための比率を使用する必要があります。高度範囲は合計で 512 ユニット (-256 ~ 0 は 256 ユニット、0 ~ 256 はさらに 256 ユニット) なので、比率は 1/512 または 0.001953125 です。
まず、測定値をセンチメートルに変換して、比率で乗算することで、これを適用します。
次に例を示します。
マウナ・ケア山 (ハワイ諸島にある標高 4207 m の火山) を Unreal Engine レベルで表現する方法です。
- まず、4207 に 100 を乗算して高さをセンチメートルに変換します。420.700 cm になります。
- 次に、新しい値に先ほどの比率を乗算します。420,700 x 0.001953125 = 821.6796875 です。
- Z スケール値は 821.6796875 となり、高さマップは -210,350 cm から 210,350cm となります。
この処理によって、海水面以下の値はない、山の正確な高さが得られます。ランドスケープ高度に追加の空間を追加するには、初期高度を調節します。この例を使用すると、マウナ・ケア山を海水面より下に 5,761m 延長すると、高度全体は 9,968m から開始します。
ランドスケープの推奨サイズ
以下のランドスケープの推奨サイズのリストは、エリアを最大化しながらランドスケープ コンポーネント数を最小化します。
全体のサイズ (頂点数) | クワッド / セクション | セクションシーン / コンポーネント | ランドスケープ コンポーネントのサイズ | ランドスケープ コンポーネントの総数 |
---|---|---|---|---|
8129 x 8129 | 127 | 4 (2x2) | 254x254 | 1024 (32x32) |
4033 x 4033 | 63 | 4 (2x2) | 126x126 | 1024 (32x32) |
2017 x 2017 | 63 | 4 (2x2) | 126x126 | 256 (16x16) |
1009 x 1009 | 63 | 4 (2x2) | 126x126 | 64 (8x8) |
1009 x 1009 | 63 | 1 | 63x63 | 256 (16x16) |
505 x 505 | 63 | 4 (2x2) | 126x126 | 16 (4x4) |
505 x 505 | 63 | 1 | 63x63 | 64 (8x8) |
253 x 253 | 63 | 4 (2x2) | 126x126 | 4 (2x2) |
253 x 253 | 63 | 1 | 63x63 | 16 (4x4) |
127 x 127 | 63 | 4 (2x2) | 126x126 | 1 |
127 x 127 | 63 | 1 | 63x63 | 4 (2x2) |
RAW 形式の高さマップをインポートする
Unreal Engine では、次の形式を使用した高さマップの画像のインポートをサポートしています。
- 16 ビット グレースケール PNG
- 8 ビット グレースケール r8
- 16 ビット グレースケール r16
これらの形式は、ビット深度が既知であり正方形であることが想定されるため、推奨されます。
高さマップ データは、別の JSON ファイルを使用して .raw 形式でインポートすることもできます。このファイルは、高さマップの幅、高さ、およびビット深度を定義するために使用されます。
.raw 高さマップ ファイルをインポートするには、次のプロセスを使用します。
- 新しい .JSON ファイルを高さマップと同じフォルダに作成します。
- ファイルに高さマップとまったく同じ名前を付けます。
- 次のスクリプトをファイルに追加します。
json
{
"width": 1024,
"height": 1024,
"bbp": 8
}
上の例では、スクリプトはエンジンに、同じ名前の高さマップが 1024 x 1024 で、ビット深度が 8 であると伝えています。高さマップのインポートについては、「ランドスケープ高さマップをインポートおよびエクスポートする」を参照してください。
Layer Debug モード
Layer Debug モードを有効にすると、ビューポートのランドスケープ上での特定レイヤーのウェイトの可視性を切り替えます。ビューポート メニューから Layer Debug モードを切り替えるには、[View (表示)] > [Landscape Visualizers (ランドスケープ ビジュアライザ)] を選択します。
ランドスケープ デバッグ ビジュアライザを有効にする
レイヤー デバッグ ビジュアライザを有効にすると、ターゲット レイヤーごとに個別のカラー チャンネルをリストで選択できます。
ランドスケープ デバッグ ビジュアライザを使用して、ランドスケープのペイント レイヤーをビジュアライズする。
チャンネルを選択すると、チャンネルがカバーする選択したターゲット レイヤーのエリアを表示するシェーダーがランドスケープに反映されます。
ランドスケープに適用されているランドスケープ デバッグ ビジュアライザ。