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