Notch で FILL/KEY 出力 (TouchDesigner と Standalone) 


#はじめに
Notch はコンサートのLEDスクリーンやプロジェクションマッピングなどで使われることが多いと思いますが、0.9.23 から FILL & KEY 出力ができるようになり、合成用のリアルタイム・グラフィックスとして映像出力することが可能になりました。

TouchDesigner も 2019.15230 から Notch Block がサポートされ、他のメディアサーバーのように Notch で作ったシーンを再生することができるようになっています。
この2つを使って、イベントや放送で使われる合成用の映像(FILL/KEY)を出力する方法を紹介したいと思います。

#おわび
いきなりお詫びで恐縮ですが、実は今回 Particle を使ったシーンで行う予定だったのですが、Particle を使った時のポストエフェクトの挙動がおかしい事に気が付いたため、津久井さんの「[Notch | Straight Alpha連番の出力方法](https://note.com/katsuya_tsukui/n/n2d4c838ada54)」のシーンを引用させて頂き、簡単に説明する程度にとどめさせて頂きます。
でも、どうしたもパーティクルでやりたいんよ！という方のために、あまりオススメではないですが、それっぽくできる方法を載せておきます。

今回使用したバージョンは以下の通りです。
Notch: 0.9.23.061 // PRO
TouchDesigner099 Pro: 2019.20140

##サンプルファイル
[fillkey_sample.dfx](https://drive.google.com/file/d/1QxGGgJtBqmnFwW10I0ivRYrDlXVBrsne/view?usp=sharing)
[Notch_FillKey.toe](https://drive.google.com/open?id=17JReAjNMcnA4hkB3VyELL6VXeIZ3xRhl)

#Notch の設定
サンプルは津久井さんの例にならってシンプルな Streaks を使ったエフェクトをかけています。
![Notch_Scene2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/06ec2bf4-58da-4319-4068-c0303510b6d2.png)


~~0.9.23 の時点では、ポストエフェクト系の挙動がややおかしく、プレビュー画面でみている映像と実際の解像度で出力した映像とでエフェクトのかかり方が異なります。
ポストエフェクトを使う場合は F9 または F10 キーを押して実際のサイズでプレビューしながらエフェクトを調整してください。~~
![Diff_Preview_and_FHD2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/2cd212a2-87f4-a468-a0b9-55accff26cdc.png)

 ↑ ゴメンナサイ、おかしいのは私の方でした。プレビューとレンダー結果を合わせる方法は[こちら](https://qiita.com/aokey/items/d9700dcf9aecf0ba45ec)を参照してください。

###Root の設定
Root->Attributes の Composite Blend Mode を Blend With Alpha Channel に設定。Output Premultiplied Alpha はここでは ON のままにしておきます。
![Root_Setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/cd21b02b-dcd6-d84c-a226-7e98c9c939ce.png)


###ポストエフェクトの設定
Post-FX を使っている場合は、各ノードの Affected Channels の Alpha を ON にします。サンプルでは Streaks しか使っていないので、Streaks の Alpha と Streak Difference As Alpha を ON にします。

![PostFX_Setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/b7619e0d-15b7-d4c4-71db-2cb2fdfee897.png)

###Blockの書き出し
ここまで設定できたら、Notch Block を書き出します。
ここでは notch_particle.dfx.dll という名前で書き出しています。

![Notch_Block_Out.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/73fe4154-f564-e2d4-3a85-61946c052bec.png)


#TouchDesigner の設定
Notch TOP を使うには TouchDesigner の Pro バージョンが必要です。

###Notch TOP
TouchDesigner が起動したら、先ほど作った notch_particle.dfx.dll をワークスペースにドラグ&ドロップするか、Notch TOP を作ってパラメータの Block に notch_particle.dfx.dll を指定してください。

Notch TOP はデフォルトで 1280 x 720 になっているので、パラメータウインドウの Common タブから Resolution を Notch でターゲットとしていた解像度（ここでは 1920 x 1080）を指定してください。

![Touch_NotchTOP_Resolution.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/a09f5180-d3bc-9953-c747-4f35a4e60ef7.png)

###FILLの取り出し
Notch TOP で表示されているものはアルファによってプリマルチプライされているものなので、これをアンプリマルチプライして FILL の状態に戻していきます。

Math TOP を作り、Notch TOP(notch_particle)の出力をつなぎます。
Math TOP の Multi-Add タブの Operation を Divide RGB by Alpha にします。
![Touch_MathTOP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/57589d89-f76f-064f-3c17-65dd07b0d6bc.png)

これにより、プリマルチプライされた状態から FILL に戻ります。
![Touch_FILL2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/4278125f-45f3-e41e-2cb9-580d84d05bb3.png)


###KEY取り出し
今度はKEY(アルファ)を取り出します。
Alpha 各ピクセルの透明度を持っているので、これを KEY 信号となるモノクロ映像に変換します。

Reorder TOP を作り、Notch TOP(notch_particle)の出力を Reorder TOP の input1 につなぎ、Reorder タブから Output Red, Green, Blue を全て Alpha にします。
![Touch_Reorder.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/b344bb1d-9370-1930-c56c-30b616a0c8fc.png)

すると、以下のようなモノクロ映像が得られます。
![Touch_KEY2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/1e8ff0ed-cfc1-57db-5f42-80e26c48e53f.png)


###SDI出力
Video Device Output TOP を2つ作り、Math TOP(FILL) と Reorder(KEY) の出力を SDI として出力することで、外部ミキサーやスイッチャーなどの合成機で綺麗に合成することができます。

念のため、Multiply TOP で合成結果を見れるようにしておくと良いでしょう。
最終的には以下の感じで終わりです。
（Videoボードが搭載されてないPCで作業してたので、エラーが表示されていますが気にしないでください）
![Touch_Result2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/9595905c-a5a4-6b3c-ad6a-de502443517e.png)


#Standalone
TouchDesigner を使わずに Standalone アプリケーションとして FILL/KEY を出力することも可能です。

###Root の設定
前回と同様に Composite Blend Mode は Blend With Alpha Channel にしておきます。さらに、Output Premultiplied Alpha を OFF にし、Standalone Application として書き出します。
![Notch_Root_Standalone.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/2a53ec9d-1145-39e3-ff6b-295cb59a2ec2.png)


###Standalone Application 起動時の設定
Standalone Application を起動時に Key & Fill を ON にすると、Display 2 (Key)が有効になり選べるようになるので、Display1, 2（または接続している出力デバイス）を選択します。

![Notch_Standalone_FILLKEY.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/60beb625-d6ea-0ddc-97b6-9b31f04ce2b1.png)

Run ボタンで実行させると、以下のような映像が表示されます。
![Notch_FILLKEY_FULL2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/21867816-4f62-ff01-9ff1-2d07b0ee9288.png)


モニター上にこの映像を表示させても何もできないので、通常は HDMI や DisplayPort 等の出力先を指定します。

1点注意事項として、GeForce 系 GPU からの出力だと、Fill と Key の映像が同期しません。この Fill/Key 出力を使って合成したい場合は必ず Quadro 系 GPU で Moaic 機能を使って映像を同期させてください。
詳しくはこちら : [マルチディスプレイ のための Mosaic テクノロジ - NVIDIA](https://www.nvidia.com/ja-jp/design-visualization/solutions/nvidia-mosaic-technology/)

外部のミキサーに送る場合は、HDMI/DisplayPort -> SDI 変換が必要になるかもしれませんし、更に SDI の信号を同期させるために BB や三値(TriSync)と言われるリファレンス信号が必要になる場合もあるでしょう。現場に合わせて運用してください。

#パーティクルの問題
今回の設定でパーティクルをレンダリングすると、なぜか Fill がストレートになりません。サンプルファイル中の Particle Root をアクティブにし Root の Output Premultiplied Alpha を OFF にしたまま描画してみると、パーティクルの Streaks が黒を引っ張ってしまい、Shape 3D の Streaks にも影響を与えています。

![Notch_ParticleBlack_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/8d685d6d-4204-757f-6051-ecaae393f3b1.png)

この Notch Block を TouchDesigner 側でレンダリングすると、こんな感じになります。
![Touch_ParticleBlackBase_Small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/d476533e-fd21-00ec-9d83-0b8a20fb8807.png)

パッと見たところ問題なさそうなのですが、下地を別の画像に変えるとこうなります。
![Touch_ParticleImageBase.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/7fbfd145-d65a-4c0c-147d-1a593fce8c8e.png)

パーティクルになぜか黒がのっちゃってますね。
なんかバグのような気もするのですが、とりあえずどうしてもパーティクルを使いたい！という人は、Notch の Streaks のプロパティの Streak Difference As Alpha を ON にして書き出してください。
![Notch_DifferenceAsAlpha.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/99f74d3d-09f1-1782-c2d4-e069801ce20c.png)

すると、アルファがやや弱くなってしまい色の出方が変わってきちゃうのですが、黒を引っ張らずに合成させることができます。
![Touch_ParticleDiffAsAlpha_Small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/7a1ef1d6-bff8-0f6d-45ce-59b3378ed8c3.png)


#最後に
とりあえず Notch を使っての Fill/Key 出力する方法をまとめてみました。
Fill/Key 出力ができるようになって便利にはなったのですが、パーティクルのように挙動がやや怪しい部分もあったりします。他にもアレ？と思う所もあったので、その辺また後日検証できればと思っています。