スペシャライズドについて
コンポジションの中でもかなり特殊すぎて、詳しく構造を調べていなかった Specialize を紹介しようと思います。
コンポジションの強さ(LIVRPS)では最も弱いのが Specialize です。 その挙動は継承(Inherits)とよく似ていますが 重要な違いとして Specialize/Inherits と Reference 比べてオピニオンが 強いか弱いか...という違いがあります。 文字だけだとわかりにくいので、 https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Specializes USD Glossary の Specialize にかかれているサンプルを使用して 図で説明してみようと思います。
Specialize
Robot.usd と RobotScene.usd の2つのレイヤー内のコンポジションは このようになっています。
まず、サンプルを usdview で表示するとこのようになります。
# specialize roughness...
float inputs:specularRoughness = 0.2
Robot.usd の CorrdedMetal の specularRoughness に、 0.2 とある通り 最終的な結果を見ても 0.2 になっています。
Specialize は Reference よりも弱いオピニオンなので、 Composition を確認すると、Robot.usd でまず Specialize で合成され その合成されたあとに Reference されていることがわかります。
コンポジションの順番を追記すると、このようになります。
ここで注目なのが、Robot.usd の CorrodedMetal.specularRoughness です。
diffuseGain は、Specialize のおかげで Metal.diffuseGain の値が合成されていますが specularRoughness は、CorrodedMetal にオピニオンがあるため、その値が優先され 0.2 になります。
Inherits との比較
比較のために Inherits に変更するとどうなるか確認してみます。
Inherits の場合は、最終的な合成結果が変わっているのがわかると思います。
Composition を比較してみると、一目瞭然で Reference を基準にしてみると Inherits は Reference より強く Specialize は Reference より弱いことがわかります。
Inherits の場合は、まず先に Reference が合成されます。 Robot が Rosie にリファレンスされ、その Local の 0.1 が Metal に合成されます。 Inherits はその Prim を合成するので、 Metal と CorrodedMetal の値が同じになります。
つまり、Specialize とは Inherits と基本同じだが、コンポジションの解決順序が異なるため 大量の Reference を Inherits でまとめて編集できる Inherits に対して、 Reference よりも弱いことから、 結果、「Reference の空間内で Inherits する」挙動になるということがわかりました。
最初に説明した通り「Reference より弱いか・強いか」というのが大きな差になることから、 RobotScene.usd にリファレンスする前の Robot.usd では、 Inherits であっても Specialize であってもその結果は変わりません。
まとめ
以上が Specialize(特殊化)の挙動についてのまとめになります。 思っていたよりもかなり特殊な処理なので、ぱっと使い所が思いつかないですが {{markdown_link('13_create_usdAssets_01')}}
以前 Houdini での USD セットアップの継承で説明したように Reference よりも強いオピニオンであることを利用して、 大量のリファレンスしたアセットをまとめて編集する...というのが Inherits(継承)であるのに対して サンプルのように、リファレンス先のマテリアルの一部バリエーション違いを作る...といった使い方をすれば良いのかな?と思います。
これにて全 6 種類のコンポジションの動作説明は終了です。 あとは、このコンポジションの解決順序・挙動を踏まえて、シーンをどのように構築するか 考えることになります。