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