マテリアル データの操作と演算

マテリアル グラフでデータ タイプを操作して演算を実行するための技法。

マテリアルのデータ タイプ のページでは、マテリアル エディタ内でデータを表現する 4 つの方法を説明しました。マテリアルを効果的に作成するには、これらのデータ タイプを把握するだけでなく、データの操作やマテリアル グラフ内で情報を伝える方法の制御についても理解する必要があります。

このドキュメントでは次の 2 つの項目について検討します。

  1. データ タイプの操作:複数の浮動小数値を一つのマルチチャンネル ベクターにまとめる方法と、逆に、より大きなデータ タイプから情報を分離する方法。

  2. マテリアル グラフの演算:さまざまなデータ タイプを使ってマテリアルで算術演算を実行するための規則とプロセス。

データ タイプの操作

あるデータ タイプとして作成された情報は、別のタイプに変換することが可能です。例えば、2 つのスカラー パラメータ (浮動小数値) を 2 チャンネル データを必要とする入力に渡すために、これらを 2 チャンネル ベクター (float2) に組み合わせる、または 追加 することができます。またその逆に、ComponentMask を使って、より大きなベクターから特定のチャンネルのサブセットを取得することができます。

このセクションに記載されているマテリアル表現式は、マテリアル グラフ内での情報の流れを制御するために、データの組み合わせと分離を行う方法を提供するものです。

AppendVector

AppendVector マテリアル表現式では、入力 A にあるデータを 入力 B* にあるデータと組み合わせて、マルチチャンネル ベクター (float2、float3、または float4) を出力します。この例では、2 つの定数が一緒に追加されて float2 (1, 2)** が出力されます。

AppendVector Node

ユース ケース例

この Append ノードは、2 つの値をそれぞれから独立した形で個別に修正しながら、マルチチャンネル データを必要とする入力にそれらを渡す必要がある場合に便利です。次のグラフには、マテリアル インスタンスに含まれるテクスチャのタイリング、もしくは UV スケール を制御するフローが示されていますが、均一な制御のみが可能です。

UV Tiling controls uniform

この例の欠点は、UV 座標には 2 つのチャンネルがあるものの、マテリアル グラフに含まれているのは 1 つのパラメータのみである点です。このソリューションでは、テクスチャの幅と高さをそれぞれ個別に制御することはできません。

これを解決するには AppendVector を使用します。各軸のスカラー パラメータをそれぞれ個別に作成し、それらを Append ノードに渡します。Append ノードでは 2 つのパラメータを 1 つの float2 に組み合わせます。この float2 はテクスチャ座標によって乗算されます。

UV tiling controls two-channel

Tiling XTiling Y は個別にパラメータ化されているため、テクスチャの幅と高さを個別に制御できるようになります。

Append の順序

AppendVector 表現式では、データをそれがこのノードにアタッチされた順序で組み合わせます。入力 B のデータは、常に入力 A のデータの最後に追加されます。次の 2 つの画像を参照してください。

  • 最初のスライドでは、追加の結果は (0.05, 0.2, 0.8) で、ノードのプレビューに表示されているように水色になります。

  • 2 番目のスライドでは、追加の結果は (0.8, 0.05, 0.2) で、ノードのプレビューに表示されているように水色になります。

AppendMany

AppendMany は AppendVector 表現式と同様に機能する マテリアル関数 ですが、最大 4 つの個別の浮動小数/スカラー値を 1 つのマルチチャンネル ベクターに組み合わせることができます。

AppendMany Material Function

AppendMany 関数のメリットとして、3 つの異なる出力ピンが備わっている点があります。これにより、状況に応じて、追加されたすべてのチャンネルまたはその一部にアクセスできるようになります。

AppendMany ノードの入力で受け取れるのは浮動小数/スカラー値のみです。float2、float3、または float4 を AppendMany ノードに渡すと、最初の値以外はすべて破棄されます。

Component Mask

Component Mask マテリアル表現式は、先述の各 Append ノードとは逆の目的で使用されます。ComponentMask では、データを組み合わせるのではなく、データをそのコンポーネント各部または複数のチャンネルに分離します。

Component Mask は「ゲート」のように機能します。Component Mask の入力につながっているデータに対しては、その出力をパススルーできるチャンネルを指定できます。次の画像には、(0, 1, 0.7, 0.5) の値を含む Constant 4Vector が示されています。グラフ内でこの Mask ノードを選択すると、[Details (詳細)] パネルには 4 つのチェックボックスが表示されます。

Component Mask Details Panel

これらのチェックボックスは、ノードが出力するチャンネルを指定するものです。現在はどれもオンになっていないため、Mask ノードでは何の情報も出力しません。この Mask ノードを別のノードの入力に接続すると、そのノードにはエラーが表示されます。

Component Mask Details Panel

これらのチェックボックスを使用することで、情報をフィルタリングして必要なチャンネルだけを使用できます。

例えば、A チャンネル の値を使ってマテリアルのオパシティを制御したいとします。チェックボックスをオンにして A チャンネルを有効にし、Mask の出力ピンを Opacity Input (オパシティ入力) に接続します。

Component Mask example

R、G、B の各チェックボックスがオフになっているため、ComponentMask ではこれらのチャンネルが破棄されて、A チャンネルの値 (この場合は 0.5) のみが出力されます。

マテリアル グラフの演算

マテリアル グラフ内での 2 つ目の主なデータ操作方法は、数学演算を使った方法です。マテリアル エディタでは、一般的なすべての算術演算を使用することができます。

Arithmetic Material expressions

