Skip to content

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
こちらを参考にしました。