はじめに
KarmaレンダラーでカスタムAOVを書き出す時、そのカスタムAOVには、大きくわけて3つのタイプがあると思います。
- ジオメトリ上のアトリビュート(PrimVar)をAOVに書き出す。
- LPEで指定したライトパスをAOVに書き出す。
- AOV用シェーダグラフをAOVに書き出す。
今回は、このAOV用シェーダグラフを使用したカスタムAOVの書き出しに関する裏技とSlap Compを使用したカスタムAOVの書き出し方法を書きたいと思います。
カスタムAOVシェーダのセットアップ
カスタムAOVシェーダのセットアップに関するヘルプは、
https://www.sidefx.com/ja/docs/houdini/solaris/karma_aovs.html
ここに書いてありますが、説明が足りないよなぁって思います。
まず、Karmaで使用するマテリアルタイプには基本的に以下の3つのタイプのどれかを使用します。

- VEX Material Builder: これはMantraの頃のマテリアルでKarma CPUでも制限付きで使えるマテリアル。
- USD MaterialX Builder: 純粋なMaterialXビルトインマテリアル。これでシェーダを組めば他のMaterialX対応レンダラーにそのままシェーダを渡すことができます。
-
Karma Material Builder: MaterialXノード(名前が
mtlx_*)だけでなく、Karma固有のノード(名前がkma_*)を使用することができる。
カスタムAOVシェーダを組みたいとなると、VEX Material BuilderまたはKarma Material Builderのどちらかを使うことになります。
Houdini21.0の時点ではUSD MaterialX Builderでは基本的にカスタムAOVシェーダは組めないです![]()
MaterialXノードには、Mtlx Dotというノードが用意されており、そのNoteパラメータにaov:AOV名を設定してAOVを書き出すことができますが、このMtlx DotノードはBeautyシェーダグラフの中のPassthroughノードとして使用するものなので、AOVシェーダグラフというよりはLPEのラベルに考え方が近いです。

USD MaterialX BuilderでカスタムAOVシェーダを組む裏技があるので紹介しておきます。
ベースシェーダのどれかのコネクション、例えば、Standard SurfaceのEmission入力にMtlx Switch VOPを接続し、
そのMtlx Switch VOPのWhichパラメータを0に設定し、Input1パラメータにBeautyシェーダグラフで使用する値を設定し、Input2パラメータにMtlx Dot VOPを接続することで可能だったりしますが、AOVタイプが限定されて実質的には使い物にならないです。

VEX Material BuilderによるAOVシェーダのセットアップ方法
VEX Material Builderの中で、Bind Export VOPを追加します。

NameパラメータにAOV名を設定し、AOVに書き出したいシェーダグラフを接続します。この例ではOcclusion VOPをAOVに書き出しています。

このマテリアルをジオメトリに適用した後に、Karma Render Settings LOPでRender Varを追加して、Source TypeをRaw、Source NameをBind Export VOPで設定した名前を指定すればOKです。
つまり、Mantraの頃と同じですね。

Karma Material BuilderによるAOVシェーダのセットアップ方法
Karma Material Builderの中で、Karma AOV VOPを追加します。

AOV NameパラメータにAOV名を設定し、AOVに書き出したいシェーダグラフを接続します。
そして、そのKarma AOV VOPの出力をMaterial_Outputs_and_AOVsノードに接続します。
この例ではMtlX Ambient Occlusion VOPをAOVに書き出しています。
Karma AOV VOPのCreate Render Varパラメータがデフォルトで有効になっているので、
このマテリアルをジオメトリに適用すれば、シーングラフツリーにそのAOVのRenderVarが自動で追加されます。

レンダリングすると、このようにAOVが出力されます。

Karma Render Settings LOPには、下図のように既にビルトインAOVとしてAmbient Occlusion(AOV名はAO)が用意されていますがコントロールが効かない(広がり角度とか距離が指定できない)ので、ここで紹介した方法が役に立つと思います。

