Terrain (地形) の表面が草の塊や他の小さな物オブジェクト (岩など) で覆われている場合があります。Unity は、必要なディテールやパフォーマンスのレベルに応じて、テクスチャ化したクアッドや完全なメッシュを使用してこれらのオブジェクトをレンダリングします。
2021.2 より前では、草やその他のディテールは ビルトインレンダーパイプライン と ユニバーサルレンダーパイプライン (URP) でしか動作しませんでした。Unity は、2021.2 に HD レンダーパイプライン (HDRP) を含むすべてのレンダーパイプラインで動作するインスタンシングされたディテールを導入しました。
Terrain (地形) のディテールにはいくつかのモードがあり、それぞれのモードはゲーム開発中に異なる用途で使用されます。
モード | 説明 |
---|---|
インスタンスメッシュ | Unity ではこのモードの使用を推奨しています。理由は、このモードは、Terrain (地形) 上に任意の数のメッシュを配置する必要があるほとんどのシナリオで最適だからです。 インスタンシングしたメッシュを追加するには、Add Detail Mesh を選択し Use GPU Instancing オプションを有効にします。 |
Vertex Lit メッシュ | レンダリングに GPU インスタンシングを使用しません。代わりに、すべてのディテールインスタンスを 1 つのメッシュに結合します。結果的にシンプルなシェーディングとなり、実現できるインスタンスの数に制限があります。 Vertex Lit メッシュを加えるには、Add Detail Mesh を選択し、Render Mode を Vertex Lit に設定します。 |
草メッシュ | Vertex Lit メッシュと同様に動作しますが、Unity はこれらのメッシュを草として扱うので、常に上向きの法線を持ち、風で動きます。 草のメッシュを追加するには、Add Detail Mesh を選択し、Render Mode を Grass に設定します。 |
草テクスチャ | 風で動く草のクアッドメッシュをテクスチャから直接作成できます。カスタムメッシュを指定する必要はありません。また、ビルボード効果のために草のクアッドを常にカメラに向けるようにするオプションも用意されています。 このオプションを使うには、Add Grass Texture を選択します。 |
草とディテールのペイントを利用するには、Terrain Inspector のツールバーで、Paint Details (ディテールをペイント) ボタンを選択します。
最初は、Terrain に利用できる草やディテールはありませんが、Inspector ウィンドウで Edit Details ボタンをクリックすると、Add Detail Mesh と Add Grass Texture オプションが表示されます。いずれかのオプションを選択すると、ウィンドウが表示され、Terrain をペイントするアセット の選択ができます。
Detail Prefab フィールドを使用して、プロジェクトからプレハブを選択します。本物らしい外観を作成するために、各メッシュはランダムなファクターでサイズと色を決定されます。Unity は、パーリンノイズアルゴリズムを使用して、このようなランダムファクターを生成します。
Min Width、Max Width、Min Height、Max Height の値は、メッシュをランダムに生成する X 軸と Y 軸に沿った上下のスケーリングを指定します。
Align to Ground (%) 値は、詳細軸が地形の法線にどれだけ整列するかを指定します。0 は整列しておらず、100 は法線に完全に整列しています。
Position Jitter (%) は、ディテール分布のランダム性を、順序付きからランダムまでコントロールします。これは、Quality 設定 でレガシー分布がオフになっている場合にのみ使用できます。
Noise Seed 設定は、乱数生成のシードを設定します。固有のシード値が一意の値を生成するのに必要です。もし、2 つのタイプのディテールに同じシードを設定すると、まったく同じインスタンスが生成されます。Noise Spread 値は、X-Z 平面上のノイズパターンのスケーリングを参照し、値が高いほど与えられた領域内でより多くのバリエーションがあることを示します。
Hole Edge Padding (%) 設定は、ディテールオブジェクトが穴領域の端からどのくらい離れているかを制御します。詳細は、DetailPrototype.holeEdgePadding を参照してください。
Detail Density の値は、サイズに対するディテールの密度をコントロールします。これは、Terrain (地形) 設定 で設定された “Coverage” ディテール散布モードで有効にできます。
Healthy Color と Dry Color の設定は、カラーバリエーションを制御します。Unity は健康的な色と乾いた色の間でリニア補間を行い、メッシュのサイズに基づいて色を選択します。例えば、システムは大きなサイズのメッシュをより生命力に満ちたものにしたい場合は、そのようなメッシュのリニア補間の結果は Healthy Color の色合いにより近づきます。これらのカラー設定はインスタンスメッシュに影響しないため、 Use GPU Instancing を選択すると表示されません。
密度スケールの影響を受ける チェックボックスは、地形設定 で設定した[ディテールの密度スケール] 設定がこのディテールに影響するかどうかを決定します。
Render Mode を Vertex Lit または Grass に設定できます。
Render Mode | 説明 |
---|---|
Vertex Lit | シーンで、ディテールメッシュを風に吹かれても動かない固定の、Vertex Lit ゲームオブジェクトとしてレンダリングします。 |
Grass | シーンで、ディテールメッシュをグラステクスチャに似た簡易化したライティングでレンダリングします。ディテールは、風に吹かれて動きます。 |
ノート: Vertex Lit または Grass レンダーモードを使用してディテールにテクスチャを適用するには、それらのマテリアルの **MainTex** material マテリアルプロパティ (ビルトイン/URP の 通常色マップのデフォルトプロパティ名) にテクスチャが割り当てられている必要があります。インスタンス化されていないディテールでは、他のマテリアルプロパティは考慮されません。_
さらに、詳細メッシュのレンダリングに GPU インスタンシングを使用するかどうかを指定することができます。GPU インスタンシングでは、プレハブで指定されたマテリアルとシェーダーがレンダリングに使用されます。これにより、シェーダーでより多くのカスタマイズを行うことができ、Shader Graph を使用することができます。
Unity は、各インスタンスに Width と Height ノイズを適用しますが、Healthy Color/Dry Color ノイズを無効にします。シェーダーでは、他の多くのランダム化の技法とともに、独自のカラーバリエーションの方法を使用できます。
Unity GPU インスタンシング の制限の一部は、レンダリングに影響を及ぼします。以下はその例です。
Unity がフレームごとに動的にインスタンス定数バッファを構築する通常のインスタンシングとは異なり、ディテールのインスタンシングは、それがターゲットハードウェアで可能な場合、CPU と GPU のパフォーマンスを向上させる永続的な定数バッファを持っています。ただし、それと引き換えに GPUメモリ使用量が少し増加します。
Use GPU Instancing を選択すると、Render Mode の設定がグレーアウトして利用できなくなります。
Add Grass Texture ウィンドウ
Detail Texture は草を表現するテクスチャです。テクスチャは Asset Store からテクスチャをダウンロードしたり、独自のテクスチャを作成することができます。テクスチャは空白部分のアルファ値を 0 に設定した小さな画像です。“草” は総称にすぎません。テクスチャを使って花や、有刺鉄線コイルのような人工的なオブジェクトを表現することも可能です。
Min Width、Max Width、Min Height、Max Height、Noise Seed、Noise Spread、Hole Edge Padding (%)、Align to Ground (%)、Position Jitter (%)、Detail Density、Affected by Density Scale、Healthy Color、Dry Color の各設定は、上記の “ディテールメッシュを加える” セクションで説明されているようにメッシュの場合と同じ働きをします。
最後に、Billboard オプションを有効にすると、草の画像は常にカメラを向くように回転します。これは、草の密集した草原を表示したい場合に便利です。なぜなら、密集した草は 2 次元であり、側面から見えないからです。ただし、草がまばらな場合には、個別の草の塊が回転するのが判ってしまうので、奇妙な効果が発生してしまいます。
ディテールを削除するには、削除するディテールを選択し、Edit Details ボタンをクリックし、 Remove を選択します。ディテールを削除すると、そのディテールを配置した Terrain (地形) 領域を表すデータが除去されます。