マテリアルのデータ タイプ のページでは、マテリアル エディタ内でデータを表現する 4 つの方法を説明しました。マテリアルを効果的に作成するには、これらのデータ タイプを把握するだけでなく、データの操作やマテリアル グラフ内で情報を伝える方法の制御についても理解する必要があります。
このドキュメントでは次の 2 つの項目について検討します。
- データ タイプの操作:複数の浮動小数値を一つのマルチチャンネル ベクターにまとめる方法と、逆に、より大きなデータ タイプから情報を分離する方法。
- マテリアル グラフでの演算:さまざまなデータ タイプを使ってマテリアルで算術演算を実行するための規則とプロセス。
データ タイプの操作
あるデータ タイプとして作成された情報は、別のタイプに変換することが可能です。たとえば、2 つのスカラー パラメータ (浮動小数値) を 2 チャンネル データを必要とする入力に渡すために、これらを 2 チャンネル ベクター (float2) に組み合わせる、または 追加 することができます。またその逆に、ComponentMask を使って、より大きなベクターから特定のチャンネルのサブセットを取得することができます。
このセクションに記載されているマテリアル表現式は、マテリアル グラフ内での情報の流れを制御するために、データの組み合わせと分離を行う方法を提供するものです。
AppendVector
AppendVector マテリアル表現式では、入力 A にあるデータを 入力 B にあるデータと組み合わせて、マルチチャンネル ベクター (float2、float3、または float4) を出力します。この例では、2 つの定数が一緒に追加されて float2 は (1, 2) となります。
使用例
この Append ノードは、2 つの値をそれぞれから独立した形で個別に修正しながら、マルチチャンネル データを必要とする入力にそれらを渡す必要がある場合に便利です。次のグラフには、マテリアル インスタンスに含まれるテクスチャのタイリング、もしくは UV スケール を制御するフローが示されていますが、均一な制御のみが可能です。
この例の欠点は、UV 座標には 2 つのチャンネルがあるものの、マテリアル グラフに含まれているのは 1 つのパラメータのみである点です。このソリューションでは、テクスチャの幅と高さをそれぞれ個別に制御することはできません。
これを解決するには AppendVector を使用します。各軸のスカラー パラメータをそれぞれ個別に作成し、それらを Append ノードに渡します。Append ノードでは 2 つのパラメータを 1 つの float2 に組み合わせます。この float2 はテクスチャ座標によって乗算されます。
Tiling X と Tiling Y は個別にパラメータ化されているため、テクスチャの幅と高さを個別に制御できるようになります。
追加の順序
AppendVector 表現式では、データをそれがこのノードにアタッチされた順序で組み合わせます。入力 B のデータは、常に入力 A のデータの最後に追加されます。次の 2 つの画像を参照してください。

