On this page |
概要 ¶
この章では、KarmaとUSDにおけるマテリアルの概念について、さらには、すぐにでも使えるようになるためのヒントをご紹介します。
Karmaのマテリアル構築は考え方としては簡単で、これまでHoudiniからMantraまたはその他のレンダラーを使ってレンダリングしたことがあるなら特にそうです。 マテリアルを作成するには、Material Library LOP内でVOPネットワークを接続します。 Houdiniは、VOPノードをUSD Material Primに変換し、それらをジオメトリに割り当てます。 レンダリング時に、HydraはそれらのプリミティブとマテリアルをKarmaに送信します。
Material Library LOPの中に入ると、マテリアルビルダー系のノードとツールが利用可能になります。 これによって、VOPネットワークがUSDデータをもっと正確にミラーリングできるようになります。 また、Tabメニューに、ほとんど互換性のない膨大な数のオプションが表示されないようにすることが容易になります。
クィックスタート ¶
-
Material Library LOPを作成します。
-
そのノードの中に入って、 Karma Material Builder を作成します。
-
そのサブネットノードの名前を“quickstart_material”に変更します。
-
親のLOPネットワーク(つまり、
/stage
)に戻ります。 -
Assign Materialを先ほど作成したMaterial Libraryノードに接続します。
-
Assign Materialノードで Primitives をいくつか選択し、 Material Path を
/materials/quickstart_material
に設定して、マテリアルを割り当てます。
MaterialXサポート ¶
詳細に入る前に、KarmaのMaterialXサポートとそれがアーティストのマテリアル構築にどのような影響があるのか説明しておく価値があります。 KarmaはMaterialXシェーダをサポートしていますが、MaterialXのコード生成には依存していません。 代わりに、KarmaはUSD内に記述されているMaterialXノードのシェーダネットワークを読み込んで、その場でレンダラー用のマテリアルを構築しています。 このおかげで、Karmaは、Karma用ノードまたはUSD Previewノードを使用して、MaterialXで不足している機能を補うことができています。
たいていの場合、アーティストは、Karmaを使ってレンダリングする時は Karma Material Builder から始めるべきです。 独自のKarma用ノードも慣例もない“純粋な”MaterialXネットワークを構築できるように、“USD MaterialX Builder”は、その純粋な仕様の範囲内に対応しているMaterialXノードのみを提供します。
USDマテリアル ¶
USDのマテリアルは異なるレンダラーをターゲットにすることができます。 プリミティブが持つことができるマテリアルバインドは1つだけですが、その1つのマテリアルが様々なレンダーコンテキストに対応することができます。 そのレンダリングコンテキストは、異なるレンダラーのシェーダだったりシェーディング言語に該当します。
Karmaはいくつかのレンダーコンテキストに対応しています。 マテリアルがそれらの対応しているコンテキストを複数持っている場合、Karmaは次の優先順位を使用します:
優先順位 |
レンダーコンテキスト |
ビルダー |
サンプルのノード |
---|---|---|---|
1 |
|
VEX Material Builder |
|
2 |
|
Karma Material Builder |
|
3 |
|
USD MaterialX Builder |
|
4 |
|
USD Preview |
Note
Karma XPUとKarma CPUは、MtlX/Karma/Previewノードの混在に対応していますが、これは通常だと他のレンダーエンジンでは対応していません。
マテリアルバインド ¶
Solarisでマテリアルをプリミティブに割り当てるのは簡単です。 Material LibraryまたはAssign Materialノードを使用して、マテリアルをPrimまたはGeomSubsetにバインドすることができます。
デフォルトでは、 Material Binding Strength は Weaker Than Descendants です。 これは、子Prim自体にマテリアルバインドがない限り、すべての子Primにバインドが適用されることを意味します。 マテリアルを親Primに割り当て、Strengthを Stronger than Descendants に設定すると、シーン全体のマテリアルを上書きすることができます。
Warning
Hydraは、期待した通りにインスタンス上の“弱い”マテリアルを上書きしてくれません。 この挙動は、今後のバージョンのUSDおよびSolarisで改善される予定です。 それまでの間は、継承されたクラスPrimを使用してマテリアルの上書き範囲を広げることで、インスタンスのマテリアルを置換してください。
USDにおけるマテリアルバインドは特定のPurposeのみに適用できます(USD Render Purposeは、プレビュー、マップ生成、最終レンダリングなど、様々なタイプのレンダリングを指します)。 デフォルトでは、マテリアルはどのPurposeにも適用されますが、例えばマテリアルを最終レンダリングだけにバインドするよう設定することも可能です。
USDはCollectionベースのマテリアルバインドに対応していますが、現時点では、その方法を強くお勧めするほどのワークフロー/パフォーマンスのメリットはありません(USD Collectionをパターンとして定義でき、および/またはHydraがCollectionベースの割り当てを介したインスタンスの上書きに対応している場合、これは非常に強力なワークフローとなります)。
シェーダ構築 ¶
-
Karma向けのシェーダ構築は、HoudiniのMantraや他のレンダラーの場合とほとんど同じで、VOPを使用します。
-
Material Libraryは、マテリアルから自動的にUSD Preview Surfaceの生成を試みます。これは、Principled ShaderおよびMtlX Standard Surfaceで最も上手く機能します。場合によっては、USD Previewマテリアルの自動生成を避けた方が望ましいです。Material Libraryノードのトグルを使用することで、そのプレビュー生成を無効にすることができます。
-
テクスチャが原因で、GLビューア、特にStorm(PixarのOpenGL Hydraデリゲート)が低速になる場合があります。スケーラビリティが心配な場合は、中景から後景までのオブジェクトに対してテクスチャを使用するのではなく、USD Previewシェーダの
displayColors
とdisplayOpacity
を使用して色を付けると良いでしょう。 -
マテリアルの構築時にCollect VOPを最終ノードとして使用すると、ディスプレイスメントシェーダが追加しやすくなり、さらには、手動でUSD Preview Surfaceやその他のシェーダもマテリアルに追加しやすくなります。
-
Parameter VOPを使用することで、“パブリックな(外部からアクセス可能な)”マテリアルインターフェースを作成することができます。これにより、下流のLOPでマテリアルを編集しやすくなるうえ、大元のシェーダグラフを編集する必要がなくなります。(テクスチャマップのパスなど)同じパラメータで異なるシェーダを駆動することも可能です。
MaterialX ¶
-
UsdMaterialXに対応しているどのような環境でも動作するように純粋なMaterialXシェーダのみでシェーダネットワークを構築したい場合は、 USD MaterialX Builder から始めてください。
-
Karma Material Builder は、MaterialXをベースとしたKarmaマテリアルの作成を簡略化します。このサブネット内では、⇥ Tabメニューがフィルタリングされて、互換性のあるKarma、USD Preview、MaterialXノードのみが表示されます。これにより、シェーダネットワーク内で誤ってVEX VOPノードを使用してしまうのを防ぐことができます。
-
MaterialXノードを使用して、Karma Hairまたはその他のKarma固有のシェーダのパターンを駆動させることができます。
-
HoudiniのPrincipled Shaderと異なり、MtlX Standard Surfaceノードはパラメータをジオメトリアトリビュートに自動バインドしません。
-
このアイコンや
hmtlx
接頭辞で始まるMaterialXシェーダは、純粋なMaterialXノードを使用して実装されていますが、MaterialX標準配布の一部ではなりません。
USD Previewシェーダ ¶
-
USD PrimVar Readerは、KarmaではMaterialXノードと互換性があります。
-
UsdMaterialXに対応したレンダーデリゲートが増えるまでは、USD Previewシェーダがマテリアルを定義するのに最も一般的で汎用的な方法となります。
-
厳格にUSD Preview専用マテリアルを構築する場合は、 USD Preview Material Builder を使用してください。
VEX ¶
-
VEXシェーダは、Karma CPUで のみ 機能します(Karma XPUでは機能しません)。
-
直接
Cd
にバインドするのでなく、Surface Colorノードをシェーダで使用してください。Cd
がジオメトリで見つからない場合、displayColor
Primvarが代替となります。これにより、VEXシェーダはMantraからKarmaに簡単に切り替えることができます。 -
Point Cloud系シェーダや他のジオメトリルックアップ系シェーダは、Karma CPUでも機能するはずですが、ステージ上のプリミティブにアクセスすることはできません。これらのシェーダはディスク上の
.bgeo
ジオメトリファイルにのみアクセスすることができます。
Warning
Karma XPUはPrincipled Shaderに 対応していません 。 しかし、Material Library LOPの自動プレビューシェーダ機能が原因で、Karma XPUがPrincipled Shaderに対応しているように思えてしまうことでしょう。 統計情報やログ情報を調べればこれらの状況は明確になり、誤った問題のデバッグに時間を費やしてしまうのを回避することができます。
テクスチャ ¶
Karma CPUは、UVおよびPtexテクスチャマップに対応しています。 その一方、Karma XPUはまだPtexテクスチャマップに対応していません。 マテリアルのファミリー別に、マップを読み込むための独自のシェーダがあります。
シェーディングファミリー |
画像入力ノード |
---|---|
MaterialX |
|
Karma |
|
USD Preview |
|
VEX |
UDIM ¶
Karma CPUとKarma XPUはどちらもUDIMテクスチャに対応しています。 また、アーティスト側でUDIMを調整できるように設計されたユーティリティノードがSolarisに用意されており、 Primvarを使用してテクスチャバリエーションを駆動させることができます。 これらのノードは、MtlXノードグラフとして実装されているので、理論的には、レンダリング時にUDIMタイルを変更することが許容されているどのUsdMaterialXレンダラーでも動作するはずです。
シェーディングファミリー |
画像入力ノード |
---|---|
MaterialX |
Note
現在のところ、UDIMはMtlX Tiled Imageでは動作しません。そのノードの実装方法が原因です。
フォーマット ¶
Karmaではmipmapされた.exr
または.rat
テクスチャファイルを使用します。
Karmaは他のフォーマットも使用可能ですが、.exr
や.rat
を使用する場合と比べて、(特にプロダクション規模で)効率性が悪かったり、予測可能なものではありません。
mipmapを使用すれば、タイル化されたテクスチャによってパフォーマンスが良くなります(特にTime to First Pixel:いざピクセルのレンダリングを開始するまでの時間)。
Karmaは、Houdiniが対応しているすべての画像フォーマットだけでなく、OpenImageIOを介して対応している多くの画像フォーマットに対応しています。 テクスチャフォーマットは、パフォーマンスとカラー空間の想定に影響を与えます。詳細については、カラー空間を参照してください。
imaketxコマンドラインユーティリティを使用すると、他の画像フォーマットからmipmapされた.exr
および.rat
ファイルを生成することができます。
Note
imaketx
は.exr
画像に対して1枚のAOVのみをmipmapするのに対して、.rat
はすべてのチャンネルのmipmapに対応しています。
自動変換 ¶
Houdini20.0以降、デフォルトでは、Karmaはmipmap/タイル化されていないテクスチャを自動変換するようになりました。
HOUDINI_TEXTURE_DISK_CACHE
環境変数を設定なし、または、native
に設定することで、この挙動を無効にすることができます。
今でもHoudini19.5を使用している場合、そのHOUDINI_TEXTURE_DISK_CACHE
環境変数をall
に設定することで、この機能を有効にすることができます。
logging
パネルを追加してKarmaのログを調べれば、テクスチャが変換されているかどうか判断することができます。
または、コマンドラインからレンダリングする場合だと、verbosityを3以上に設定します。
[09:02:04] Texture Disk Cache: Converting image /jobs/gramophone.usdz[Gramophone_Normal.png] to texture /tmp/houdini_temp/hfsT7MYFL [09:02:05] Texture Disk Cache: Finished writing output file /tmp/houdini_temp/hfsT7MYFL [09:04:11] Texture Disk Cache: Converting image /jobs/maps/mandril.jpg to texture /jobs/aces/maps/mandril.jpg.rat [09:04:11] Texture Disk Cache: Finished writing output file /jobs/maps/mandril.jpg.rat
カラー空間 ¶
Karmaは、シーンを内部的にリニアカラー空間でレンダリングするため、テクスチャマップをリニア空間に変換する必要があります。 Hydraはパラメータメタデータを渡さないため、Karmaはいくつかの方法でソースのカラー空間を判断します:
-
カラー空間入力が“raw”、または、タイプが
vector
の場合、Karmaは画像カラーを変換しません。 -
Readerノードが“Auto”に設定されている場合、Karmaはソースのカラー空間を検出する処理を実行します。
-
diffuse_map.rec709.exr
など、ファイル名に埋め込まれたロール文字列をチェックします。 -
画像ファイル内のメタデータからカラー空間の仕様をチェックします。
-
8ビット画像ではsRGBを想定し、他のフォーマット/ビット深度ではリニアを想定します。
-
Hydraはパラメータメタデータを渡さないため、color3
またはcolor4
のシグネチャを持つMtlX Imageノードは常に“Auto”モードになります。
MtlX Imageノードで画像を強制的に(変換なしで)リニアで読み込ませるには、パラメータのシグネチャを非カラー値(float
、vector3
、vector4
など)に設定します。
Note
MaterialXノードの文字列入力(例えば、画像読み込みノードのファイルパス)は、オブジェクトのトポロジー全体にわたって一定であることを保証するために uniform 文字列になっています。 Paramater VOPなどの一部のノードは、文字列入力にエラーなしで接続するためにはuniformトグルが必要になります。
Primvars ¶
Primvarとして暗号化されたアトリビュートやプロパティを使用することで、マテリアルのシェーダのパラメータを駆動させることができます。 どのPrimvar補間タイプにも対応しており、サポートされている値タイプは、そのノードのシェーダシグネチャがそれです。 汎用のReader系ノードに加えて、KarmaはMaterialXに同梱されている特定のアトリビュートリーダーにも対応しています。
シェーダファミリー |
Primvar Reader系ノード |
---|---|
MaterialX |
|
USD Preview |
|
VEX |
-
MaterialX系ノードとUSD Preview系ノードは、どちらもKarma CPUとXPUで使用することができます。
-
MaterialXのPrimvar Reader系ノードを使用してボリュームをバインドすることができます。
-
ボリューム系シェーダでPrimvarを読み込む場合、
density
フィールド上の定数補間のPrimvarしか読み込むことができません。他のフィールド上の定数Primvarsは無視されます。
マテリアルプロパティ ¶
Karmaのレンダープロパティの多くは、ジオメトリレベルで上書きすることができます。 簡単にレンダープロパティをマテリアルに関連付けれるようにするためにKarma Material Propertiesノードが用意されており、 これによって、ユーザはマテリアルを介してレンダー設定を適用することができます。 この挙動は、レンダープロパティが入力としてマテリアルのサーフェスシェーダに追加されるというものです。 Karmaは、その入力を読み込んで、まるでGprim自体に設定が適用されているかのようにジオメトリプロパティを適用することができます。 マテリアルを介して適用されたレンダープロパティは、ジオメトリに直接適用されているレンダープロパティよりも弱いです。
透過マテリアル ¶
デフォルトでは、Karmaはグラスや水などの透過マテリアルに対して何かしらの最適化を使用します。
-
デフォルトでは、Fake Caustics(疑似コースティクス)が有効になっています。
-
内部反射も無効になっています。
これは、たいていの場面では綺麗に見え、そして、非常に高速です。 しかし、真のコースティクスと内部反射も有効にすれば、もっと物理的に正しい結果が得られます。
他にも、マテリアルプロパティまたはジオメトリプロパティを使用してNested Dielectrics(入れ子状の絶縁体)をセットアップすることで、入れ子状の透過マテリアルを正しくレンダリングすることができます。
Transmissive Geometry Render Properties
発光マテリアル ¶
非ライトプリミティブを発光させることで、レンダリング時にそれをライトとして機能させることができます。次のシェーダは発光に対応しています:
|
MaterialX |
|
|
USD Preview |
|
|
VEX |
|
発光シェーダの作成はたいてい、最初の一歩にすぎません。 発光ジオメトリのサンプリングは、実際のライトプリミティブのサンプリングほど効率的ではありません。 Karmaには、発光ジオメトリのサンプリングを改善できる特別なレンダープロパティがあります。 これらのプロパティは、マテリアル上、または、ジオメトリオブジェクト上に設定することができます。
Karma Material Propertiesノードは、マテリアル上にレンダープロパティを設定します。 一方、Render Geometry Settingsノードは、特定のジオメトリプリミティブを光源として扱うようにKarmaに指示することができます。 発光ジオメトリのルックと品質を制御する追加パラメータもいくつか利用可能です。
Emissive Geometry Render Properties
AOVs ¶
マテリアル定義のRender Vars(AOVs)は、まだUSDの一部として定義されていません。 それまでの間、Houdini/Karmaには、AOVsをセットアップするためのいくつかのソリューションが用意されています。 このワークフローは、過去のSolarisのリリースと比べて、はるかに合理化されています。
詳細は、Karma AOV 2.0を参照してください。
次のステップ ¶
Karma向けのシェーダとマテリアルの構築の詳細については、SolarisでのMaterialXの使い方を参照してください。