TouchDesigner: Instance Textures 基礎編

# はじめに
TouchDesigner で GPU インスタンスを行った時に使う**Instance Textures** の基本的な使い方について解説します。
また、TouchDesigner アドベントカレンダー 2020 「[嵐のバーチャル大合唱っぽいものをやってみたい！](https://qiita.com/aokey/items/12fc1809f0c788c0f842)」の補足記事にもなっていますので、併せて読んで頂けると嬉しいです。

# サンプル
基本編、ちょっと応用編のサンプルはこちらです
https://drive.google.com/file/d/1ecURR_sNvjqYKtqM_SMKNtCuEU2bIJob/view?usp=sharing

# Instance Textures ってなに？
GPU インスタンスを使ってオブジェクトを複製させた場合、複製したそれぞれのオブジェクトの位置や回転、色などをオペレータの情報を使ってバラバラに操作することができます。
同様に、オブジェクトに貼り付けるテクスチャもオペレータの情報を使ってインスタンス毎に切り替え制御が行えます。それを実現する仕組みが **Instance Textures** です。

# 基本を学ぶ
シンプルな例を使って基本を理解していきましょう。
### シンプルなインスタンスの作成
まずは、GPU インスタンスを使ったシンプルなオブジェクトの複製をやっていきます。

1. Rectangle (rentangle1)を作り、Geometry COMP につなぎます（Geometry COMP の中に作ってもOKです）
2. Geometry COMP の **Instance -> Instancing: ON**
3. もう１つ Rectangle (rectagle2)を作り、**Size: (2, 2)**
4. geo1 の **Instance -> Default Instance OP（または Translate OP）: rectangle2**
5. **Translate X, Y, Z: P(0), P(1), P(2)**
![Rectangle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/e041bda2-0fac-b1a7-9933-06c7ed441ab0.png)
これで、rectangle1 が rectangle2 のポイントの位置に複製されました。

### インスタンスにテクスチャ割り当て
つづいて、複製したオブジェクトにテクスチャを割り当てていきます。

1. Movie File In TOP を4つ作り、名前を A, B, C, D などに変え別の画像を選んでおく
2. Constant MAT を作り、**Color Map: A**
3. geo1 の **Render -> Material: constant1**
![Material.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/f6d81790-5d6b-51b9-db9a-c53e447fc654.png)
これで4つの Rectangle に同じテクスチャが割り当てられました。

### インスタンスにバラバラのテクスチャを割り当て
では次に、オブジェクト毎に異なったテクスチャを割り当てていきましょう。

1. Patter CHOP を作り、**Channel -> Channel Name: index**
2. pattern1 の**Type, Length, To Range**を以下の通り設定  
![PatternChop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/792fb934-a2d6-abaf-fee3-a6e03af48df8.png)
3. geo1 の **Instance 2 -> Instance Textures, Texture Index OP, Texture Index** を以下の通り設定
![Instance2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/538240d3-aee2-fc98-6362-f209f89cd6c2.png)  
ここで、今設定したパラメータの意味を解説します。

<dt>Instance Textures</dt>
<dd>割り当てたいテクスチャの名前を指定します。複数ある場合はスペースを空けて列挙するか、正規表現を使って指定します。
Movie File In TOP を作ったところで名前を A, B, C, D に変えましたが、デフォルトのままの場合は moviefilein1, moviefilein2, ... のように書くこともできるし moviefilein[1-4] という書き方もできます。
ですが、末尾の1,2,3,4という数字があとで紛らわしくなるのを避けるため、あえて A, B, C, D という名前に変えています。
</dd>
<dt>Index OP</dt>
<dd>インスタンスに割り当てるインデックス情報を持ったオペレータを指定する。ここでは pattern1 にその情報を持たせています。</dd>
<dt>Texture Index</dt>
<dd>Index OP で指定したオペレータ（pattern1）の中で、インデックスとして使うチャンネルを指定する。</dd>
　　
では pattern1 の中身を見ていきましょう。
![Pattern1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/cc3635b8-0bfa-ae27-36fd-43981318d93e.png)
横軸がサンプル、縦軸がインデックス値となります。
patter1 を作った時に **Length: 4** と指定したのはこのサンプル数を意味しています。各サンプル（横軸）がどの値（縦軸）かをみると、サンプル:1 = 0, サンプル2 = 1, サンプル3 = 2, サンプル4 = 3 となります。
見方を少し変えると PintID:1 = TextureIndex:0, PointID:2 = TextureIndex:1, ...となり、更に TextureIndex が指し示すものに置き換えて考えると、PointID:1 = Instance Texture の 0 番目（Aの画像）、 PointID:2 = Instance Texture の1番目（Bの画像）、、、という具合になります。  
いかがでしょうか？
geo1 に貼られているテクスチャは大体こんな感じになったのではと思います。（見やすくするため、オペレータの位置を少しズラしました）
![InstanceTexture1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308950/8330a5c0-a612-5139-ad95-a8c90a6a7cc9.png)

# まとめ
いかがでしたでしょうか？
Instance Textures を使う上での基本が理解できたのではと思います。  
ちなみに、ここまで設定できたら constant1 の Color Map は消しても構いません。なぜなら Constant MAT (constant1) の Color Map はInstance Textures で設定したテクスチャに上書きされてしまうからです。

さて次はちょっと応用編です。
いま作ったものは Base COMP にしまって次へ行きましょう！

つづく: [Instance Texture ちょっと応用編](https://qiita.com/aokey/items/91fe875583907b775fd2)