Houdini 21.0 SolarisとKarma

Light Path Expressions

シーンに対する光源の寄与度を取り出します。

On this page

シーンをレンダリングすると、完全な照明が入った画像が得られます。 Light Path Expressions(LPE)とは、シーン内の照明の特定の種類のライトパス(光経路)を示した正規表現ライクなエクスプレッションであり、 それを使用して抽出されたシーンに対する特定のライトパスの寄与度をAOV(Arbitrary Output Variable:任意の出力変数)として別チャンネルに格納することができます。 適切なLPEを用いれば、 あらゆる 種類のライトパスの作用を記述することができますが、どの種類の光線がどの種類のサーフェスにどのように作用するのかを根本的に理解している必要があります。

LPE言語

LPEは、 正規表現 に非常に似た表記法を使用します。 正規表現は、テキスト内のパターンを見つけるための強力な手法です。 しかしながら、LPEの命令セットは正規表現ほど多くありません。 利用可能な量指定子(Quantifier)やワイルドカードは、下記の括弧、ワイルドカード、量指定子の章で説明しています。

LPE自体は、ライトパスの作用のパターンを定義したイベント記号で構成された文字列です。 一方、イベントは光線がシーンのサーフェスにどのように作用するかを記述します。 ライトパスの各文字がイベントを示し、そのイベントは大文字のアルファベットで表現します。 以下に典型的なライトパスの例を載せます:

  • 光線がカメラCから出射されて、シーンに入射します

  • その光線がディフューズサーフェスDに当たって、シーン内に反射されます

  • その光線が最終的に光源Lに到達し、そこで終了します

イベント

下記のテーブルには、Karma CPUおよびXPUレンダリングエンジンで利用可能なすべてのLPEイベントのリストを載せています。 “Terminating(終端)イベント”とは、Light Path Expressionの最後で記述する必要があるイベントのことです。 以下は、完全に表現したイベントの一般的な定義です。 個々のコンポーネントについては、このガイドの次の章で説明します:

<event_type scatter_type['tag'['bsdf_label']]>

Note

他のアプリケーションでLPEの経験をお持ちの方で、Ssといった散乱イベントがないとお感じになるかもしれません。 Karma CPUおよびXPUでは、すべてのスペキュラ散乱タイプはG(Glossy scatter:光沢散乱)として定義されています。

記号 イベント タイプ 説明
C カメラ 光線作用 カメラは観察者の視点を示します。すべての光線はカメラから出射し、光源に到達するまでシーン内を追跡されます。LPEsは常にカメライベントから開始しなければなりません。
R 表面反射 光線作用 反射面を持つ物体の例を挙げると、金属(光沢)や木材(拡散)があります。
T 表面透過 光線作用 透過性を持つ物体の例を挙げると、水(光沢)や皮膚(拡散)があります。
V 体積 光線作用 霧、煙、もやなどがボリューム現象の例です。
L ライト 終端イベント 光源からの寄与を蓄積します。
O 発光 終端イベント 発光体からの寄与を蓄積します。
B 背景 終端イベント シーン内の何とも作用しなかった光線からの寄与です。カスタムアルファプレーンを生成するために使用されます。
A アルベド 終端イベント 総出射エネルギーと総入射エネルギーの比率。
D 拡散散乱 散乱 粗い表面では、光線はあらゆる方向に散乱されます。
G 光沢散乱 散乱 粗さのある、または、粗さのない光沢面。粗さはぼやけた、または、乳白色の外観を生成します。

ライトと発光

よくある混乱の1つは、発光オブジェクトが 光源ではない ということです。 LPEがLイベントとOイベントを区別しているのは、これが理由です。 単に発光シェーダが適用されたオブジェクトは、Lイベントだけを指定したLPEでは捉えられないので、どちらのタイプも捉えられるように多くのLPEは[LO]で終わるように定義されています。

ただし、ジオメトリライトは発光シェーダを持つことができるものの技術的には完全な光源として扱われているので、それとは事情が異なります。 つまり、ジオメトリライトは、終端イベントがLのLPEで のみ 現れることになります:

  • 左側の図は、Houdiniロゴの形をした発光シェーダ付きジオメトリライトのビューティーパスです。

  • 中央の図は、CL LPEによるAOVですが、発光シェーダの黄色の光が捉えられています。

  • 右側の図は、CO LPEによるAOVですが、何も捉えられていません。

括弧、ワイルドカード、量指定子