この例では、MtlX Ambient Occlusion VOPをAOVシェーダグラフに使用しましたが、このMtlX Ambient Occlusion VOPはHoudini21.0から非表示となりました![]()
Houdini21.0でも使用する場合には、
メインメニューのWindows > Hscript TextportでTextportを開いて以下のコマンドをタイプしてください。
opunhide Vop mtlxambientocclusion
カスタムGlobal AOVシェーダグラフをセットアップする方法
さて、カスタムAOVシェーダグラフの一般的なセットアップ方法の説明が済んだところで、
ここからが本題となります。
上記のKarma Material Builder内でKarma AOV VOPを使用することでカスタムAOVシェーダグラフを組むことができましたが、アンビエントオクルージョンのようにすべてのオブジェクトに対してカスタムAOVシェーダグラフを適用したいケースがよくあります。
各オブジェクトのマテリアルにそれぞれKarma AOV VOPをセットアップするなんて面倒じゃないですか???
Arnoldレンダラーの場合のカスタムGlobal AOVシェーダの組み方
まず、Arnoldレンダラーを例に挙げると、通常のSurfaceマテリアル以外にもAOVマテリアルというのがあって、それをセットアップするだけで、シーン全体に同じAOVシェーダグラフを適用することができます。
Arnoldレンダラーの例:
Arnold Material Builderを作成し、
その中にAOV Outputノードを作成して、そこに書き出したいカスタムAOVの数だけWrite系AOVノードを接続し、各Write系AOVにシェーダグラフを接続します。

このAOVマテリアルを
Arnold Render Settings LOPのShadersタブにあるAOV Shadersに設定すればいいだけです。

Karmaレンダラーの場合のカスタムGlobal AOVシェーダの組み方
では、Arnoldレンダラーと同様に、KarmaでもカスタムGlobal AOVシェーダグラフを組みたいです。
さてどうすればよいでしょうか?
これはEdit Material Network LOPを使用することで可能です。
KarmaでカスタムGlobal AOVシェーダグラフを構築する前提条件として、
シーンに適用されているマテリアルはKarma Material Builderでなければなりません。
下図のように複数のオブジェクトに異なるマテリアルが割り当てられているとします。
そこにEdit Material Network LOPを追加します。

