Karma Material Builder [Mardini2024]

これはMardini2024のDay7 Karma Material Builderの動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=ZmIcORJUbdU)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ed468081-c54a-a0c6-7de6-11c1366fc6af.png)


[公式のサンプルファイル](https://media.sidefx.com/uploads/contests/mardini2024/moeen_videos/mardini_examples_day7_karmamaterialbuildervop.zip)

[Day6 Material Linker](https://qiita.com/jyouryuusui/items/9b4cb03d26bfdf616b86) | Day7 Karma Material Builder | [Day8 Karma Fog Box](https://qiita.com/jyouryuusui/items/87f0b3dcac84fb551dfe)

Karma Material Builderを使えば、自作のマテリアルをカスタマイズして作成できます。また、Grayscale Gorillaプラグインを使えば、マテリアルを簡単にインポートできます。

https://greyscalegorilla.com/plus-downloads/houdini-importer/

# 要約
- Karma Material BuilderはVOPコンテキストで動作する
- ノード内でマテリアルのルックを構築する。各種ノードを接続してマテリアル表現を作り上げていく
- Grayscale Gorillaプラグインを使えば、同社提供の高品質マテリアルをインポートできる
- インポートしたマテリアルは、Material Linkerノードで割り当て可能
- マテリアルのパラメータも公開されており、視覚的に調整が可能

# サンプルファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6d3c0983-6390-c608-64c4-1ca43926c043.png)

シェーダーボールとカメラ、KarmaPhysicalSkyを含むシーンです
マテリアルはアタッチされていない状態です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7473a2b8-4b5f-6662-23b7-d3df5ddf07fd.png)

## 事前準備

テクスチャを事前にダウンロードしておきます。greyscalegorillaのサイトでTileのマテリアルアセットを取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d23d2d72-463b-758e-9de3-011f5c615143.png)

https://3dassets.greyscalegorilla.com/free?searchTerm=Tile

### プラグインをインストールする場合

[プラグイン](https://greyscalegorilla.com/plus-downloads/)
[サポートページ](https://support.greyscalegorilla.com/article/636-houdini)

## 操作手順

- Day6ではMaterialLinkerを利用してマテリアルを適用しましたが、今回はVEX BuilderコンテキストにアクセスするためMaterial Libraryを利用します
- Material Libraryノードを作成し新しいVOPネットワークを作成します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/128c14b8-c89f-0187-aabe-324cb15036fe.png)

### ３つのMaterial Builder 比較
- Material Libraryノード内に入ったら**VEX Material Builder**、**USD MaterialX Builder**、**Karma Material Builder**を作成してみましょう
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/954196fa-cb8c-0430-a73d-46fbad67679b.png)
    - VEXのシェーダーを利用しているためKarmaCPUのみで利用できます。KarmaXPUは動作しません
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5e62b5bf-5d3c-f3d8-a7bc-ab3364eab829.png)
    - KarmaCPU、KarmaXPUで完全に動作しますが、サードパーティのアプリケーション用でもあります
    - HoudiniからUSDアセットをエクスポートすることができ、マテリアルはそのサードパーティアプリケーションで機能します
    - Karma固有のノードは利用できません
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bdb043c2-9066-e277-bbee-0f7a13696fee.png)
    - MaterialXサブネットもアクセス可能
    - Karma独自のノードを呼び出すことができる
    - KarmaXPUで一部動作しないことがある

### Karma Material Builderの構築

- これからタイル状のマテリアルを作成します
- Material Libraryノード内でKarma Material Builderノードを作成します
    - 名前はGSG_TILES（Grayscale Gorilla Tiles）に変更します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3020b292-10e8-b608-0eb5-bce45676ad05.png)
    - Karma Material Builderノード内でマテリアルのネットワークを構築します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5d7c6dfe-6a7d-5a24-0dc9-8897ee0046b1.png)
    - mtlxstandard_surfaceのBase Colorを赤色に変えておきます（割当されているかの確認用）

#### マテリアルの割当