括弧は、イベントの組み合わせに使用し、山括弧(<>)、大括弧([])、括弧のないイベントには違いがあります。

  • 山括弧(<>)は、イベントを完全に記述するのに使用します。山括弧(<>)内に複数のトークンが含まれていても、それらのトークンは単一イベントとして扱われます。例えば、<RD>は、拡散反射 のみ にマッチします。

  • 山括弧(<>)で閉じていない記号は、省略形トークンです。例えば、Dは、拡散散乱イベントを含み、[<RD><TD>]を意味します。

  • 大括弧([])は、その大括弧([])内のどのイベントにもマッチします。例えば、[LO]は、ライト または 発光のどちらにもマッチします。

  • [^DG]は、拡散散乱または光沢散乱を 除く どのイベントにもマッチします。

  • 括弧のないエクスプレッションは、指定された順序ですべてのイベントを必要とします。例えば、RDは、Dが必ずRに続かなければなりません。

下図は、山括弧を使用したLPE(C<RD>.*[LO])と山括弧を使用しなかったLPE(CRD.*[LO])の違いを示しています。

ワイルドカードと量指定子(繰り返し回数用の指定子)を使用することで、繰り返しを定義したり、結果を特定のイベントに制限することができます。 ワイルドカードは、LPEと組み合わせて使用する場合にはその使用方法が必ずしも明確にはならないため、おそらく最も抽象的な部分と言えるでしょう。 ワイルドカードに関する説明では、典型的には“イベントのゼロ回以上の繰り返しにマッチする”といった表現が用いられています。 LPEは光線と表面の作用を扱うため、この表現は“ゼロ個以上の表面に当たる”と解釈することができます。

!演算子は、LPEの出力を否定し、エクスプレッション全体の頭に配置する必要があります。 以下にこの例を挙げています。

以下のテーブルには、この概要に関連するすべての記号を載せています。

エクスプレッション 説明
<RD> 山括弧内のすべてのイベントが単一イベントとして扱われます。
[AB] イベントA または イベントB
[^D] D 以外の すべてのイベント。
. 任意の1つだけのイベントにマッチするワイルドカード。
* これより前に記述しているイベントをゼロ回以上繰り返す量指定子。
+ これより前に記述しているイベントを1回以上繰り返す量指定子。
! 結果を反転させます。

接頭辞

接頭辞は、エクスプレッションの頭に記述し、セミコロンで区切ります(例えば、shadow;C.*[LO])。 Karma CPUおよびXPUでサポートされている接頭辞は以下の3つです:

  • unoccluded:シャドウ適用前のライティング効果を返します。

  • holdout:非ホールドアウトエレメントからの累積寄与ではなく、ホールドアウトエレメントへのライティングを出力します。

  • shadow:指定されたエクスプレッションのシーンのシャドウパスを返します。

Tip

接頭辞の使用例は、このページの最後にある標準LPEsリストにいくつか載せてあります。

BSDFラベル

ラベルを介してBSDFローブをAOVに出力することができます。 ただし、カスタムBSDFラベルはVEXベースのシェーダでのみ機能し、MaterialXは サポートされていません 。 さらに、BSDFラベルには特定の表記(例えば、<...coat>)が必要になります。 coatBSDFの完全なLPEはC<...'coat'>.*[LO]となります。 なお、Karma XPUでサポートされているBSDFラベルはcoatのみとなっていることに注意してください。

赤い球はコーティングされており、右側の画像は上記のLPEの結果を示しています。

LPEタグ

LPEタグを使用することで、特定の光源だけの寄与を出力することができます。 HoudiniのすべてのLight LOPには、LPEタグを直接入力できる LPE Tag パラメータが備わっています。 このパラメータは Karma タブの Light セクションにあります。 別の方法としては、LPE Tag LOPを使用することもできます。

光源の影響を確認するには、2つの方法があります。 最も便利な方法は、 Split per LPE Tag を有効にすることです。 Karma Render Settings LOPのデフォルトAOVの多くには、 Split per LPE Tag チェックボックスが備わっています。 例えば、KeyFillRimのLPEタグが使用されていれば、 Beauty AOV(C )は自動的にC_KeyC_FillC_Rimに分割されます。

もう一つの方法は、LPEタグをシングルクォートで閉じることで(例えば、C.*<L.'Key'>)、そのLPEタグをカスタムLPEに追加することです。 このエクスプレッションは、Keyライトの影響のみを取り出します。 発光オブジェクトも考慮したい場合、そのエクスプレッションはC.*[<L.'Key'>O]となります。

