CopernicusでCryptomatteを使う

![combined.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/2488d716-5dff-3e22-5c2f-1d8f02b19059.png)
# はじめに
こんにちは。大城です。
HoudiniのCryptomatte COPの使い方にちょっと躓いたので、使い方を残しておきます。

# そもそもCryptomatteとは
Cryptomatteはレンダリングパスの一つで、特定のオブジェクトやマテリアルを選択、マスク、操作するためのデータを生成します。オブジェクトごとに一意のカラーチャンネルを割り当て、コンポジティングソフトで簡単に特定要素を選択可能にします。
つまりCryptomatteがあるとコンポジットで要素ごとのマスクがしやすくなるということですね。

[Cryptomatte COP](https://www.sidefx.com/docs/houdini/nodes/cop/cryptomatte)はCOPでそのCryptomatteのマスクを取るノードです。

# サンプルシーン
至極シンプルに、オブジェクトをいくつか並べたシーンを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/048a534f-ee8c-0c36-f24e-19be598304a5.png)
Scene Graph Treeはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/762480f9-51fa-3d17-8fb4-1d46e35c6e45.png)

# Karma Render Settings
AOVでCryptomatteの出力設定を行います。
Karma Render Settings LOPの`Image Output`>`AOVs (Render Vars)`>`Extra Render Vars`からCryptomatteの設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/fc19a532-590f-94d6-5c3e-6134b3acac45.png)

`Cryptomatte Object Name（オブジェクトごとのCryptomatte）`か`Cryptomatte Material Name（マテリアルごとのCryptomatte）`を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/bbc51e94-c3ec-702a-8d08-72e1b76b0ac5.png)

ファイルの拡張子は`exr`にしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/b6682742-3b77-7feb-d8ae-ac2e63b41072.png)

# exrのマニフェストを調べる
レンダーしたexrの画像にはメタデータとしてCryptomatteのオブジェクト名が含まれます。
Cryptomatte COPでマスクを作るために、まずこのメタデータを見る必要があります。
今回はHoudiniの[スタンドアロンユーティリティ](https://www.sidefx.com/ja/docs/houdini/ref/utils/index.html)の1つである`iinfo`を使います。
Houdiniのスタンドアロンユーティリティを使う方法はいくつかありますが、今回はHoudiniのツールバーからシェルを立ち上げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/ba3ea982-91ba-7c01-c25c-a65b2cf3bbd8.png)

シェルで以下のコマンドを打ちます
```
iinfo -v path/to/filename.exr
```

するとダラララーとexrの情報が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/96e3fe25-aaba-846d-fe0e-926eeaa6d7de.png)

まずこの文字列の中の最初あたりの`Meta Data:`を探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/f44e6c06-791f-6da4-b1b5-8eee9275db8c.png)

`Meta Data:`のインデントの中の`cryptomatte/(16進数の数字)/manifest (type string)`という項目を探します。
今回の私のデータはこんな感じ。これが欲しかったデータです。
```
cryptomatte/3ae39a5/manifest (type string):= "{"/grid1/mesh_0":"ff21a168","/rubbertoy/geo/shape":"cd53092d","/pig/geo/shape":"42f2c749"}"
```

# Cryptomatte COP
CopNetを作り、File COPでexrを読み込みます。
`Add AOVs from File`をクリックするとexrのAOVも読み込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/5f92e319-b96d-95d6-3e7c-e2bc7cdcc919.png)

`CyptoObjectxx`のピンを全部Cryptomatte COPにつなぎます。（とはいえ今回マスクしたい情報が入っているのはCryptoObject00だけですが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/5d590c3c-db4d-6abd-17e8-0cfe80757435.png)

ここでさっき探したマニフェストデータを見てみます。
`/grid1/mesh_0`と`/rubbertoy/geo/shape`、`/pig/geo/shape`というキーがありますね。これがそれぞれのオブジェクトの名前です。

```
cryptomatte/3ae39a5/manifest (type string):= "{"/grid1/mesh_0":"ff21a168","/rubbertoy/geo/shape":"cd53092d","/pig/geo/shape":"42f2c749"}"
```

Cryptomatte COPのSelectionにマスクしたいオブジェクト名をカンマ区切りで入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/3ae0d8c0-b16e-8b7c-7cb8-77890bbf380a.png)

RubberToyとPigHeadがマスクされました🥳
![masked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638853/0a81ea18-ad31-8ca6-251b-749082608ec6.png)