[MaterialX] OpenPBR : Procedual2d, Procedual3d

  • by

確認環境 : MaterialX 1.39.1

Noiseを使用してテクスチャを汚すような効果を与えます。
Procedual2d, Procedual3dにはノイズ系の関数が複数存在します。

Procedual2dはテクスチャ上の2D空間でのノイズなどの「プロシージャル」な表現を行います。
テクスチャファイルを使用したテクスチャ画像は解像度による縛りが発生します。
これを解決するには画像の解像度を上げていくしかありません。
「プロシージャルテクスチャ」は計算で模様を与えるため、めいっぱい拡大したとしてもドットが見えてしまうという現象を抑えることができます。
Shaderの場合はテクスチャとプロシージャルを組み合わせてタイリングの繰り返しを分かりにくくする、などの表現も可能です。

Noise2d

まずはProcedual2d, Procedual3dの違いについて。
procedual2d – noise2d – noise2d_floatを選択します。
このnoise2d_floatはtexcoord(2Dテクスチャ上の位置)といくつかのパラメータを入力し、float値を出力します。

そのため、メッシュに対してUVが割り当てられている必要があります。
以下のようにノイズ模様が表現できます。これは、float値をcolor3に変換してbaseColorに色を割り当てました。

入力のtexcoordはnoise2dのノイズ模様のサイズを調整するため、スケール指定用のfloat値を乗算しています。

texcoord_vector2がテクスチャ上の位置になります。
constant_floatにスケール値を入れてconvert_float_vector2に変換しています。
texcoord_vector2とconvert_float_vector2をmultiply_vector2で乗算しています。

Noise3d

procedual3d – noise3d – noise3d_floatを選択します。
このnoise3d_floatはpositionといくつかのパラメータを入力し、float値を出力します。
positonは3D空間上の位置です。

以下のようにノイズ模様が表現できます。
特徴として、ジオメトリを削って中身を見ると模様が連続しているのを確認できます。
中身が詰まっているような「ソリッド」な状態の表現になります。そのため、プロシージャル3Dはソリッドテクスチャと呼ばれることもあります。

また、この場合はメッシュにUV値は必要ありません。

入力のpositionはnoise3dのノイズ模様のサイズを調整するため、スケール指定用のfloat値を乗算しています。

position_vector3がテクスチャ上の位置になります。
constant_floatにスケール値を入れてconvert_float_vector3に変換しています。
position_vector3とconvert_float_vector3をmultiply_vector3で乗算しています。

Positionについて

noise3dで使用しているposition(position_vector3)は2つのパターンを指定できます。

space 説明
object オブジェクト座標での位置(デフォルト)
world ワールド座標での位置

spaceがobjectの場合は形状を複製したり移動させたりしても、ノイズの模様は変化しません。オブジェクトに移動にもついてきます。
下の画像では、2つの形状が同じ模様の付き方をしているのを確認できます。
spaceがworldの場合は形状を複製したり移動させるとワールド座標の位置を使って模様が反映されます。

positionのspaceにworldを指定したMaterialXファイルを保存し、Omniverseに持って行って移動させてみました。
ノイズはワールド座標上の位置を反映しているのを確認できます。

今回はここまでです。
次回はノイズの模様の種類について書く予定です。