ライトタグに加え、 ジオメトリタグ もあります。 ジオメトリタグもLPEタグと呼びます。 ジオメトリタグもLPE Tag LOPによって作成することができますが、LPEへの追加は手動で行なう必要があります。 ジオメトリタグもシングルクォートで閉じます。 例えば、brick_wallというオブジェクトのbeautyパスを出力したいのであれば、そのエクスプレッションはC'brick_wall'.*Lとなります。 壁の拡散反射を表示し、発光オブジェクトも含めたいのであれば、そのエクスプレッションはC<RD>'brick_wall'.*[LO]となります。

また、ライトタグとジオメトリタグは、C<RD>'brick_wall'.*[<L.'Key'>O]のように同じエクスプレッション内に記述することもできます。

LPEの適用

たいていの場合、最も重要なエクスプレッションは事前に定義されているため、手動でLPEを作成する必要はありません。 Karma Render Settings LOPで、 Image Output ▸ AOVs (Render Vars) ▸ Component Level Output を開きます。 そこには、例えば、 BeautyDiffuseReflections and Refractions などのセクションがずらりとリストされているのが分かります。 Diffuse セクションを展開して、チェックボックスにマウスカーソルを置くと、それに関連するツールチップが表示され、そのAOVの作成に使用されるLPEを確認することができます。

Tip

このページの下部には、事前に定義済みのLPEベースのAOVをすべて網羅したリストが載っています。

つまり、AOVを作成する際に最もよく使用するLPEを繰り返し作成する必要がなく、チェックボックスをオンにするだけで自動的にLPEが適用されます。

カスタムLPE

しかしながら、こんなにたくさんのAOVのリストが用意されていても、足りない場合があります。 カスタムLPEを追加するには、 Extra Render Vars セクションを開いて、 Render Vars を追加します。 すると、新しいAOVを定義できるパラメータセットが表示されます。 Source TypeLPE に設定されている場合にのみ、 Source Name 入力フィールドにカスタムLPEを追加することができます。

Tip

  • Name パラメータのドロップダウンメニューには、いくつかの事前定義済みのLPEも含まれていることに注目してください。 例えば、 Transmitted Diffuse Albedo を選択すると、 Source Name 入力フィールドにはC<TG>*DAが入ります。

  • Format ドロップダウンメニューから、どれかのcolor系タイプを選択してください。デフォルトの float はLPEでは機能しません。

LPEの開発

これでLPEの基礎固めができましたので、次のタスクは抽象的な概念を実際に動作する形に落とし込むことです。 達成したい内容次第で、LPEはかなり複雑になる可能性があります。

Transmission(透過)

それでは、ガラスオブジェクトの透過部分のみを抽出してみましょう。 上記の最初のテーブルを見ると、ライトパスはカメラ->ガラスの透過->光源となるため、そのエクスプレッションは単刀直入に記述できます。 このテーブルに従えば、そのLPEはCTLとなります。 これは既に有効なエクスプレッションになっていますが、あまりにも短絡的です。

より複雑な例を試してみましょう。 いくつかのオブジェクトを遮蔽するガラス球を想定し、LPEがその球の背後にあるシーンエレメントのみを検出したいとします。 この場合、ライトパスが光源に到達するにはガラス表面を少なくとも2回通過する必要があるので、CTLのエクスプレッションは失敗します。 このエクスプレッションだと、光源に到達するまでの1回の透過イベントしか含まれていないので、既存のライトパスのどれにもマッチしません。 任意の数のイベントを含んだライトパスを包含するには、ワイルドカードと量指定子が必要になります。 したがって、最も適切なLPEはC<TG>.*Lとなります。 このLPEは、最初に光沢透過を通過してから 任意の数 のイベントを通過して最終的に光源に到達するライトパスにマッチします。

次に、発光オブジェクトも含めたいです。 LPEは常にカメラから光源(終点)の方向に向かって評価されます。 ライトパスは“従来の”光源 または 発光オブジェクトで終了できるため、どちらの光源も考慮されます。 このような区別には、大括弧が必要です。つまり、LPEはC<TG>.*[LO]となります。

Alpha Transmission(アルファ透過)

アルファ透過は、否定演算子の良い例です。 以下のエクスプレッションは、透過オブジェクトからアルファ平面を作成します。 このLPEの構文は、上記のTransmission(透過)の例と同じです。 唯一の違いは、終端イベントが光源ではなくて背景のBであることです。 したがって、C<TG>*Bと記述することができます。

合成するには、その結果を反転させる必要があり、それは!演算子で行なうことができます。 !は必ずエクスプレッション全体の頭に配置する必要があります。 そのため、最終的なLPEは!C<TG>*Bとなります。

Direct Diffuse Reflection(直接拡散反射)

