[2019.2.14f1] LWRPのLight2Dのブレンドスタイルをいじってみる

# 概要
すでに様々な記事で取り上げられていますが、
Unity2019からLightweight Render Pipeline(LWRP)の機能として2D向けのライト「Light2D」が追加されました（2019.2.14f1ではExperimental）。
Point LightやSprite LightなどLight2Dで用意されているライトを組み合わせるだけでも多様な2Dルックを作ることができますが、ブレンドスタイルを編集することでさらに幅を持たせることができます。
本記事ではブレンドスタイルをいじることによってどんなことができるのかを紹介します。
<img width="343" alt="スクリーンショット 2019-12-03 18.47.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/1d0431d9-baa7-4240-3f5b-18c79f3af35b.png"> <img width="332" alt="スクリーンショット 2019-12-03 18.49.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/27128309-e6f1-24e4-f65c-27ccc151a1d3.png">

# 導入
まずはLight2Dを使えるようセットアップ

## 環境
Unity 2019.2.14f1

## 手順
2Dのテンプレートを使用して新規プロジェクトを作成し、`Window > Package Manager`から`Lightweight RP` をInstall（執筆時はVersion 6.9.2）
   <img width="696" alt="スクリーンショット 2019-12-03 18.54.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/d00ed15f-1cf4-b3e1-58cc-360ec9db0b27.png">

`Assets > Create > Rendering > Lightweight Render Pipeline`から`Pipeline Asset`を作成。今回はファイル名はデフォルトの`LightweightRenderPipelineAsset`

`Assets > Create > Rendering > Lightweight Render Pipeline`から`2D Renderer (Experimental)`を作成。今回ファイル名はデフォルトの`New 2D Renderer Data`

`Project Settings`を開いて`Graphics > Scriptable Render Pipeline Settings`に`Pipeline Asset`をセット
<img width="852" alt="スクリーンショット 2019-12-03 19.10.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/0b0fb787-417e-8bfa-a034-30cdeaf335c7.png">
`LightweightRenderPipelineAsset`を選択してインスペクタから`General > Render Type`を`Custom`にし、`2D Renderer`をセット
<img width="471" alt="スクリーンショット 2019-12-03 19.13.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/ebc958fa-ffd4-291d-ef70-3be2c4701b3d.png">
これで完了
<img width="639" alt="スクリーンショット 2019-12-03 19.16.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/9e001734-ba96-1754-2c52-e8f0aa99fea1.png">