4 つの数学的マテリアル表現式。詳細については、「Math マテリアル表現式」ページを参照してください。

これらの数学的ノードの基本的用途はその名前が表しています。例えば、定数値 0.30.2Add ノードに接続すると、Add ノードでは 0.3 + 0.2 の計算を行い、0.5 の値を出力します。2 つの定数値を使った演算はシンプルでストレートなものです。

Simple addition operation

しかし、データ タイプのページで説明したように、情報は常に個別の浮動小数値としてマテリアル グラフ内を移動するわけではありません。そのため、マテリアル内のさまざまなデータ タイプの間で演算を実行する際の規則とプロセスを十分に理解することが重要になります。主な懸念事項は次の 2 つです。

  1. 算術演算において、すべてのデータ タイプが互いに互換性があるわけではない。

  2. 関連するデータ タイプに応じて算術演算の動作が異なる。

互換性のあるデータ タイプと互換性のないデータ タイプ

先述の例では、2 つの浮動小数定数を使ったシンプルな加算演算、0.3 + 0.2 = 0.5 を行いました。この演算が機能するのは、両方の値が同じタイプのデータであるためです。異なるタイプのデータが入力の一つに渡された場合はどうなるのでしょうか?データ タイプ間の互換性は、次の 3 つのポイントでまとめることができます。

  • 同等のデータ タイプ 間の演算は常に有効である。例えば、float2 + float2 は新しい float2 の値を返します。

  • 浮動小数 (float) とそれより大きい浮動小数の間の演算は有効である。例えば、float + float3 は新しい float3 の値を返します。

  • 同等ではない 2 つのデータ タイプ間の演算は無効である。例えば、float2 + float3 は無効で、エラーが返されます。

言い換えると、2 つの異なるデータ タイプ間の演算は可能ですが、一方のデータ タイプが浮動小数 (float) である場合に限られます。次のグラフで示されている 0.3 + (1,2) は有効です。浮動小数値が float2 の両方の値に加算されて、(1.3, 2.3) の値を含む新しい float2 が返されます。

Float1 plus float2

しかし、同等でない float2、float3、または float4 データ間の演算ではエラーが返されます。

Float3 plus float2 error

次の表は、マテリアル グラフでの演算におけるデータ タイプの互換性をまとめたものです。

データ タイプ

演算におけるデータ タイプの互換性

Float

すべてと互換性あり

Float2

Float と Float2 のみ

Float3

Float と Float3 のみ

Float4

Float と Float4 のみ

データ タイプ間の演算規則

異なるデータ タイプ間で算術計算がどのように行われるのかを理解することも重要です。このセクションでは、次の 2 つのシナリオを通じて、一方または両方のデータ タイプが浮動小数 (float) よりも大きい場合の演算の動作を説明します。

同等のデータ タイプ間の演算

同等のデータ タイプ間の演算 (例:float2 + float2) の場合は、入力 A のそれぞれの値が、入力 B の対応する値と計算されます。次の画像は、2 つの Constant 2Vector 表現式間の加算を表しています。

Addition between two Float2 variables

画像で示されているとおり、2 つの加算演算が行われます。それぞれのノードの最初の値が加算されて (1 + 2) となり、次に各ノードの 2 つ目の値が加算されて (3 + 3) となり、結果として新しい float2 (2, 6) となります。

次の表では、4 つのデータ タイプの演算例がそれぞれ示されています。

入力 A、入力 B

入力データ

数学的表記

結果データ

Float, Float

(4) / (2)

4 / 2 = 2

8

Float2, Float2

(1, 3) + (2, 3)

(1 + 2), (3 + 3)

(3, 6)

Float3, Float3

(3, 2, 0.5) * (2, 1, 2)

(3 x 2), (2 x 1), (0.5 x 2)

(6, 2, 1)

Float4, Float4

(2, 2, 2, 3) - (1, 1, 2, 2,)

(2 - 1), (2 - 1), (2 - 2), (3 - 2)

(1, 1, 0, 1)

浮動小数とベクター間の演算

浮動小数とそれよりも大きいデータ タイプ間の演算の場合は、浮動小数の値が個別の計算でそれぞれ繰り返し使用されます。次の画像は、1 つの 定数 と 1 つの Constant 3Vector との乗算を示しています。

Multiplication between a Float and a Float3

上の画像で示されているとおり、定数の値は Constant 3Vector のそれぞれの値で乗算されます。つまり、(2 x 3)、(2 x 1)(2 x 2) という 3 つの個別の乗算が行われて、その積は float3 (6, 2, 4) となります。

この浮動小数が入力 A であるか入力 B であるかは、乗算と加算においては関係ありませんが、当然ながら除算と減算においては重要になります。

Subtraction operation

上の画像では、Constant 3Vector (6, 4, 3) のそれぞれの値から Constant (2) の値が減算されています。数学的に表記すると (6 - 2)、(4 - 2)、(3 - 2) となり、結果の float3 は (4, 2, 1) となります。

入力の順序を逆にすると、結果は異なるものになります。

Subtraction with inputs reversed

減算ノード内でこの浮動小数が上に配置されたため、それぞれの算術演算が (2 - 6)、(2 - 4)、(2 - 3) と逆になり、結果の float3 は (-4, -2, -1) となります。

まとめ

このページで紹介した概念と技術は、マテリアルを作成するために使用するマテリアル グラフ ロジックのほとんどにおける主要なコンポーネントです。マテリアル エディタでの演算とデータ操作について理解を深める上で、次の関連ページが役立ちます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル