確認環境 :
OS : Windows 11
MaterialX 1.39.1
kit-app-template : Omniverse USD Composer (Kit 106.5)
今回はMaterialXでのifによる分岐について書いていきます。
今まで通りMaterialX Graph Editorを使用します。
MaterialX Graph Editorのノードリストで検索すると以下のようなノードがありました。
- ifgreater_xxx
- ifgreatereq_xxx
- ifequal_xxx
xxxはintegerやfloat、color3、vector3などの型です。
ifgreater
ifgreater_integerの場合。
value1, value2 … float
in1, in2, out … int
Python的に書くと以下のようになります。
if value1 > value2:
out = in1
else:
out = in2
ifはどの型であっても2つのfloatで比較しています。
簡単な例として、ifgreater_integerノードの結果をin1 = 0.0, in2 = 1.0としました。
この結果のoutをconvert_integer_color3に渡して、
黒(RGB(0,0,0))または白(RGB(1,1,1))として表現しました。
value1 > value2の場合はこのShaderの結果は黒色になります。
value1 <= value2の場合はこのShaderの結果は白色になります。
ifgreatereq
ifgreater_integereqの場合。
value1, value2 … float
in1, in2, out … int
Python的に書くと以下のようになります。
if value1 >= value2:
out = in1
else:
out = in2
ifequal
ifgreater_equalの場合。
value1, value2 … float
in1, in2, out … int
Python的に書くと以下のようになります。
if value1 == value2:
out = in1
else:
out = in2
ifを使用した例
それでは視覚的に分かりやすい例としてifを使ってみます。
positionノードを使用し、X方向の位置により白と黒の縞模様を与えます。
position_vector3ノードをXYZ要素ごとに分解するためにseparate3_vector3ノードにつなげました。
positionノードのspaceは"object"としました(オブジェクト座標の位置を扱う)。
MaterialX Graph Editorのデフォルトのジオメトリは位置は-1.0~+1.0の範囲になっているようなので、
positionのX値を3倍にするためにmultiply_floatノードにつなぎます。
この値の余りを計算するためにmodulo_floatノードをつなぎました。
1.0で割ったときの余りを計算します。
これで0.0~1.0、0.0~1.0、0.0~1.0、、、と繰り返されることになります。
ifgreater_integerノードのvalue1につなぎ、value2を0.5、in1を0、in2を1としました。
outをconvert_integer_color3ノードにつなぎsurfaceshaderに渡しました。
これで、0.0~1.0の間で0.5を境にして白、黒になります。
switch
2024/12/25 追記。
ifに近いノードとしてswitchがあります。
これはinのfloat値の整数を元にして、0、1、2、3、、の値ごとに結果を分けるノードです。
これはOmniverse USD Composer(Kit 106.5)では動作しませんでした。
簡単な説明になりましたが、今回はここまでです。