メインコンテンツまでスキップ

UsdPreviewSurfaceでマテリアルを設定する

Houdini での UsdPreviewSurface を使用したマテリアルの指定方法について まとめてみます。

まずは、MaterialNet を作成。

そして、UsdPreviewSurface を作ります。

まずはわかりやすい色をつけておきます。

Stage に戻って、MaterialLibrary を作り、

Material VOP で

先ほど作成した PreviewSurface を選び、MaterialPath を適当な名前にします。

あとは MaterialPathPrefix を Looks としておきます。

結果。 Looks 下に Material が作られました。 ここの Scope は何でも良いですが、今回は Maya の Export ツール準拠で Looks にしました。

あとはアサインするには、 Assign to Geomtery にチェックを入れて アサインしたいノードを選択すれば OK です。

基本構造

USD の場合のマテリアル関係の基本構造は、ざっくりこうなっています。 ジオメトリに対してアサインするのは MaterialPrim。 これは Maya でいうところの ShadingEngine に近い感じです。 シェーダー本体は、 ShaderPrim でこれが MaterialPrim と接続されています。

USD のシェーダー関連の特徴として、シェーダー関連の Prim は Shader でひとくくりに されていて、その区別は ID によって行われます。 どういうことかというと、

ShaderPrim のアトリビュートを見ると、 id という項目があって そこに「UsdPreviewSurface」が指定されています。 なので、同じ ShaderPrim であっても役割が異なることがあります。

デフォルトで用意されているのが

  • Preview Surface
  • Texture Reader
  • Primvar Reader
  • Transform2d

の4つです。 (PrimvarReader はこれ1つでも複数の役割を持つ)

それを踏まえて、テクスチャのアサイン方法で UsdPreviewSurface 以外をみてみます。

テクスチャを使用する

さきほどの PreviewSurface に UVTexture と PrimVarReader を作成します。

PrimVarReader は、Signature を Float2、VarName を st にします。

こんなかんじです。

シーングラフはこちら。

テクスチャは こちらを使用しました。

ここで使用するのが Texture Reader と Primvar Reader です。 シーングラフを見て分かる通り、すべて Shader ですが、それぞれが id によって役割が 指定されています。

例えばテクスチャは、id は「UsdUVTexture」になっています。

Primvar Reader とは

UVTexture に関しては、TextureColor を Shader に対して接続しているのでなんとなく わかりますが、もう1つの PrimVarReader とはなんでしょうか。

まず PrimVar がなにかというと

Renderman に由来するもので、「Primitive Variable(プリミティブ変数)」の略 レンダラーとプリミティブを関連付ける特別なアトリビュートで プリミティブの表面/体積に渡ってアトリビュートの値を補間することができるもの (公式 Glossary より引用)

です。 つまり、テクスチャのマッピングに使用する UV であったり頂点カラーであったり ジオメトリ上で定義された各種値を供給する機能を持つのが Primvar Reader です。

UV の座標を取得するための PrimvarReader をみてみると 「varname」を「st」としています。 USD の記述側で、MeshPrim ではどういうアトリビュートになっているかというと

Mesh には「 primvars:st というアトリビュートがあり、そこには Mesh の UV 座標が 記述されています。

Primvar Reader とは、このジオメトリ側の Primvers の値を Shader 側で使えるようにしているというのがわかりました。

作成したテクスチャつきの USD は当然のように usdview などでも確認ができます。

まとめ

primvarReader と USD 側に定義された primvars:st ~といった記述が どういう関係性になっているのかが理解できていませんでしたが 一通り組み立てたおかげでようやく理解できたきがします。

USDPreviewSurface まわりの詳細の仕様は https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html こちらを参考にしました。