Compute Terrain



基本的に『Compute Terrain』は2つの事を行います:
  1. 選択した「パッチサイズ(一回の操作で処理する量)」に従ってサーフェス法線を計算します。
  2. テクスチャ座標(シェーダ座標)を更新して、サーフェスの現在の形状に合わせます。後述する理由から、選択した「パッチサイズ」に従って、それは地形のやや滑らかなバージョンです。

『Compute Normal』は、『Compute Terrain』と同じ方法でサーフェス法線を計算しますが、テクスチャ座標は更新しません。

1.Surface normal(サーフェス法線)

サーフェスの「法線」とは、サーフェスに垂直なベクトルです。この法線の一式を、サーフェスから指し示す一群の矢印として視覚化する事が出来ます。平らな平面では、矢印はすべて上方向を指しますが、断崖の側面の場合、サーフェス法線の向きは断崖から横を指し示します。

慣例上、3Dグラフィックスではサーフェス法線がライティング計算に使用されます。しかし、ディスプレースメントシェーダの出現と共に、サーフェスを置き換える方向性が必要になり、通常これはサーフェス法線に沿っていますが、常にそうとは限りません。

ディスプレースメントはTGのどの方向でも起こりますが、ほとんどのシェーダはデフォルトでサーフェス法線に沿って置き換えられます。これは、通常仕様として望むものであり、岩石が断崖の側面を上下に歪ませるのではなく、険しい断崖の側面から突き出る事が出来るようにするためのものです。 『Compute Terrain』または『Compute Normal』が存在しない場合、サーフェス法線は単なる局部的な「上向き」のベクトルになります(これは惑星の中心から離れた地点のベクトルです)。他のオブジェクトの場合は、状況は異なりますが、『Compute Terrain』と『Compute Normal』は惑星上でのみ使用する事をお勧めします。

「パッチサイズ」は、サーフェス上の位置に対してサーフェス法線がどれくらい速く変化するかに影響します。サーフェス法線を計算した後に非常に大きなディスプレースメントが発生した場合は、これを頭に入れておく事が重要です。例えば、100メートルのスパイク(突出)地形を作成するディスプレースメントシェーダがあり、それを『Compute Terrain』または『Compute Normal』の後に適用するとします。基礎となる地形がかなり凸凹で、『Compute Terrain』の"Gradient patch size"が1メートル足らずの場合、サーフェス法線は非常に急速に方向を変更します。スパイクはいくつかの場所で重複し、他の場所ではるか遠くに広がります。この場合の解決法は、サーフェス法線がより緩やかに変化するように、"Gradient patch size"を目安100メートルに増加させる事でしょう。

サーフェス法線は、『Surface Layer』や『Distribution Shader』の勾配制限など、他の目的にも使用されます。『Surface Layer』を使用してディスプレースメントを適用する時や、『Distribution Shader』を使用してディスプレースメントをコントロールする時に勾配制限を使用する場合はサーフェス法線が重要となります。

Final normal(最終法線)

ただし、勾配制限を使用してサーフェスの色やその他の非ディスプレースメントの属性のみをコントロールする場合は、特にサーフェス法線を心配する必要はありません。すべてのディスプレースメントが適用された後、マイクロポリゴンから自動的に計算される、これを"Final normal"と呼びます。これにより、最高レベルのディティールが得られます。シェーダによっては、勾配などに基づいて効果を適用する時にどのタイプの法線を使用するかを決める選択肢がありますが、これはディスプレースメントと色の両方に同じ制限を適用する場合に便利です。

Terragenにおいて、ライティング計算のためのサーフェス法線を考慮する必要はありません。TGのすべてのシェーダは現在、ライティング計算に"Final normal"を使用しています。

2.テクスチャ座標

TGには、ディスプレースメントとカラーの両方を適用するシェーダが多数あり、その2つが可能な限り近接に整列する事が重要です。すべてのシェーダからのすべてのディスプレースメントが起こされた後に、すべてのカラーや非ディスプレースメントの陰影効果が発生します。これらがネットワーク上で離れた位置にあった場合、ディスプレースメントを計算して最終位置が決定する前のサーフェス上でカラーと陰影効果が動作するため、連続するディスプレースメントの途中であるシェーダで問題を引き起こす可能性があります。ディスプレースメントを実行するだけの場合は問題ありませんが、ディスプレースメントに合わせて配置する必要があるカラーを適用すると不一致が発生します。

この問題を解決するために、TGのほとんどのシェーダはテクスチャ座標を使用し、それらをノイズ関数に供給してディスプレースメントとカラーの両方を計算します。最初は、地形上の任意の点のテクスチャ座標は、ディスプレースメント前の地形のその部分の3D座標、つまり地形が変位した惑星の平面部分です。残念ながら、これはテクスチャを引き伸ばさないため断崖の側面をテクスチャで埋める事を不可能にし(さらに、非常に多くのシェーダがテクスチャ座標を使う必要があるので他の問題も引き起こします)、連続するシェーダのある段階で、変位した地形座標からテクスチャ座標をコピーする必要があります。法線の計算と同様に、『Compute Terrain』がこの一連の処理を行います。法線を再計算せずにこれらの座標をコピーするには、『Tex Coords From XYZ』を使用する事でも可能です。