- 最初のスライドでは、追加の結果は (0.05, 0.2, 0.8) で、ノードのプレビューに表示されているように水色になります。
- 2 番目のスライドでは、追加の結果は (0.8, 0.05, 0.2) で、ノードのプレビューに表示されているように水色になります。
AppendMany
AppendMany は AppendVector 表現式と同様に機能するマテリアル関数 ですが、最大 4 つの個別の浮動小数/スカラー値を 1 つのマルチチャンネル ベクターに組み合わせることができます。
AppendMany 関数のメリットとして、3 つの異なる出力ピンが備わっている点があります。これにより、状況に応じて、追加されたすべてのチャンネルまたはその一部にアクセスできるようになります。
AppendMany ノードの入力で受け取れるのは浮動小数/スカラー値のみです。float2、float3、または float4 を AppendMany ノードに渡すと、最初の値以外はすべて破棄されます。
Component Mask
Component Mask マテリアル表現式は、先述の各 Append ノードとは逆の目的で使用されます。ComponentMask では、データを組み合わせるのではなく、データをそのコンポーネント各部または複数のチャンネルに分離します。
Component Mask は「ゲート」のように機能します。Component Mask の入力につながっているデータに対しては、その出力をパススルーできるチャンネルを指定できます。次の画像には、(0, 1, 0.7, 0.5) の値を含む Constant4Vector が示されています。グラフ内でこの Mask ノードを選択すると、[Details (詳細)] パネルには 4 つのチェックボックスが表示されます。
これらのチェックボックスは、ノードが出力するチャンネルを指定するものです。現在はどれもオンになっていないため、Mask ノードでは何の情報も出力しません。この Mask ノードを別のノードの入力に接続すると、そのノードにはエラーが表示されます。
これらのチェックボックスを使用することで、情報をフィルタリングして必要なチャンネルだけを使用できます。
たとえば、A チャンネル の値を使ってマテリアルのオパシティを制御したいとします。チェックボックスをオンにして A チャンネルを有効にし、Mask の出力ピンを Opacity Input (オパシティ入力) に接続します。
R、G、B の各チェックボックスがオフになっているため、ComponentMask ではこれらのチャンネルが破棄されて、A チャンネルの値 (この場合は 0.5) のみが出力されます。
マテリアル グラフの演算
マテリアル グラフ内での 2 つ目の主なデータ操作方法は、数学演算を使った方法です。マテリアル エディタでは、一般的なすべての算術演算を使用することができます。
4 つの数学的マテリアル表現式。詳細については、「Math マテリアル表現式」ページを参照してください。
これらの数学的ノードの基本的用途はその名前が表しています。たとえば、定数値 0.3 と 0.2 を Add ノードに接続すると、Add ノードでは 0.3 + 0.2 の計算を行い、0.5 の値を出力します。2 つの定数値を使った演算はシンプルでストレートなものです。
しかし、データ タイプのページで説明したように、情報は常に個別の浮動小数値としてマテリアル グラフ内を移動するわけではありません。そのため、マテリアル内のさまざまなデータ タイプの間で演算を実行する際の規則とプロセスを十分に理解することが重要になります。主な懸念事項は次の 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 が返されます。
しかし、同等でない float2、float3、または float4 データ間の演算ではエラーが返されます。
次の表は、マテリアル グラフでの演算におけるデータ タイプの互換性をまとめたものです。
| データ タイプ | 演算におけるデータ タイプの互換性 |
|---|---|
| Float | すべてと互換性あり |
| Float2 | Float と Float2 のみ |
| Float3 | Float と Float3 のみ |
| Float4 | Float と Float4 のみ |
データ タイプ間の演算規則
異なるデータ タイプ間で算術計算がどのように行われるのかを理解することも重要です。このセクションでは、次の 2 つのシナリオを通じて、一方または両方のデータ タイプが浮動小数 (float) よりも大きい場合の演算の動作を説明します。
同等のデータ タイプ間の演算
同等のデータ タイプ間の演算 (例:float2 + float2) の場合は、入力 A のそれぞれの値が、入力 B の対応する値と計算されます。次の画像は、2 つの Constant2Vector 表現式間の加算を表しています。
画像で示されているとおり、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 つの Constant3Vector との乗算を示しています。
上の画像で示されているとおり、定数の値は Constant3Vector のそれぞれの値で乗算されます。3 つの異なる乗算式、(2 3)、(2 1)、(2 *2) があります。その積は float3 が (6, 2, 4) となります。
この浮動小数が入力 A であるか入力 B であるかは、乗算と加算においては関係ありませんが、当然ながら除算と減算においては重要になります。
上の画像では、Constant3Vector (6, 4, 3) のそれぞれの値から Constant (2) の値が減算されています。数式で表すと、(6 - 2)、(4 - 2)、(3 - 2) となります。結果の float3 は (4, 2, 1) です。
入力の順序を逆にすると、結果は異なるものになります。
減算ノード内でこの浮動小数が上に配置されたため、それぞれの算術演算が (2 - 6)、(2 - 4)、(2 - 3) となります。結果の float3 は (-4, -2, -1) です。
まとめ
このページの概念とテクニックは、マテリアルを作成するために使用するマテリアル グラフ ロジックのほとんどにおいて、主要なコンポーネントとなるものです。マテリアル エディタでの演算とデータ操作について理解を深める上で、次の関連ページが役立ちます。