この例では、拡散面から反射した光(直接拡散反射)を取得したいです。 最初のテーブルを見ると、それに必要なイベントはCDLです。 したがって、まず思いつく答えはCDLとなります。 しかし、Dイベントには拡散反射と拡散透過の両方が含まれています。 そのため、結局のところSSSまでも含まれてしまうので、これは望ましくありません。

LPEは、より具体的に定義する必要があり、拡散反射を考慮するようにするには、D<RD>に置換します。 その正しいエクスプレッションはC<RD>Lとなります。

そのLPEをC<RD>.*Lに変更すると、光源に到達するまでに拡散反射の後に1つ以上のイベントを通過するので、結果として 間接 拡散反射となります。

Caustics(コースティクス)

コースティクスとは、光源に到達するまでに、粗い(または拡散)表面と光沢表面の両方に作用するライトパスのことです。 ここでは、ガラス球からの 屈折 コースティクスを抽出してみましょう。 なお、このエクスプレッションはカメラから直接見えるコースティクスのみを検出します。 例えば、ガラス板の背後にあるコースティクスを検出しないようにします。

  • すべてはカメラCから始まります。

  • ここで最初の部分は、光線が床に到達した際の拡散散乱Dイベントとなります。

  • 重要なイベントは、その拡散した光線が透過オブジェクトTを1回以上(+)通過することです。

  • 光源Lが終点となります。

したがって、ガラス球からのコースティクスの完全なLPEはCDT+Lとなります。 このエクスプレッションは透過オブジェクトからの光線のみを検出します。 あらゆるタイプのコースティクス(反射または屈折)を考慮したいのであれば、より堅牢なCDG+Lのようなエクスプレッションが必要となります。

ボリューム->光沢->ライトのライトパスもコースティクスパスと見なされます。 拡散面だけでなくボリューム 取得したい場合は、エクスプレッションをC[DV]T+Lに変更します。

AOVsの表示

Karmaの多くのAOVsはLPEベースであり、ビューポートでそれらを直接評価することができます。 これは、タグが付けられたライトやジオメトリも含みます。 すべてのアクティブなAOVを確認するために、インタラクティブプレビューレンダリングを開始します。

  • ビューポート右上コーナーにある 1番目 のドロップダウンメニューを開きます。 デフォルトのエントリは Persp です。メニューからどれかの Karma デリゲートを選択します。

  • ビューポートの右側にあるアイコンバー上の Render Outputs ボタンをクリックすると、すべてのアクティブなAOVを含んだリストが表示されます。 そのリストからAOVを選択すると、レンダリングが更新され、そのチャンネルを確認することができます。

MPlayでレンダリング結果を表示した場合は、ドロップダウンメニューを使用することで、利用可能なすべてのAOVからどれかのAOVを選択することができます。 そのメニューのデフォルトのエントリは C です。

AOVsの書き出し

もちろん、AOVsをエクスポートすることができます。 エクスポートの対象となるAOVsのすべてのリストは、Scene Graph Tree/Render/Products/Varsパス下で確認することができます。 このパスは、Karma Render Settings LOPの Existing Render Vars パラメータで変更することができます。 レンダリング結果の画像の出力パスも変更したいのであれば、Karma Render Settings LOPの Output Picture パラメータで変更することができます。

最終的にAOVsを書き出すには、USD Render ROPが必要です。 そこで、 Valid Frame Range を調整して、 Render to Disk ボタンまたは Render to Disk in Background ボタンをクリックします。 アクティブなAOVsがマルチチャンネルのEXRファイルに保存されます。

標準LPEs

前述の通り、Houdiniは事前定義されたLPEを使用して色々な標準AOVを出力します。 以下のリストは、 AOVs (Render Vars) タブから利用可能なすべてのLPEsを含んでいます。 これらをベースにして、より複雑な独自のLPEを作成することができます。

tr>