テクスチャ座標は、カラーや非ディスプレイスメントの陰影処理が発生する前に更新することが重要です。そうしないと、カラーや非ディスプレイスメントがディスプレースメントで計算した最終位置と正しく一致しません。

平滑化テクスチャ座標

『Compute Terrain』ノードは、上記の両方の機能(サーフェス法線とテクスチャ座標)を実行します。ただし、テクスチャ座標を計算する時に、実際には後で修正された『Surface Layer』の特殊効果に使用される僅かに修正された変形座標が生成されます。これらは"Smoothed texture coordinates(平滑化テクスチャ座標)"です。

平滑化テクスチャ座標は、『Surface Layer』ノードの "Smoothing effect"で利用する、地形のより滑らかな変形として機能します。これらの平滑化テクスチャ座標は、同ノードの"Intersect Underlying"が正しく機能するためにも不可欠です。

"Smoothing effect"が作用するスケールは、『Compute Terrain』の"Patch size"によってコントロールされるため、これは"Intersect Underlying"機能の結果に影響します。

『Compute Terrain』ノードの動機付け

「地形」と「サーフェスシェーダ」の概念を分離し、それらを1つのノードで区切るのが簡単になるように、サーフェス法線とテクスチャ座標の両方を1つのノードに結合すると便利だと判断しました。あなたが適用するどんな大規模なディスプレースメントもサーフェス法線が計算される前に起こらねばならず、さらにこれに先駆けて着色する事を避けるならば、同様に役に立ちます。そこで、すべてを1つの『Compute Terrain』ノードにまとめました。カラーを適用するシェーダは、ディスプレースメントとカラーを適切に結び付ける事が出来るようにし、傾斜と高度の制約が適切に機能するように、『Compute Terrain』の後に配置する必要があります。それはまた、「平滑化テクスチャ座標」がその"Smoothing effect"や"Intersect Underlying"効果のために、それらを使用する必要があるすべての『Surface Layer』に利用可能である事を保証します。
『Compute Terrain』はまた、別の目的に役立ちます。ユーザーインターフェイスに対して、シェーダを別々の地形ノードリストとシェーダノードリストに分けるポイントを示します。これは、ポップアップメニューを介して、『Compute Terrain』およびそれ以降の他のすべてのシェーダの前に大規模なディスプレースメント(地形)の使用を促進する事に役立っています。それはまだ非常に不格好で、なぜこのように機能するのか明確ではないので、将来改善する事が出来る事を望むインターフェースの一面です。

『Compute Normal』または『Compute Terrain』ノードを追加する場合の注意点

『Compute Terrain』に先駆けて大規模なディスプレースメントを実行する場合は、傾斜や高度に応じてディスプレースメント量を制限する必要があります。高度について見分ける必要がある場合は、計算が非常に速い『Tex Coords From XYZ』ノードを使用します。ディスプレースメントが傾斜について見分ける必要がある場合、例えばディスプレースメントに影響を与えるために『Distribution Shader』を使用する場合などは『Compute Normal』を使用します。ただし、『Compute Normal』と『Compute Terrain』は、それらの入力の計算を遅くし、それらが使用されるたびに遅くなります。減速はインプットシェーダによるネットワークにのみ適用されるため、連続するシェーダ内でこれらがフローの高い位置の場合、減速は最小限に抑える事が出来ます。インプットされたディスプレースメントの計算に必要な時間を約3倍に増加させます。

設定

Gradient patch size 勾配パッチサイズ 一回の操作で処理する量を言い、サーフェス上の位置に対してサーフェス法線がどれくらい速く変化するかに影響します。サーフェス法線を計算した後に非常に大きなディスプレースメントが発生した場合は、これを頭に入れておく事が重要です。例えば、100メートルのスパイク(突出)地形を作成するディスプレースメントシェーダがあり、それを『Compute Terrain』または『Compute Normal』の後に適用するとします。基礎となる地形がかなり凸凹で、『Compute Terrain』の"Gradient patch size"が1メートル足らずの場合、サーフェス法線は非常に急速に方向を変更します。スパイクはいくつかの場所で重複し、他の場所ではるか遠くに広がります。この場合の解決法は、サーフェス法線がより緩やかに変化するように、"Gradient patch size"を目安100メートルに増加させる事でしょう。
Smooth surface 滑らかなサーフェス サーフェスの法線を滑らかに処理しますが、パッチサイズの大きさに比例してノイズが出やすくなります。その場合は、『Surface layer』の[Smoothing]タブにある"Smoothing effect"にチェックを入れて回避する事で同等の効果が期待できます。