そのEdit Material Network LOPには、シーングラフツリー内のすべてのマテリアルを対象に処理したいので、
Material Pathパラメータに%type:Materialと入力します。
たいていのLOPのパス指定って、ワイルドカードを指定することが多いですが、特に/materials/**みたいな多重階層パターンだけでなく、タイプ別ですべての階層を指定することだってできます。
Solarisを触るならば、必ず
https://www.sidefx.com/ja/docs/houdini/solaris/pattern.html
このプリミティブマッチングパターンのヘルプには目を通すべきですね。

その後は、本来の使い方であればLoadボタンを押して表示されるダイアログからマテリアルを選択して、Material VOPパラメータにマテリアルサブネット名を設定するのですが、そのような使い方はしません。
まだMaterial VOPパラメータに何も設定せずに、Edit Material Network LOPの中に入ります。
そこで、Karma Material Builderを配置します。これがAOVシェーダグラフを定義するサブネットワークとなります。

Karma Material Builderの中に入って、既存のノードは不要なので全部消した状態で(別にあっても問題ないです)、
-
Parameter VOPを追加します。Scopeパラメータを
Subnet Connector、TypeパラメータをSurface(shader)、ExportパラメータをSubnet Outputに設定します。Nameパラメータは任意です。
- さらに2つ目のParameter VOPを追加します。Scopeパラメータを
Subnet Connector、TypeパラメータをColor(color)(AOV出力タイプに合わせてください)、ExportパラメータをSubnet Output、Uniform(not Varying) パラメータをオフに設定します。Nameパラメータは他のParameter VOPのNameパラメータと被らないようにしてください。

Karma AOV VOPを追加します。AOV NameパラメータにAOV名を設定します。

このKarma AOV VOPの出力を2つ目のParameter VOPのinput入力に接続します。 - Karma AOV VOPの
input入力にカスタムAOVシェーダグラフを接続します。
セットアップしたいカスタムGlobal AOVシェーダグラフの数だけ、2.~3.の操作を繰り返します。
下図のようになっていればOKです。

Edit Material Network LOPに戻って、Material VOP(matnode1)パラメータに先ほど作成したKarma Material Builderサブネットの名前を設定します。
これは、Pythonシェルから設定することができます。
Edit Material Network LOPのパスが/stage/editmaterial1、Karma Material Builderサブネットの名前がkarmamaterialだとすれば、
メインメニューのWindows > Python
Shellでシェルを開いて以下のコードを実行してください。
hou.parm('/stage/editmaterial1/matnode1').set("karmamaterial")
すると、Material VOP(matnode1)パラメータにその文字列名が設定されます。

後は、Karma Render Settings LOPでRender Varを追加して、Source TypeをRaw、Source NameをKarma AOV VOPで設定した名前を指定すればOKです。

このようにKarmaでカスタムGlobal AOVシェーダグラフを構築することができました♪


ArnoldだとaiUtilityノードを使用してライトのシャドウを反映したLambertシェーディングをRGB出力することができるのに対して、
Houdini21.0の時点のKarmaでは、ライトのシャドウをRGB出力で書き出すノードが存在しないです。シャドウまわりのカスタムシェーダが書けるといいんですがね。今後のバージョンのHoudiniに期待します。
SlapCompを使用してカスタムAOVを作成する方法
他にもシーン全体に対してカスタムAOVを作成する方法としてはSlap Comp( https://www.sidefx.com/ja/docs/houdini/copernicus/slap_comp.html )があります。
COP NetWorkノードを作成して、その中に入って、
Slap Comp Block COPを配置します。

生成されるSlap Comp Importの入力はデフォルトではCとdepthが用意されています。
今回はDirect Diffuseの輝度からランプを作ってトゥーン調のカスタムAOVを作成してみます。
そのために、Karma Render Settings LOPで、ビルトインのDirect Diffuseを有効にします。

Slap Compを動作させるには、Slap Comp Importの入力のAOVが既に用意されている必要があるので、デフォルトでdepth入力があることから
Karma Render Settings LOPで、ビルトンのDepthも
有効にしておきます。

次に、Slap Comp Import COPで入力を追加します。

同様にBlock Begin COPにも同じ入力を追加します。

Block End COPには、出力するカスタムAOVを追加します。

後は、好みに応じてCOPネットワークを構築します。
この例では、Mono COPを追加して、Direct Diffuseを明度値に変換し、Mono to RGB COPでその明度値を元にランプカラーを設定しています。

後は、ビューポートのControl Slap Comp settingsを有効にして、作成したSlap Compネットワークを指定します。

そして、ビューポートのViewing outputからSlap Compで追加したAOVを指定すると、それがビューポートに表示されます。

Slap Compで作成したAOVも画像に出力するために、Karma Render Setting LOPのExtra RenderVarsにそのカスタムAOVを追加します。

そして、USD Render ROPのSlap CompタブでCOPNetwork内のSlapComp Endブロックを指定します。
Render to MPlayボタンを押してレンダリングすると、
SlapCompで作成したAOVが出力されるのが確認できます。

しかし、huskコマンドでレンダリングしたい場合は、これだけでは設定が不十分です。
COPNetwork内でBlock to Geometry COPを追加し、Block End NodeパラメータにSlapComp Endブロックを指定します。

このBlock to Geometry COPは、指定したノードブロックをAPEXグラフジオメトリに変換してくれます。
このAPEXグラフジオメトリを保存するために、さらに、
SOP Networkノードを追加して、その中に入ります。

COP Networkノードを追加し、Use External COPパラメータをオンにして、COP PathパラメータにそのBlock to Geometry COPのパスを設定します。

こんなAPEXグラフジオメトリが取得できます。

このAPEXグラフジオメトリをbgeo(bgeo.scも可)ファイルに保存します。

以下のコマンドを叩くことで、Slap Compを反映してhuskでレンダリングすることができます。
こうすることで、必要なライセンスはKarmaレンダーライセンスで済みます。
husk Solarisで作成したシーンのUSDファイルのパス --slap-comp APEXグラフジオメトリファイルのパス
例:
husk D:/AdventCalender2025/scene.usd --slap-comp D:/AdventCalender2025/geo/slapcomp.bgeo
まとめ
- マテリアルがKarma Material Builderで組まれていれば、ちょっとしたテクニックを使うことでGlobal AOVシェーダグラフを構築することができる。
- Slap Compを使用してカスタムAOVを作成することができる。
このhipファイルはこちらです。
https://drive.google.com/file/d/1KVKIHlPAaD9xMOSFHoCmxxO-hZjO-aBc/view?usp=sharing
検証環境
Houdini21.0.512Python3.11
