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