Unreal EngineのLandscapeでマテリアルのブレンドの挙動がよくわからず思ったようにペイントできなかったので、それに関わるマテリアルのLandscapeLayerBlend
ノードのBlend Type
とランドスケープレイヤーのWeight Blend
について調査しました。
LandspaceLayerBlendノードのBlend Type
LandscapeLayerBlend
のBlend Type
プロパティには3つの選択肢LB Weight Blend
、LB Alpha Blend
、LB Height Blend
があります。公式ドキュメントの解説はそれぞれ次のようになっています。
LB Weight Blend
このモードは、World Machine などの外部プログラムのレイヤーを使用している場合や、レイヤーの順序を気にすることなく相互に独立したレイヤーをペイントできるようにしたい場合に使用します。
LB Alpha Blend
細部にペイントしたい場合や、レイヤーの順序が定義されている必要がある場合に、使用します。例えば、岩や草の上の雪をペイントすると、それらをオクルードできますが、雪を消すとその下の岩や草があらわれます。
LB Height Blend
これは LB_WeightBlend と同じですが、高さマップに基づいたレイヤー間の遷移に詳細も追加します。これを使用すると、例えば、岩と泥との間のスムーズなブレンドの代わりに、レイヤーの遷移点にある岩どうしの隙間に土が現れるようにすることができます。
引用: ランドスケープ マテリアル | Unreal Engine ドキュメント
解説によるとLB Weight Blend
はレイヤーの順番によらず各レイヤーのウェイトに基づいてブレンドを行います。推測ですが、3つのレイヤーA
、B
、C
があり、それぞれのウェイトが1.0
、0.5
, 0.3
のときA
、B
、C
それぞれの影響は1.0/(1.0+0.5+0.3)=0.555...
、(0.5)/(1.0+0.5+0.3)=0.277...
、(0.3)/(1.0+0.5+0.3)=0.166...
のようになるのだと思います。
LB Alpha Blend
はレイヤーの順番が影響し、上のレイヤーが下のレイヤーを隠すようになるということが想定できます。上のレイヤーのウェイトが0.8
のとき、(1.0-0.8)*(下のレイヤー)+0.8*(上のレイヤー)
みたいな計算が行われるのだと思います。
LB Height Blend
は高さも考慮したLB Weight Blend
なようです。基本的にはLB Weight Blend
と同じで応用的な利用方法のようなので、この記事ではこれ以上は触れません。
ランドスケープレイヤーのWeight Blend
ランドスケープレイヤーのWeight BlendにはWeight Blended Layer
とNon Weight Blended Layer
の2つがあります。公式ドキュメントの解説はそれぞれ次のようになっています。
Weight Blended Layer (normal)
相互に影響を及ぼす従来のレイヤーです。ウェイトがブレンドされたレイヤーのペイントは、他のウェイトがブレンドされたレイヤー全てのウェイトを減少します。例えば泥のペイントは草を取り除いて、草をペイントすると泥が取り除かれます。レイヤー情報オブジェクトの中で最もよく使用されます。
Non Weight Blended Layer
互いに独立しているレイヤーです。ウェイトがブレンドされていないレイヤーをペイントしても、その他のレイヤーのウェイトに影響は及びません。このレイヤーは別のレイヤーに雪をブレンドするなど、より高度なエフェクトの作成に使用します。草、泥、岩 _または雪を作成する代わりに、重みがブレンドされていない雪レイヤーを「草、泥または岩」とブレンドして、「雪の積もった草、泥、または岩」を作成します。
引用: Paint モード | Unreal Engine ドキュメント
Weight Blended Layer
とNon Weight Blended Layer
の違いはペイントした際に他のレイヤーのウェイトに影響するかどうかのようです。Weight Blend Layer
の場合はペイントするとそのレイヤーのウェイトを増加させるだけでなく、他のレイヤーのウェイトを減少させます。それに対してNon Weight Blended Layer
は、ペイントしてもそのレイヤーのウェイトを増加させるだけで、他のレイヤーのウェイトには影響しないみたいです。例示されている使用方法を考慮するとNon Weight Blended Layer
はLB Alpha Blend
と組み合わせて使用すると良さそうです。
検証
以下のようにRed
とGreen
という2つのレイヤーを持つシンプルなマテリアルを使って検証していきます。
まず、Red
とGreen
の設定を両方ともLB Weight Blend
、Weight Blended Layer
にして試してみます。
Red
が塗りつぶしの状態(赤色)でGreen
をペイントすると緑色になり、その上にRed
をペイントすると赤色になります。Green
をペイントすると赤色の成分がなくなることから、Weight Blended Layer
の解説通り、ペイントしているレイヤー(Green
)のウェイトを増加させるだけでなく他のレイヤー(Red
)のウェイトを減少させていることがわかります。
Blend Type
はLB Weight Blend
のままで、Red
とGreen
の両方をNon Weight Blend Layer
にした場合を試します。
この場合は、Red
が塗りつぶしの状態(赤色)でGreen
をペイントすると黄色になり、その上からRed
をペイントしても変化が起きませんでした。先の解説の通りNon Weight Blend Layer
ではGreen
をペイントしてもGreen
のウェイトが増加するだけでRed
のウェイトは減らないので、両方のウェイトが最大となった結果、赤色と緑色を足した色である黄色になりました。すでにRed
のウェイトは最大なので、この状態でRed
をペイントしても何も変わりません。
Red
をWeight Blended Layer
にしても同じ挙動になりました。このことからWeight Blend Layer
でのペイントも、Non Weight Blend Layer
のウェイトには影響しないことがわかります。
Red
をLB Weight Blend
でWeight Blended Layer
、Green
をLB Alpha Blend
でNon Weight Blended Layer
にして試してみます。
Red
が塗りつぶしの状態(赤色)でGreen
をペイントすると緑色になり、その上からRed
をペイントしても変化が起きませんでした。Green
はNon Weight Blended Layer
なのでペイントによりRed
のウェイトを減少させませんが、Red
に対して上のレイヤーであるGreen
のウェイトが増加したことでLB Alpha Blend
により赤色が隠されて緑色になります。
Red
のBlend Type
をLB Alpha Blend
にした場合や、Red
をNon Weight Blend Layer
をした場合でも同じ結果になりました。
Red
、Green
を両方ともLB Alpha Blend
、Weight Blended Layer
にしてみます。
Red
が塗りつぶしの状態(赤色)でGreen
をペイントすると緑色になり、その上からRed
をペイントすると赤色になります。Green
はLB Alpha Blend
ですが、Weight Blended Layer
になっているので、先ほどの挙動とは異なりRed
をペイントするとGreen
のウェイトが減り赤色が表示されます。
Red
、Green
がLB Weight Blend
でWeight Blended Layer
、Blue
がLB Alpha Blend
でNon Weight Blended Layer
の場合です。
Red
とGreen
がウェイトに基づいてブレンドされ、その上にBlue
がオーバーレイされます。
Red
、Blue
がLB Weight Blend
でWeight Blended Layer
、Green
がLB Alpha Blend
でNon Weight Blended Layer
の場合です。
Red
とBlue
がウェイトに基づいてブレンドされ、その上にGreen
がオーバーレイされます。レイヤーの順番的にはGreen
よりもBlue
の方が上ですが、それには関係なくLB Alpha Blend
がオーバーレイするようです。
Red
がLB Weight Blend
でWeight Blended Layer
、Green
、Blue
がLB Alpha Blend
でNon Weight Blended Layer
の場合です。
Red
の上にGreen
が、Green
のさらに上にBlue
がオーバーレイします。LB Alpha Blend
が複数ある場合はレイヤー順にオーバーレイされていくようです。
まとめ
検証結果を踏まえてわかったことです。
-
LB Weight Blend
はウェイトに基づいて他のLB Weight Blend
のレイヤーとブレンドされる。 -
LB Alpha Blend
はレイヤー順に関わらずLB Weight Blend
でブレンドした値の上にオーバーレイされる。複数のLB Alpha Blend
がある場合はレイヤー順でオーバーレイされる。 -
Weight Blended Layer
はペイントすると自レイヤーのウェイトを増加させるだけでなく、他のWeight Blended Layer
のウェイトを減少させる。 -
Non Weight Blended Layer
はペイントすると自レイヤーのウェイトを増加させるだけで、他のレイヤーのウェイトには影響しない。