スペシャライズドについて
コンポジションの中でもかなり特殊すぎて、詳しく構造を調べていなかった 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(特殊化)の挙動についてのまとめになります。 思っていたよりもかなり特殊な処理なので、ぱっと使い所が思いつかないですが
以前 Houdini での USD セットアップの継承で説明したように Reference よりも強いオピニオンであることを利用して、 大量のリファレンスしたアセットをまとめて編集する...というのが Inherits(継承)であるのに対して サンプルのように、リファレンス先のマテリアルの一部バリエーション違いを作る...といった使い方をすれば良いのかな?と思います。
これにて全 6 種類のコンポジションの動作説明は終了です。 あとは、このコンポジションの解決順序・挙動を踏まえて、シーンをどのように構築するか 考えることになります。