AOV LPE 説明
beauty C.*[LO] すべての可能なライトパスの累積。
beautyunshadowed unoccluded;C.*[LO] 遮蔽されていないbeautyパス。
shadow shadow;C.*[LO] すべてのシャドウを表現したbeautyパスから遮蔽部分と遮蔽されていない部分の比率。
combineddiffuse C<RD>.*L 合成された(任意の数のバウンス)拡散表面反射コンポーネント。
directdiffuse C<RD>L 直接(バウンスなし)拡散表面反射コンポーネント。
indirectdiffuse C<RD>.+L 間接(1回以上のバウンス)拡散表面反射コンポーネント。
combineddiffuseunshadowed unoccluded;C<RD>.*[LO] 合成された(任意の数のバウンス)遮蔽されていない拡散表面反射コンポーネント。
directdiffuseunshadowed unoccluded;C<RD>L 合成された(バウンスなし)遮蔽されていない拡散表面反射コンポーネント。
indirectdiffuseunshadowed unoccluded;C<RD>.+L 間接(1回以上のバウンス)遮蔽されていない拡散表面反射コンポーネント。
combinedglossyreflection C<RG>.*[LO] 合成された(任意の数のバウンス)光沢表面反射コンポーネント。
directglossyreflection C<RG>L 直接(バウンスなし)光沢表面反射コンポーネント。
indirectglossyreflection C<RG>.+L 間接(1回以上のバウンス)光沢反射コンポーネント。
glossytransmission C<TG>.*[LO] 光沢透過コンポーネント。
coat C<...'coat'>.*[LO] 'coat'ラベルを含んだBSDFからの合成された寄与(任意の数のバウンス)。
combinedemission C.*O 合成された(任意の数のバウンス)発光コンポーネント。
directemission CO 直接(バウンスなし)発光コンポーネント。
indirectemission C.+O 間接(1回以上のバウンス)発光コンポーネント。
visiblelights CL 可視ライトコンポーネント。
combinedvolume CV.*L 合成された(任意の数のバウンス)ボリュームコンポーネント。
directvolume CVL 直接(バウンスなし)ボリュームコンポーネント。
indirectvolume CV.+L 間接(1回以上のバウンス)ボリュームコンポーネント。
sss C<TD>.*L 合成された(任意の数のバウンス)拡散表面透過コンポーネント(別名SSS)。
albedo/diffusealbedo CDA 拡散イベントのアルベド。
holdout holdout;C.*[LO] ホールドアウトオブジェクト(s)のビューティーパス。
albedoglossyreflection C<RD>A 光沢反射イベントのアルベド。
albedoglossytransmission C<TG>A 光沢透過イベントのアルベド。
albedotransmitteddiffuse C<TG>*DA 光沢透過を介した拡散イベントのアルベド。

SolarisとKarma

SolarisとUSD

  • USDの基本

    いくつかUSDの概念について取り上げ、それらの概念とHoudini USD対応との関係性について説明します。

  • LOPの挙動

    Solaris LOP(Lighting Operator)がUSDを生成/変更する際の挙動について説明します。

  • Solarisユーザインターフェース

    LOPネットワークとUSDデータを操作するためのユーザインターフェースの使い方を案内します。

  • プリミティブマッチングパターン

    USDプリミティブマッチング構文の使い方。

  • LOPとUSDの用語集

    USDわかりますか?

  • Solarisシーンビューア

    Houdiniオブジェクト/SOPビューアと比較したSolarisビューアの違い/拡張について説明します。

  • USDでのVEXの使い方

    スクリプトによってSolaris/USDをカスタマイズする。

  • USDへ書き出す方法

    USDデータをディスクに保存します。

  • SOP Geometry I/O

    HoudiniがSOPジオメトリをUSDに変換する方法、その工程を制御する方法の詳細。

  • Component Builder

    Component Builderツールは、マテリアル、バリアント、ペイロード、レイヤをサポートし、SOPからUSDモデルを作成するためのネットワークスニペットを配置します。

  • パフォーマンスTips

    Solarisのインタラクティブなワークフローを向上させます。

  • サンプルシーン

    SolarisとUSDを学習するのに役立つシーンとアセットを紹介します。

Karma

  • Karma

    Houdiniの物理ベースのUSDレンダラー。

  • Karma XPU

    Houdiniの高速でモダンなXPUレンダーエンジン。

  • カラーマネージメント

    OCIO、カラー空間、ガンマ、トーンマッピングについて詳しく学習します。

  • レンダリング統計

    進行中のレンダリングやレンダリング画像のレンダリングプロセスに関して、様々な統計情報を表示する方法。

Karmaユーザガイド

ルック開発

  • MaterialX

    HoudiniにはMaterialXシェーダノードに呼応させたVOPノードが用意されています。これらのノードを使用してシェーダネットワークを構築したり、既存のMaterialXベースのシェーダをインポートすることで、(HoudiniのUSDレンダラーの)KarmaでMaterialXシェーダノードを利用することができます。

  • UDIMパス

    テクスチャ空間の異なるタイルを、それぞれ別の解像度で、異なるテクスチャファイルにエンコードすることができます。その後、kaiju.exrといったテクスチャファイル名を指定すると、Houdiniがロード時にそのトークンを特定のタイルアドレスに置き換えてくれます。

  • シェーダ変換

    シェーダノードのUSDプリミティブへの変換を含む、Solarisシェーディングフレームについて説明しています。

  • Shotbuilderツール

    マルチショットパイプライン用便利ツール。

プロシージャル

補足ドキュメント