【Unity】忙しい人のためのURP新機能7個サクッとまとめ

本記事は [グレンジ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/grenge) への寄稿です。

# はじめに
UnityのUniversal Render Pipelineでは、最近多くの機能が追加されました。
新機能の把握は大変ですが、概要だけでも知っておくと後々役立ちます。
そこで本記事ではこれらの新機能のうち、主要なものの概要と使い方をまとめます。

# 目次
* [クリアコートマテリアル - Unity2020.3](#クリアコートマテリアル---unity20203)
* [リフレクションプローブのボックスリフレクション - Unity2021.2](#リフレクションプローブのボックスリフレクション---unity20212)
* [ライトクッキー - Unity2021.2](#ライトクッキー---unity20212)
* [デカール - Unity2021.2](#デカール---unity20212)
* [ライトレイヤー - Unity2021.2](#ライトレイヤー---unity20212)
* [デファードレンダリング - Unity2021.2](#デファードレンダリング---unity20212)
* [ポイントライトシャドウ - Unity2021.1](#ポイントライトシャドウ---unity20211)

# クリアコートマテリアル - Unity2020.3
クリアコートは、自動車の表面の塗装やニスの塗られた木材などを表現できるマテリアルです。
以下はクリアコートを有効にしていない状態と有効にした状態の比較です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/d8ba1fb9-4324-f0c6-b003-4942f5cd7786.png)
今までURPでは、標準的なPBRシェーダとしてLitシェーダが存在していました。
これとは別に追加されたComplex Litシェーダを適用するとこのようなマテリアルを作れます。

クリアコートマテリアルの使用手順は以下の通りです。

1. マテリアルを作成する
1. `Universal Render Pipeline > Complex Lit`シェーダをアサイン
1. Clear Coatにチェックを入れてMaskとSmoothnessを1にする
1. レンダラーにマテリアルをアサインする

# リフレクションプローブのボックスリフレクション - Unity2021.2
リフレクションプローブという機能を使うと、周りの風景が鏡のように映り込むオブジェクトを作ることができます。
しかしながらこの機能は、「比較的近くにある物体を」「床に反射させる」ようなケースではうまく映り込ませることができません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/1b97826c-330e-d717-bea3-fd6bd6df5f3f.png" width="600">
こんな時にボックスプロジェクションを使うと、ある程度いい感じに映り込ませることができるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/568ea80d-a977-85dd-0f77-b9d549f35c56.png" width="600">
なおボックスプロジェクションは、直方体で表現できる範囲で最も効果を発揮するため、四角い部屋の室内などがいい活用例になります。

リフレクションプローブのボックスプロジェクションは以下の手順で利用できます。

1. Universal Render Pipeline Asset > Lighting > Reflection Probes > Box Projectionにチェック
1. Reflection Probeを配置してBox Projectionにチェックを入れ、Box Sizeを調整
1. Reflection Probeをベイク

# ライトクッキー - Unity2021.2
ライトクッキーはテクスチャを使ってライトにマスクをかけられる機能です。
例えば以下のようなスポットライトがあったとします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/45a19eb6-6026-826f-cea6-13cb1d7acd0a.png" width="600">
これに以下のようなクッキーテクスチャを適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/512aad82-fce8-525f-9f29-fa45e8337cc3.png)
すると以下のようにライトがマスクされます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/8315faac-6626-83dc-408d-0b29009121ba.png" width="600">
また、スポットライトだけではなく、ポイントライトやディレクショナルライトにも適用できます。

ライトクッキーの使用方法は以下の通りです。

1. クッキー用のテクスチャのTexture TypeをCookieに設定しておく
1. ライトのInspectorから`Light Cookie > Cookie`に先程のテクスチャをアサインする

# デカール - Unity2021.2
デカールはオブジェクトのテクスチャを投影するための機能です。
物体にプロジェクターで画像を投影したような効果を得られます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/4c490d40-0e7b-a387-c39b-96d533b7e3db.png" width="600">
壁に当たった銃弾の弾痕を表現したりするのに使います。

デカールの使い方は以下の通りです。

1. Universal Render DataのAdd Renderer FeatureボタンからDecalを追加
1. マテリアルを作成して`Shader　Graph > Decal`をアサイン
1. Base Mapにテクスチャをアサイン
1. `GameObject > Rendering URP Decal Projector`からDecal Projectorを作成
1. Decal ProjectorのMaterialプロパティに先程のマテリアルをアサイン
1. Decal Projectorの位置を調整

# ライトレイヤー - Unity2021.2
ライトレイヤーは「**特定のオブジェクトにだけ影響するライトを作る**」機能です。
デフォルトでは以下のように赤と緑のライトを配置すると、各オブジェクトは両方のライトに照らされます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/252212c6-283a-0264-eb3b-a6691566424b.png" width="600">
ライトレイヤー機能を使うと、指定したライトを指定したレイヤーに所属するオブジェクトのみに適用できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/63b1fd51-532f-feb1-9b72-435a5d66c76c.png" width="600">
ライトレイヤーは以下の手順で利用できます。

1. Universal Render Pipeline AssetのLightingの右側にある省略記号のようなボタンを押下
1. Show Additional Propertiesを有効にする
1. Light Layersというチェックボックスが現れるのでこれにチェックを入れる
1. ポイントライトのInspectorの`General > Light Layer`からライトレイヤーを選択
1. Mesh Rendererの`Additional Settings > Rendering Layer Mask`に先程のライトレイヤーを設定

# デファードレンダリング - Unity2021.2
デファードレンダリングは、一度アルベドや法線などの中間情報をG-Bufferに書き込み、
最後にまとめてライティングの計算を行うレンダリング手法のことです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/404c98f2-453e-5f55-ec23-45ed9ff529aa.png" width="600">
この手法はフォワードレンダリングとは異なり、リアルタイムライトを多数配置することができます。
複雑なライティングを行いたいプロジェクトは採用するメリットがあります。
一方で半透明描画ができない（フォワードで描画される）などのデメリットもあるので注意が必要です。

設定方法は以下の通りです。

1. Universal Renderer DataのRendering PathをDeferredに切り替える

# ポイントライトシャドウ - Unity2021.1
Unity2021.1からはポイントライトからも影を落とせるようになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265501/70265fb4-f5c8-2ef2-bbe9-a470baf40597.png" width="600">

設定手順は以下の通りです。

1. `Universal Render Pipeline Asset`の`Lighting > Additional Lights` を`Per Pixel`にチェック
1. `Lighting > Additional Lights > Cast Shadows`にチェックを入れる
1. シーンにポイントライトを配置する
1. ポイントライトのInspectorの`Shadows > Shadow Type`をHard ShadowsやSoft Shadowsに切り替える

# 最後に
最後までお読みいただきありがとうございます。
今回紹介した機能の他にも、URPにはSSAOやレンズフレアなど、便利な機能が追加されています。
さらに今後も多数の機能追加が予定されているようで楽しみです。

また、今回僕はCyberAgent Developers Blogのアドベントカレンダーにも記事を書いてますので、
もしよろしければこちらもご覧ください。社内におけるシェーダ開発のお話です。

https://developers.cyberagent.co.jp/blog/archives/34009/

# 参考
https://portal.productboard.com/unity/1-unity-platform-rendering-visual-effects/tabs/3-universal-render-pipeline