- 構築を行う前にマテリアルをシェーダーボールのジオメトリに割り当てます
- stageに戻り、MaterialLinkerをMaterialLibraryの下に追加します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/fbff0c83-a0ce-bf89-6f97-3a2fca5bf2f5.png)
    - Material Listにマテリアルが追加されていることが確認できます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1c79ea52-0c8f-b724-87bd-b4cf901be5c8.png)
    - そのマテリアルをシェーダーボールにドラッグ＆ドロップします
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f74ee4b9-e65b-142e-26cf-5cb51d2a801c.png)

#### テクスチャマップの取り込み

- Karma Material Builderノードに戻り、必要なノードを作成・接続していきます
- inputsノードは不要なので削除します

##### Base Color

- MtlX Imageノードでテクスチャ画像を読み込みます　SignatureはColorのままです
    - MtlX ImageノードのFilenameに　GSG_MC001_A096_DCeramicTilesSquare04_4k_basecolor.jpg　を指定します
    - outをMtlX Standard Surface のbase_colorに入れます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b34ca30b-1326-c371-a9e1-b63dbe0e9359.png)
    - 色味が反映されました。次は法線とラフネスを反映させます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2d338a6c-e0a4-a731-e777-8c865bcda026.png)

##### Roughness

- 新たにMtlX Imageノードを作成します。ラフネスは　SignatureをFloatにします
- GSG_MC001_A096_DCeramicTilesSquare04_4k_roughness.jpg　を指定します
- outをMtlX Standard Surface のSpecurlar Roughnessに接続します
- ラフネスが効きました
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0fd646f3-87ae-98fc-b3d4-0fea5dea376b.png)


##### Normal

- 新たにMtlX Imageノードを作成します。法線は　SignatureをVector3にします
- GSG_MC001_A096_DCeramicTilesSquare04_4k_normal.jpg　を指定します
- MtlX　Normalmapノードを作成、MtlX Imageノードとつなぎます
- MtlX　NormalmapのoutをMtlX Standard Surface のGeometry > normalに接続します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ede0547f-08db-cec9-599c-5bf4947e6103.png)

##### Karma Curvature

- 新たにKarma Curvatureノードを作成します。入力に位置と法線を利用します
    - Normalは先程作成したMtlX　Normalmapからnに入力します
    - Positionは新しくMtlX　Postisionノードを作成します
- 一時的にどの程度の影響が現れているかMtlX Surface Unlitノード（非照明サーフェス シェーダ）をMaterial_Outuputsに繋いで確認します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3b19055e-c587-b6b7-d4a2-7bfd440b5373.png)
- Positionの後ろに乗算（MtlX Multiply）をいれることで細かい制御が可能です
- 最終的にCurvatureの後ろにはKarma Ramp Constを挟んでMtlX Mix(Signature:Color Fgにはテクスチャ Bgは黒のColor、mixにCurvatureを入れる)を経てbase_colorに流し込みます
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/94029691-7a15-66c9-df22-2e191be0a269.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/010bf4d8-06f9-14f2-807f-d9ef8ea214b3.png)

## Grayscale Gorillaプラグイン

- Grayscale Gorillaプラグインをインストールしている場合、シェルフにツールが追加されます
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/38b82b19-4ec6-c006-5f24-8febd7a86e8c.png)
- シェルフのImport Materialボタンを押し、インポートするマテリアルフォルダを選択します
    - ポップアップ上でImportボタンを押します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d2502ea9-5033-60e9-719e-af1d7c583542.png)
- マテリアルがmatネットワーク内にインポートされるので、コピーしてLOPのMaterial Libraryに貼り付けます
- これまでと同様にMaterial Linkerノードで、ライブラリ内のマテリアルをシーン内のジオメトリに割り当てます
- マテリアルにはいくつか外に公開されたパラメータがあり、スケール/回転等を調整できます

# まとめ

Karma Material Builderでは、Houdini内で高品質なマテリアルを作成できます。Grayscale Gorillaマテリアルを活用することもできます。