ライトの種類の紹介やノーマルマップの適用法に関してはすでに他の方の記事（[テラシュールさん](http://tsubakit1.hateblo.jp/entry/2019/07/08/223020)など）で紹介されているので、ここでは割愛します

# ブレンドスタイルを変更する
なんでも良いのでLight2Dをシーン上に置いて、インスペクタから`Blend Style`のプルダウンを確認すると、`Default`以外(Disabled)になっている
<img width="332" alt="スクリーンショット 2019-12-03 18.49.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/27128309-e6f1-24e4-f65c-27ccc151a1d3.png">

これは`2D Renderer`を選択して、インスペクタから`Default`以外のチェックを入れることで有効化される
<img width="502" alt="スクリーンショット 2019-12-03 19.49.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/9bd5bac4-58f7-370f-78e1-11a54676eb5e.png">

それぞれのブレンドスタイルの設定変更もここで行う
<img width="502" alt="スクリーンショット 2019-12-03 19.50.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/ea837029-dc78-59e5-adae-f67834af9b8f.png">

## Name
プルダウンに表示されるブレンドスタイルの名前を変更する
<img width="489" alt="スクリーンショット 2019-12-03 19.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/b17be8c6-1051-4abf-8c12-4f1751ec81b1.png">
<img width="475" alt="スクリーンショット 2019-12-03 19.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/f00d5776-14ba-0a52-12b9-a21b5ffcb085.png">

## Blend Mode
どのようなブレンドモードでライトを描画するかを選択する
（Photoshopのレイヤー効果に近いが、Light2DのIntensityを1以上にできるのでちょっと違う）

### Multiply
Photoshopでいうオーバーレイのような挙動
普通の2D向けライトはこれ
<img width="956" alt="スクリーンショット 2019-12-03 20.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/5b444e2a-2f52-01c8-b041-42f16236c815.png">

### Additive
描画された色に単純に加算するような挙動をする
<img width="955" alt="スクリーンショット 2019-12-03 20.39.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/578ccb5c-0423-310a-e18b-43679597557e.png">

Multiply（Global Light:白）と組み合わせて使うとこうなる
<img width="954" alt="スクリーンショット 2019-12-03 20.40.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/74dffb0f-4cbe-c620-639d-4038a08017d7.png">

### Subtractive
Photoshopでいう減算のような挙動
ライトのカラーが白に近いほど黒くなる
<img width="955" alt="スクリーンショット 2019-12-03 20.38.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/402430f1-9d80-59dd-6643-7be54d846583.png">

### Custom
MultiplyとAdditiveを好きなバランスで設定できる
<img width="464" alt="スクリーンショット 2019-12-03 19.57.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/5d38608b-c509-f8b4-4f5f-59bbf7bc6d86.png">

上記3つのブレンドモードはCustomで言うと以下の値に相当する

|ブレンドモード|Multiplicativeの値|Additiveの値|
|:-:|:-:|:-:|
|Multiply|1|0|
|Additive|0|1|
|Subtractive|0|-1|

## Mask Texture Channel
マスクテクスチャを使って、ライトがスプライトに作用する場所を指定する際に、
マスクテクスチャのどのカラーチャンネルを使ってマスクするかを指定する

### 適用例
今回はRをMask Texture Channelとして使用する
<img width="501" alt="スクリーンショット 2019-12-04 18.47.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/c0cc2e61-06ce-6383-ac12-74071a21220b.png">

ライトが当たって欲しい部分を赤、それ以外を黒で染めたマスクテクスチャを用意
![vr_cable_hikkakaru_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/8050b1bd-1f1d-d187-24c9-0101a01b7441.png)


元のスプライトのをSprite Editorで開いて、左上の`Secondary Texture`を開き、Textureに用意したマスクテクスチャをアタッチして、Nameを`_MaskTex`にする
<img width="201" alt="スクリーンショット 2019-12-04 18.40.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/e02e1ec9-6d23-8b43-2522-5edfae79a9b8.png"> <img width="285" alt="スクリーンショット 2019-12-04 18.41.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/83a249a0-b502-989c-07a1-baf3b52daafd.png">

マスクテクスチャを設定したスプライトと、Mask Texture Channelを設定したブレンドスタイルのLight2Dをシーン上に置いて確認してみると、ライトの適用される範囲をマスクテクスチャによって制限できている
<img width="927" alt="スクリーンショット 2019-12-04 18.56.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150404/c38692ca-6de1-b4a7-1ac9-5eb295dc9264.png">


## Render Texture Scale
[ドキュメント](https://docs.unity3d.com/Packages/com.unity.render-pipelines.lightweight@6.9/manual/LightBlendStyles.html)によると内部レンダリングテクスチャのサイズを調整する
レンダリングテクスチャスケールを下げるとパフォーマンスが向上するが、シーンに動きがあるとアーティファクトや揺らめきが発生するようになるらしい

# まとめ
ブレンドスタイルを弄って色々なライトを置くだけでリッチで幅広い2Dゲーム表現ができそうです
詳しく理解したい方は[マニュアル](https://docs.unity3d.com/Packages/com.unity.render-pipelines.lightweight@6.9/manual/2d-index.html)を読みましょう

# 参考
* [Lightweight RP | 6.9.2Manual2D in LWRP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.lightweight@6.9/manual/2d-index.html)
* [テラシュールブログ 【Unity】LWRPの2D向けライト機能を試してみる](http://tsubakit1.hateblo.jp/entry/2019/07/08/223020)